2009-08-11 3 views

답변

0

응용 프로그램 창을 만들기 전에 GetForegroundWindow를 호출하십시오. 그렇지 않으면 GetWindow (your_hwnd, GW_HWNDNEXT)를 호출하여 지정된 창 아래의 다음 창을 찾습니다.

+0

이전 창이 닫힌 경우이 예를 들어, 작동하지 않습니다 상황이 있다는 것을 알고 있어야합니다. – JBRWilkinson

1

동일한 것을 찾고 있습니다. 화면에 열린 상태로 유지되는 응용 프로그램을 가지고 있으며 사용자가 세 개의 타사 응용 프로그램 중 하나에 항목을 입력하면 사용자가 내 응용 프로그램에서 단추를 호출 할 수 있습니다.

내 앱에서 버튼을 클릭하면 대화 할 데이터베이스를 파악하기 위해 마지막으로 사용한 세 가지 애플리케이션을 결정해야합니다. GetForeGroundWindow와 GetWindow를 보았지만 GetWindow에서 얻은 창 핸들은 항상 제목이 M 인 창을 참조합니다. 관리되는 Windows API 도구에서 Winternal Explorer 도구를 사용했고 M 핸들을 찾을 수 있습니다. 반환 된 및 그 후 프로세스의 '자식'-하지만이 핸들에서 나는 프로세스 이름을 얻을 수 없습니다.

간단한 Windows 양식을 사용하여 간단한 예제 응용 프로그램을 만들었습니다. 그리고 저는 그것을 비웃었고 메모장에 집중 한 다음 내 단추를 클릭하고 핸들을 얻었습니다. 그러나 모든 프로세스의 MainWindowHandle을 보면, 그것은 나열되어 있지 않지만 Wintern Explorer를 사용하면 메모장 프로세스의 하위 프로세스임을 알 수 있습니다.

실제 프로세스 핸들 대신이 서브 프로세스 핸들 만 반환하는 이유에 대한 제안 사항은 무엇입니까 ??

샘플 코드는 다음과 같습니다 - 윈도우 XP SP 3 시스템에서 실행되는

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace TestWindowsAPI 
{ 
    public partial class Form1 : Form 
    { 
     [DllImport("user32.dll")] 
     public static extern IntPtr GetForegroundWindow(); 

     [DllImport("user32.dll", SetLastError = true)] 
     static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      IntPtr thisWindow = GetForegroundWindow(); 
      IntPtr lastWindow = GetWindow(thisWindow, 2); 

      tbThisWindow.Text = thisWindow.ToString(); 
      tbLastWindow.Text = lastWindow.ToString(); 
     } 
    } 
} 
+0

WIN32 Windows Hook을 사용하는 경우 타사 응용 프로그램에서 작업 할 때 코드가 자동으로 호출 될 수 있습니다. 자세한 내용은이 도움말을 참조하십시오. http://support.microsoft.com/kb/318804 – JBRWilkinson

관련 문제