需求:後台程序監聽 IE 當前活動標籤頁,若匹配特定 URL 彈窗填表。核心難點:IE 多標籤共用一個主窗口句柄,需定位當前顯示的 Internet Explorer_Server 子窗口。
GetForegroundWindow() 取得當前活動 IE 主窗口 (IEFrame 類別)。EnumChildWindows 遞歸查找類別為 Internet Explorer_Server 的窗口 (每個標籤頁對應一個)。IsWindowVisible(hwnd) 過濾隱藏的背景標籤頁。Internet Explorer_Server 發送 WM_HTML_GETOBJECT 獲取 IHTMLDocument2,再 QueryInterface 得到 IWebBrowser2,讀取 LocationURL。HWND hIE = GetForegroundWindow();
if (hIE && GetClassName(hIE) == "IEFrame") {
EnumChildWindows(hIE, [](HWND hwnd, LPARAM lParam) {
TCHAR cls[256];
GetClassName(hwnd, cls, 256);
if (_tcscmp(cls, _T("Internet Explorer_Server")) == 0 && IsWindowVisible(hwnd)) {
*(HWND*)lParam = hwnd;
return FALSE; // 停止枚舉
}
return TRUE;
}, (LPARAM)&hServer);
if (hServer) {
// 發送 WM_HTML_GETOBJECT 獲取文檔接口...
}
}
SetWinEventHook(EVENT_OBJECT_FOCUS, ...) 監聽焦點變化。使用 Spy++ 或 Inspect.exe (Windows SDK) 觀察 IE 窗口層級結構,確認類別名與可見性邏輯。
GetForegroundWindow + EnumChildWindows 過濾 Internet Explorer_Server + IsWindowVisible 是獲取當前活動標籤頁最可靠的用戶態方案。