2012-02-27 8 views
4

좋아요, 이름으로 창을 찾는 데 많은 게시물을 찾았습니다. 찾지 못했던 것은 마지막 활성 창으로 창 응용 프로그램 포커스를 찾아 전환하는 방법입니다. 아래에 표시된 코드는 활성 상태 인 작업 관리자의 활성 응용 프로그램 목록을 제공합니다.Alt-Tab과 같은 마지막 활성 응용 프로그램으로 전환합니다.

어떻게해야하는지 알 수없는 것은 마지막으로 활성화 된 응용 프로그램이 무엇인지 파악한 다음 전환하는 것입니다. 예를 들면 ...

내 사용자 지정 winform 응용 프로그램을 엽니 다.

나는 마지막 활성 창/응용 프로그램에 버튼

내 응용 프로그램 전환을 클릭합니다.

내가 지금까지 가지고있는 작업 코드는 다음과 같습니다. . (이 버튼에 액션이이며, 응용 프로그램이 TextBox1에라는 이름의 텍스트 상자를 가지고 것으로 기대 당신은 또한 System.Diagnostics 네임을 사용하여 추가해야합니다;

private void button1_Click(object sender, EventArgs e) 
    { 

     Process[] procs = Process.GetProcesses(); 
     IntPtr hWnd; 
     foreach (Process proc in procs) 
     { 
      if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero) 
      { 
       textBox1.Text += (proc.ProcessName.ToString()); 
       textBox1.Text += "\t"; 
       textBox1.Text += (hWnd.ToString()); 
       textBox1.Text += "\r\n"; 
      } 
     }   

    } 
+0

http://stackoverflow.com/questions/210504/enumerate-windows-like-alt-tab-does – vulkanino

+0

나는 이것을 이미 보았다. 그것은 나를 위해 작동하지 않습니다. HWND에는 어떤 수업이 있나요? System.Windows.Interop이없는 것 같아 System.Runtime.InteropServices하지만이 클래스에는없는 것 같습니다. –

+0

HWND는 Windows SDK에서 제공되며 창 핸들을 나타냅니다. – vulkanino

답변

1

내 의견이 도움이되지 않았기 때문에이 여기에 약간의 이력서입니다 (하지만 그것을 테스트하지 않았다) :

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsWindowVisible(IntPtr hWnd); 

[DllImport("user32.dll")] 
static extern IntPtr GetLastActivePopup(IntPtr hWnd); 

[DllImport("user32.dll", ExactSpelling = true)] 
static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

const uint GA_PARENT = 1; 
const uint GA_ROOT = 2; 
const uint GA_ROOTOWNER = 3; 

public IntPtr GetPreviousWindow() 
{ 
     IntPtr activeAppWindow = GetForegroundWindow(); 
     if (activeAppWindow == IntPtr.Zero) 
      return IntPtr.Zero; 

     IntPtr prevAppWindow = GetLastActivePopup(activeAppWindow); 
     return IsWindowVisible(prevAppWindow) ? prevAppWindow : IntPtr.Zero; 
} 

public void FocusToPreviousWindow() 
{ 
    IntPtr prevWindow = GetPreviousWindow(); 
    if ( prevWindow != IntPtr.Zero) 
     SetForegroundWindow(prevWindow); 
} 
+0

감사합니다 Vulkanino, 주요 문제는 정말 DLLImport 여러 번 사용하지 않은 및 완전히 코드를 이해하지 않습니다. 내가 추가 한 코드를보고 있는데, 제대로 이해하면 GetPreviousWindow를 사용하여 마지막 활성 창의 hwnd를 반환합니다. 하지만 MessageBox.Show (GetPreviousWindow())를 추가하면; 단추 동작으로 그것은 GetPreviousWindow가 hwnd의 IntPtr을 기대한다고 알려줍니다. 나는 그것이 나를 위해 무엇을 찾고 있는지 생각했다. –

+0

죄송합니다. 제 실수입니다. 매개 변수가 쓸모가 없습니다. 올바른 답을 편집합니다. – vulkanino

+0

괜찮 았어. 그래서이 코드를 버튼 액션에 넣으면이 코드는 핸들을 반환하거나 버튼이 앉아있는 애플리케이션에 대해 무엇을 호출 할까? (이전 응용 프로그램을 호출하지 않는다는 의미입니다) –

5

확인이 문서를 : 특히 http://www.whitebyte.info/programming/how-to-get-main-window-handle-of-the-last-active-window

이 코드 :

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd); 
enum GetWindow_Cmd : uint 
{ 
    GW_HWNDFIRST = 0, 
    GW_HWNDLAST = 1, 
    GW_HWNDNEXT = 2, 
    GW_HWNDPREV = 3, 
    GW_OWNER = 4, 
    GW_CHILD = 5, 
    GW_ENABLEDPOPUP = 6 
} 
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 
public static extern IntPtr GetParent(IntPtr hWnd); 
[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

[...] 

IntPtr targetHwnd = GetWindow(Process.GetCurrentProcess().MainWindowHandle, (uint)GetWindow_Cmd.GW_HWNDNEXT); 
while (true) 
{ 
    IntPtr temp = GetParent(targetHwnd); 
    if (temp.Equals(IntPtr.Zero)) break; 
    targetHwnd = temp; 
} 
SetForegroundWindow(targetHwnd); 
+0

정확히 내가하려는 일을합니다. –

+0

흥미로운 메모. 이 코드는 내 테스트 창 양식 응용 프로그램에서 작동하지만 내가 이전 응용 프로그램으로 전환하지 않는 함께 놀고있는 작은 유틸리티에 넣을 때. 그것은 마치 보이는 프로세스 인 애플리케이션으로 전환합니다. –