方法一:使用EnumWindows的方式`
///< 枚舉視窗參數
typedef struct
{
HWND hwndWindow; // 視窗句柄
DWORD dwProcessID; // 程序ID
}EnumWindowsArg;
///< 枚舉視窗回調函數
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
DWORD dwProcessID = 0;
// 通過視窗句柄取得程序ID
::GetWindowThreadProcessId(hwnd, &dwProcessID);
if (dwProcessID == pArg->dwProcessID)
{
pArg->hwndWindow = hwnd;
// 找到了傳回FALSE
return FALSE;
}
// 沒找到,繼續找,傳回TRUE
return TRUE;
}
///< 通過程序ID擷取視窗句柄
HWND CProcessTimeRestart::GetWindowHwndByPID(DWORD dwProcessID)
{
HWND hwndRet = NULL;
EnumWindowsArg ewa;
ewa.dwProcessID = dwProcessID;
ewa.hwndWindow = NULL;
EnumWindows(EnumWindowsProc, (LPARAM)&ewa);
if (ewa.hwndWindow)
{
hwndRet = ewa.hwndWindow;
}
return hwndRet;
}
方法二:使用GetTopWindow和GetNextWindow的方式
///< 枚舉視窗參數
typedef struct
{
HWND hwndWindow; // 視窗句柄
DWORD dwProcessID; // 程序ID
}EnumWindowsArg;
///< 枚舉視窗回調函數
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
DWORD dwProcessID = 0;
// 通過視窗句柄取得程序ID
::GetWindowThreadProcessId(hwnd, &dwProcessID);
if (dwProcessID == pArg->dwProcessID)
{
pArg->hwndWindow = hwnd;
// 找到了傳回FALSE
return FALSE;
}
// 沒找到,繼續找,傳回TRUE
return TRUE;
}
///< 通過程序ID擷取視窗句柄
HWND CProcessTimeRestart::GetWindowHwndByPID(DWORD dwProcessID)
{
HWND hwndRet = NULL;
EnumWindowsArg ewa;
ewa.dwProcessID = dwProcessID;
ewa.hwndWindow = NULL;
EnumWindows(EnumWindowsProc, (LPARAM)&ewa);
if (ewa.hwndWindow)
{
hwndRet = ewa.hwndWindow;
}
return hwndRet;
}
通過以上兩種視窗獲得的句柄,和使用FindWindow獲得的句柄是一樣的。
可以通過SendMessage向視窗發送消息
HWND hwnd = ::FindWindow(NULL, "Test");
::SendMessage(hwnd, WM_CLOSE, 0, 0);