首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

實時獲取 IE 活動標籤頁句柄:GetForegroundWindow + 枚舉子窗口

     編輯:程式設計綜合問答

需求:後台程序監聽 IE 當前活動標籤頁,若匹配特定 URL 彈窗填表。核心難點:IE 多標籤共用一個主窗口句柄,需定位當前顯示的 Internet Explorer_Server 子窗口。

可行方案

  1. 獲取前台窗口:GetForegroundWindow() 取得當前活動 IE 主窗口 (IEFrame 類別)。
  2. 枚舉子窗口:EnumChildWindows 遞歸查找類別為 Internet Explorer_Server 的窗口 (每個標籤頁對應一個)。
  3. 判斷可見性:IsWindowVisible(hwnd) 過濾隱藏的背景標籤頁。
  4. 獲取 IWebBrowser2:對可見的 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, ...) 監聽焦點變化。
  • IE 保護模式 (Protected Mode) 會阻止跨進程鉤子,需關閉保護模式或以相同完整性級別運行。

工具驗證

使用 Spy++ 或 Inspect.exe (Windows SDK) 觀察 IE 窗口層級結構,確認類別名與可見性邏輯。

總結

GetForegroundWindow + EnumChildWindows 過濾 Internet Explorer_Server + IsWindowVisible 是獲取當前活動標籤頁最可靠的用戶態方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved