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

C/C++ 與第三方應用進程間通信:Windows API 實現自動輸入

     編輯:程式設計疑難解答

需求場景

C/C++ 控制台程序生成字符串,需自動輸入到第三方應用(如瀏覽器地址欄、輸入框)中。

核心技術:Windows API 模擬輸入

方案一:發送消息(適用於標準編輯控件)

#include 
#include 

// 1. 找到目標窗口句柄
HWND hWnd = FindWindow(NULL, L"窗口標題"); // 或 FindWindowEx 逐級查找
// 使用 Spy++ 工具獲取精確類名/標題

// 2. 發送字符串(逐字符發送 WM_CHAR 或整條發送 WM_SETTEXT)
// 方法 A:設置文本(直接替換內容)
SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)L"要輸入的字符串");

// 方法 B:模擬鍵盤輸入(逐字符,觸發按鍵事件)
for (wchar_t c : L"字符串") {
    PostMessage(hWnd, WM_CHAR, c, 0);
    Sleep(10); // 適當延遲
}

方案二:鍵盤鉤子/模擬全局輸入(通用性更強)

// 使用 SendInput 模擬真實鍵盤事件
INPUT inputs[2] = {};
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = 0; // 虛擬鍵碼
inputs[0].ki.wScan = c; // 掃描碼
inputs[0].ki.dwFlags = KEYEVENTF_UNICODE;

inputs[1] = inputs[0];
inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP;

SendInput(2, inputs, sizeof(INPUT));

方案三:UI Automation(現代、支持 WPF/Chrome 等)

// 需引用 UIAutomationClient.dll
AutomationElement root = AutomationElement.RootElement;
AutomationElement target = root.FindFirst(TreeScope.Descendants,
    new PropertyCondition(AutomationElement.NameProperty, "地址欄"));
ValuePattern pattern = (ValuePattern)target.GetCurrentPattern(ValuePattern.Pattern);
pattern.SetValue("https://example.com");

關鍵工具:Spy++ (Visual Studio 自帶)

    1. VS 菜單 → Tools → Spy++ 2. Search → Find Window → 拖動瞄準器到目標控件 3. 記錄:Window Handle (句柄)、Class Name、Window Text、Control ID 4. 代碼中用 FindWindowEx(parent, NULL, className, NULL) 逐級定位

學習路徑建議

  1. Windows 核心編程:消息機制、窗口子類化、鉤子。
  2. 《Windows 核心編程》(Jeffrey Richter) / 《Windows 程序設計》(Charles Petzold)。
  3. 實踐:編寫簡單自動填表工具、遊戲輔助腳本(僅學習用途)。
  4. 進階:UI Automation、Accessibility (MSAA)、IAccessible2。

注意事項

  • 目標應用若有安全防護(如瀏覽器沙箱、遊戲反作弊),SendMessage/PostMessage 可能被攔截。
  • 需管理員權限運行發送程序才能向高完整性級別進程發送消息。
  • 跨進程操作屬於灰色地帶,請遵守軟件許可協議與法律法規。

掌握 FindWindow + SendMessage/WM_SETTEXT 或 SendInput 是實現 C/C++ 向第三方應用自動輸入的基礎路徑。

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