我现在找到的办法是:
1、列出所有顶级窗口;
2、对每个窗口使用GetWindowThreadProcessID函数列出其所属的进程和线程
3、排除非指定进程的窗口和窗口所属线程。以上办法感觉不好,顺序是反的,而且不能列出全部线程,那位知道正规办法的请帮帮忙,不胜感激。
1、列出所有顶级窗口;
2、对每个窗口使用GetWindowThreadProcessID函数列出其所属的进程和线程
3、排除非指定进程的窗口和窗口所属线程。以上办法感觉不好,顺序是反的,而且不能列出全部线程,那位知道正规办法的请帮帮忙,不胜感激。
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwID);
Thread32First(hThreadSnap, &ThreadEntry32);
Thread32Next(hThreadSnap, &ThreadEntry32);
static HWND HbtWnd; switch(uMsg){
case WM_CREATE:
HbtWnd = CreateWindow(TEXT("button"),"EnumWindow",WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,0,0,100,30,hWnd,NULL,hInst,NULL);
return 0;
case WM_COMMAND:
if((HWND)lParam == HbtWnd){
EnumWindows((WNDENUMPROC)EnumWindowsProc,0);
return 0;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, DWORD lParam)
{
LRESULT lResult;
char lpWindowName[256];
lResult = ::GetWindowText(hwnd,lpWindowName,255);
if( lResult )
{
MessageBox(NULL,lpWindowName,"EnumWin",MB_OK);
}
return TRUE;
}
然后通过 EnumThreadWindows 来获得每个线程的所有窗口.如果这个方法不行,我觉得也可以使用你自己说的方法.