프로세스 ID를 알고있는 경우 어떻게 응용 프로그램의 HWND를 가져올 수 있습니까? 누구든지 샘플을 게시 할 수 있습니까? MSV C++ 2010을 사용하고 있습니다. Process :: MainWindowHandle을 찾았지만 사용 방법을 모르겠습니다.프로세스 ID로 hwnd 가져 오기 C++
답변
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);
이것은 치즈처럼 나를 위해 일합니다. – Nadun
'PID'는이 방법을 호출하는 프로세스와 동일한 데스크탑 (또는 대화 형 사용자/로그온 세션)에 속해야한다는 것을 지적해야합니다. 그렇지 않으면'EnumWindows'는 윈도우 핸들을 열거하지 않습니다. 예를 들어 서비스에서이 메서드를 사용할 수 없거나 해당 프로세스가 로그온 한 다른 사용자 계정으로 실행되거나 워크 스테이션이 잠겨있는 경우 화면 보호기에 대한 HWND를 검색 할 수 없습니다. – c00000fd
이 코드를 무료 파스칼과 나를 위해 치즈처럼 작동합니다 :) – Jako
이 MSDN article에서 설명한 EnumWindows 및 GetWindowThreadProcessId() 함수를 사용할 수 있습니다.
단일 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);
}
프로세스는 1 개의 창으로 제한되지 않습니다. – chris
프로세스는 여러 개의 창을 가질 수 있으며 여러 hwnd가 있습니다. –
그래서 maby는 모든 HWND를 가져 와서 이것을 선택할 수 있습니까?이 프로세스 ID는 있습니까? – Luke