開發 ActiveX(ATL/COM/VB6/C# COM Interop)時,添加方法 `ActivateAndSendKeys`,向導生成存根,在存根內填業務代碼即可。
// 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;
}
[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 簽名...
}
**方法位置無謂**,向導生成的空方法體在哪裡就在哪裡填代碼即可。