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

Delphi 使用 SendKeys 實現跨進程按鍵模擬:從獲取組件到 Word 自動化實戰

     編輯:Delphi

SendKeys 來源與部署

Delphi 未內置 SendKeys,但安裝盤 \Info\Extras\SendKeys\SndKey32.pas 提供了完整實現。部署步驟:

  1. 複製 SndKey32.pas 到 Delphi \Lib 目錄 (或項目目錄)。
  2. 在 uses 子句添加 SndKey32。
  3. 即可調用 SendKeys、AppActivate。

核心函數簽名

function SendKeys(KeyString: PChar; Wait: Boolean): Boolean;
function AppActivate(WindowName: PChar): Boolean;
  • SendKeys:向當前活動窗口/控件發送按鍵序列。Wait=True 同步等待處理完畢,通常用 False 異步。
  • AppActivate:按窗口標題激活窗口 (置前並獲取焦點),成功返回 True。

按鍵字符串語法 (兼容 VB SendKeys)

語法含義示例
普通字符直接發送'abcdefg'
+Shift 組合'+a' = Shift+A;'+(abc)' = Shift 按住輸入 abc
^Ctrl 組合'^c' = Ctrl+C;'^(c)' = Ctrl 按住輸入 c
%Alt 組合'%{F4}' = Alt+F4 (關閉窗口)
{KEY}特殊鍵 (大寫){ENTER}, {TAB}, {UP}, {F1}...{F12}, {DEL}, {HOME}, {END}, {PGUP}, {PGDN}
{{} / {}}發送字面大括號'{{}' 發送 {
{KEY n}重複 n 次'{LEFT 5}' 發送 5 次左鍵

實戰 1:程序內控件間文本傳遞

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.SetFocus;                 // 目標控件獲取焦點
  SendKeys(PChar(Edit1.Text), False); // 發送源控件文本
end;

適用於 TEdit, TMemo, TRichEdit 等標準編輯控件。

實戰 2:自動化 Microsoft Word

function SetFocusToWord: Boolean;
begin
  Result := AppActivate('文檔 1 - Microsoft Word'); // 標題需精確匹配
  if not Result then MessageDlg('未找到 Word 窗口!', mtError, [mbOk], 0);
end;

procedure ReturnFocusToDelphi;
begin
  AppActivate('SendToWord'); // Delphi 程序自身標題
  Form1.SetFocus; Form1.Edit1.SetFocus;
end;

procedure TForm1.Button1Click(Sender: TObject); // 發送文本到 Word
begin
  if not SetFocusToWord then Exit;
  SendKeys(PChar(Edit1.Text), False);
  ReturnFocusToDelphi;
end;

procedure TForm1.Button2Click(Sender: TObject); // 關閉 Word
begin
  if not SetFocusToWord then Exit;
  SendKeys('%{F4}', False); // Alt+F4
  ReturnFocusToDelphi;
end;

進階技巧與注意事項

  1. 窗口標題匹配:AppActivate 匹配標題前綴。Word 標題隨文檔名變化,建議用 FindWindow/EnumWindows 獲取精確句柄,再用 SetForegroundWindow 激活,比 AppActivate 可靠。
  2. 焦點搶奪:SendKeys 發送給當前前台線程的活動窗口。多線程/管理員權限/UAC 可能導致焦點切換失敗。
  3. 同步問題:Wait=True 會阻塞調用線程直到目標應用處理完消息隊列。長操作慎用。
  4. Unicode 支持:SndKey32.pas 內部用 keybd_event/SendInput 模擬虛擬鍵碼。Delphi 2009+ 字符串為 Unicode,需確保傳遞的 PChar 指向的字符在當前系統代碼頁可表示,或改用 SendInput 發送 Unicode 字符 (需修改源碼)。
  5. 安全性:殺毒軟件可能攔截全局鍵盤模擬。數字簽名 EXE 可減少誤報。
  6. 替代方案:Office 自動化 (TWordApplication / CreateOleObject('Word.Application')) 更穩健、功能豐富 (操作文檔對象模型),SendKeys 僅作為無 COM 接口、或需模擬用戶真實輸入 (如遊戲、加密控件) 的補充。

總結

SendKeys 是 Delphi 實現低級別按鍵模擬的利器,配合 AppActivate 可跨進程自動化無 COM 接口的應用。但其本質是「盲打」,脆弱性高。現代開發優先選擇 UI Automation (UIA)、COM 自動化、或原生 API 發送消息 (PostMessage/SendMessage) 給目標控件句柄,更精準可控。

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