Delphi 未內置 SendKeys,但安裝盤 \Info\Extras\SendKeys\SndKey32.pas 提供了完整實現。部署步驟:
SndKey32.pas 到 Delphi \Lib 目錄 (或項目目錄)。uses 子句添加 SndKey32。SendKeys、AppActivate。function SendKeys(KeyString: PChar; Wait: Boolean): Boolean;
function AppActivate(WindowName: PChar): Boolean;
SendKeys:向當前活動窗口/控件發送按鍵序列。Wait=True 同步等待處理完畢,通常用 False 異步。AppActivate:按窗口標題激活窗口 (置前並獲取焦點),成功返回 True。| 語法 | 含義 | 示例 |
|---|---|---|
| 普通字符 | 直接發送 | '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 次左鍵 |
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.SetFocus; // 目標控件獲取焦點
SendKeys(PChar(Edit1.Text), False); // 發送源控件文本
end;
適用於 TEdit, TMemo, TRichEdit 等標準編輯控件。
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;
AppActivate 匹配標題前綴。Word 標題隨文檔名變化,建議用 FindWindow/EnumWindows 獲取精確句柄,再用 SetForegroundWindow 激活,比 AppActivate 可靠。SendKeys 發送給當前前台線程的活動窗口。多線程/管理員權限/UAC 可能導致焦點切換失敗。Wait=True 會阻塞調用線程直到目標應用處理完消息隊列。長操作慎用。SndKey32.pas 內部用 keybd_event/SendInput 模擬虛擬鍵碼。Delphi 2009+ 字符串為 Unicode,需確保傳遞的 PChar 指向的字符在當前系統代碼頁可表示,或改用 SendInput 發送 Unicode 字符 (需修改源碼)。TWordApplication / CreateOleObject('Word.Application')) 更穩健、功能豐富 (操作文檔對象模型),SendKeys 僅作為無 COM 接口、或需模擬用戶真實輸入 (如遊戲、加密控件) 的補充。SendKeys 是 Delphi 實現低級別按鍵模擬的利器,配合 AppActivate 可跨進程自動化無 COM 接口的應用。但其本質是「盲打」,脆弱性高。現代開發優先選擇 UI Automation (UIA)、COM 自動化、或原生 API 發送消息 (PostMessage/SendMessage) 給目標控件句柄,更精準可控。