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

ActiveX 控件獲取窗口句柄並發送鍵盤消息:在方法實現中調用 FindWindow/PostMessage,位置任意由向導生成

     編輯:程式設計綜合問答

開發 ActiveX(ATL/COM/VB6/C# COM Interop)時,添加方法 `ActivateAndSendKeys`,向導生成存根,在存根內填業務代碼即可。

ATL C++ 實現骨架

// MyActiveXCtrl.h
public:
    STDMETHOD(ActivateAndSendKeys)(BSTR windowTitle, BSTR keys);

// MyActiveXCtrl.cpp
STDMETHODIMP CMyActiveXCtrl::ActivateAndSendKeys(BSTR windowTitle, BSTR keys) {
    USES_CONVERSION;
    HWND hWnd = FindWindow(NULL, OLE2CT(windowTitle));
    if (!hWnd) return E_FAIL;
    
    SetForegroundWindow(hWnd); // 激活
    Sleep(50); // 等待激活完成
    
    // 發送字符串(逐字符 PostMessage WM_CHAR)
    for (int i = 0; i < SysStringLen(keys); ++i) {
        PostMessage(hWnd, WM_CHAR, keys[i], 0);
    }
    return S_OK;
}

C# COM 可見組件

[ComVisible(true), Guid("...")]
public class MyActiveX {
    public void ActivateAndSendKeys(string windowTitle, string keys) {
        IntPtr hWnd = FindWindow(null, windowTitle);
        if (hWnd == IntPtr.Zero) throw new Exception("Window not found");
        SetForegroundWindow(hWnd);
        Thread.Sleep(50);
        foreach (char c in keys) PostMessage(hWnd, WM_CHAR, (IntPtr)c, IntPtr.Zero);
    }
    // P/Invoke 簽名...
}

註冊與調用

  • 編譯 → `regasm /tlb /codebase MyActiveX.dll`(C#)或 `regsvr32 MyActiveX.ocx`(C++)。
  • 網頁/HTA/VBA/其他容器調用:
    `obj.ActivateAndSendKeys("記事本", "Hello World")`

**方法位置無謂**,向導生成的空方法體在哪裡就在哪裡填代碼即可。

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