关键系统函数:
(一)BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, //回调函数指针
LPARAM lParam //传递给回调函数的参数
);
typedef BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam);
该函数枚举所有顶层窗口。如果lpEnumFunc返回值为FALSE,则中止枚举。
如果函数成功,返回值为非零;如果函数失败,返回值为零
(二)
DWORD GetWindowThreadProcessId(
HWND hWnd, // 窗口句柄
LPDWORD lpdwProcessId //【OUT】指向进程ID变量的地址。
);
获取创建窗口的进程ID,返回值为创建窗口的线程ID
代码实现:
typedef struct EnumFunArg
{
HWND hWnd;
DWORD dwProcessId;
}EnumFunArg;
BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
{
EnumFunArg *pArg = lParam;
DWORD processId;
GetWindowThreadProcessId(wnd, &ProcessId);
if( processId == pArg->dwProcessId )
{
arg->hWnd = hwnd;
return TRUE;
}
return FALSE;
}
HWND myGetWindowByProcessId( DWORD dwProcessId )
{
lEnumFunArg arg;
arg.dwProcessId = dwProcessId;
arg.hWnd = 0;
EnumWindows(lpEnumFunc, (LPARAM)&arg );
return arg.hWnd;
}
注意:
一个进程可能创建多个窗口,比如,在程序里使用MessageBox.