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

ActiveX 控件獲取視窗句柄並發送鍵盤訊息的實作指南

     編輯:程式設計綜合問答

需求背景

在 ActiveX 控件中定義方法,需取得目標 Windows 進程的視窗句柄(HWND),將其激活並發送鍵盤訊息(如模擬輸入)。適用於自動化測試、跨進程互動等場景。

核心 API 與流程

  1. 尋找目標視窗: FindWindow、FindWindowEx、EnumWindows + 回呼函數篩選(依類別名、標題、PID)。
  2. 激活視窗: SetForegroundWindow、BringWindowToTop、ShowWindow (SW_RESTORE)。注意:前台鎖定機制可能阻攔,需配合 AllowSetForegroundWindow 或 AttachThreadInput。
  3. 發送鍵盤訊息:
    • PostMessage(hwnd, WM_KEYDOWN, VK_..., 0) / WM_KEYUP — 非阻塞,投遞到訊息佇列。
    • SendMessage — 同步阻塞,較少用於鍵盤模擬。
    • SendInput (Windows 2000+) — 更底層、更真實,繞過訊息佇列直接注入輸入流,推薦用於現代系統。

實作範例 (ATL/COM)

// IDL 定義
[id(1)] HRESULT SendKeysToWindow([in] BSTR bstrWindowTitle, [in] BSTR bstrKeys);

// CPP 實作
STDMETHODIMP CMyCtrl::SendKeysToWindow(BSTR bstrWindowTitle, BSTR bstrKeys)
{
    USES_CONVERSION;
    HWND hTarget = FindWindow(NULL, OLE2CT(bstrWindowTitle));
    if (!hTarget) return HRESULT_FROM_WIN32(GetLastError());

    // 激活視窗 (簡化版,生產環境需處理前台鎖定)
    SetForegroundWindow(hTarget);
    Sleep(50); // 等待激活完成

    // 解析 bstrKeys 並逐字發送 (此處略,需處理修飾鍵、組合鍵)
    // 建議使用 SendInput 配合 KEYBDINPUT 結構陣列
    return S_OK;
}

常見坑點與解決

  • 權限不足 (UIPI): 低完整性進程無法向高完整性視窗發送訊息。解決:控件簽名提權、或透過中介 Broker 進程(Medium IL)轉發。
  • 視窗未就緒: FindWindow 返回後視窗可能仍在載入。建議輪詢 IsWindowVisible、IsWindowEnabled 或等待特定子控件出現。
  • 焦點丟失: 發送鍵盤訊息前,確保目標視窗擁有鍵盤焦點 (SetFocus),否則訊息可能被系統忽略。

替代方案

若非必須用 ActiveX,建議改用 UI Automation (UIA)、Windows App SDK 或 Python + pywinauto 等現代自動化框架,穩定性與維護性遠優於手工訊息發送。

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