【发布时间】:2013-06-30 03:38:04
【问题描述】:
基本上,我想将进程 ID 转换为 HWND。我正在使用此代码:
DWORD dwWindowId;
CHAR pszClassName[200];
HWND hWnd;
hWnd = GetTopWindow (NULL);
while ( hWnd != NULL )
{
if ( GetClassName (hWnd, pszClassName, 200) > 0)
if ( lstrcmpiA (lpcszWindowClass, pszClassName) == 0)
if ( GetWindowThreadProcessId (hWnd, &dwWindowId) )
if ( dwWindowId == dwProcessId )
return hWnd;
hWnd = GetNextWindow ( hWnd, GW_HWNDNEXT );
}
return NULL;
在我尝试使用由CreateProcess 创建的进程之前,这一直很好。在这种情况下我该怎么办?我有来自CreateProcess 的进程信息,例如它的ID 和线程ID,但我仍然不知道如何获取它的hwnd。我确实读过这个:
致电
CreateProcess()后,检查PROCESS_INFORMATIONlpProcessInformation 参数指向的结构。PROCESS_INFORMATION包含您刚刚处理的进程的句柄 开始和线程 ID。有了这些信息,请致电GetGUIThreadInfo()function 然后检查GUITHREADINFOlpgui 指向的结构。GUITHREADINFO有几个 HWND。开始 使用 hwndActive,并调用GetParent()或GetAncestor()直到 找到主窗口。通过 bug_crusher
我尝试了EnumChildWindows() 和EnumWindows(),但它们都不起作用。
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD PID =0;
GetWindowThreadProcessId(hwnd,&PID);
if(PID == 1)
{
//,,,,,,,,
}
return TRUE;
}
但我不明白,谁能解释一下?
【问题讨论】:
-
一个进程可以没有、一个或多个窗口,没有所谓的“进程的 hwnd”。
EnumWindows并为每个人致电GetWindowThreadProcessId。 -
它不起作用,即使使用 EnumWindows()
-
什么不起作用?您需要更具体地说明您尝试过的内容、预期的结果以及观察到的结果。
-
if(PID == 1) 我可以得到任何 hwnd,除了由 createprocess 创建的那个,我不知道为什么///
-
CreateProcess 不创建窗口,它创建进程。