2012-07-29 4 views
7

프로세스 ID를 알고있는 경우 어떻게 응용 프로그램의 HWND를 가져올 수 있습니까? 누구든지 샘플을 게시 할 수 있습니까? MSV C++ 2010을 사용하고 있습니다. Process :: MainWindowHandle을 찾았지만 사용 방법을 모르겠습니다.프로세스 ID로 hwnd 가져 오기 C++

+1

프로세스는 1 개의 창으로 제한되지 않습니다. – chris

+1

프로세스는 여러 개의 창을 가질 수 있으며 여러 hwnd가 있습니다. –

+0

그래서 maby는 모든 HWND를 가져 와서 이것을 선택할 수 있습니까?이 프로세스 ID는 있습니까? – Luke

답변

16
HWND g_HWND=NULL; 
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam) 
{ 
    DWORD lpdwProcessId; 
    GetWindowThreadProcessId(hwnd,&lpdwProcessId); 
    if(lpdwProcessId==lParam) 
    { 
     g_HWND=hwnd; 
     return FALSE; 
    } 
    return TRUE; 
} 
EnumWindows(EnumWindowsProcMy,m_ProcessId); 
+1

이것은 치즈처럼 나를 위해 일합니다. – Nadun

+1

'PID'는이 방법을 호출하는 프로세스와 동일한 데스크탑 (또는 대화 형 사용자/로그온 세션)에 속해야한다는 것을 지적해야합니다. 그렇지 않으면'EnumWindows'는 윈도우 핸들을 열거하지 않습니다. 예를 들어 서비스에서이 메서드를 사용할 수 없거나 해당 프로세스가 로그온 한 다른 사용자 계정으로 실행되거나 워크 스테이션이 잠겨있는 경우 화면 보호기에 대한 HWND를 검색 할 수 없습니다. – c00000fd

+0

이 코드를 무료 파스칼과 나를 위해 치즈처럼 작동합니다 :) – Jako

0

단일 PID (프로세스 ID)는 둘 이상의 창 (HWND)과 연관 될 수 있습니다. 예를 들어 응용 프로그램이 여러 개의 창을 사용하는 경우입니다.
다음 코드는 주어진 PID에 대한 모든 창 핸들을 찾습니다.

void GetAllWindowsFromProcessID(DWORD dwProcessID, std::vector <HWND> &vhWnds) 
{ 
    // find all hWnds (vhWnds) associated with a process id (dwProcessID) 
    HWND hCurWnd = NULL; 
    do 
    { 
     hCurWnd = FindWindowEx(NULL, hCurWnd, NULL, NULL); 
     DWORD dwProcessID = 0; 
     GetWindowThreadProcessId(hCurWnd, &dwProcessID); 
     if (dwProcessID == dwProcessID) 
     { 
      vhWnds.push_back(hCurWnd); // add the found hCurWnd to the vector 
      wprintf(L"Found hWnd %d\n", hCurWnd); 
     } 
    } 
    while (hCurWnd != NULL); 
}