C# 模擬鍵盤按下

測試使用 WinForm 專案,因為使用的是 System.Windows.Forms 命名空間。

基本操作

    
SendKeys.Send("ABC"); // 輸入 ABC
    

不能在 Form1 建構子中使用,不然會出現下面的錯誤:
    
System.InvalidOperationException: 由於應用程式並不處理 Windows 的訊息,所以 SendKeys 無法於這個應用程式中執行。您可以變更該應用程式處理 Windows 訊息,或使用 SendKeys.SendWait 方法。
   at System.Windows.Forms.SendKeys.Send(String keys, Control control, Boolean wait)
   at WinFormsAppSendKeys.Form1..ctor() in C:\Users\ruyut\Documents\RiderProjects\2023\test\WinFormsAppSendKeys\WinFormsAppSendKeys\Form1.cs:line 11
   at WinFormsAppSendKeys.Program.Main() in C:\Users\ruyut\Documents\RiderProjects\2023\test\WinFormsAppSendKeys\WinFormsAppSendKeys\Program.cs:line 14
    

不過可以複寫 OnLoad 事件,在裡面使用:
    
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        SendKeys.Send("ABC"); // 輸入 ABC
    }
    

特殊按鍵

    
SendKeys.Send("A{ENTER}B{LEFT}1");
    

A -> Enter -> 方向鍵左 -> 1

特殊按鍵清單

(後方括弧是說明)
    
^ (Ctrl)
% (ALT)
+ (Shift)
ENTER (也可以使用 "~")
TAB
ESC
ESCAPE
HOME
END$LEFT
RIGHT
UP
DOWN
PGUP
PGDN
NUMLOCK
SCROLLLOCK
PRTSC
BREAK
BACKSPACE
BKSP
BS
CLEAR
CAPSLOCK
INS
INSERT
DEL
DELETE
HELP
F1 ~ F16
MULTIPLY (乘號)
ADD (加號)
SUBTRACT (減號)
DIVIDE (除號 /)
    

同時按下按鍵

    
SendKeys.Send("+A"); // Shift + A // 特殊字元和一般字元會自動同時按
SendKeys.Send("^%s"); // Ctrl + Alt + S 同時按    
    
SendKeys.Send("+abc"); // Shift + a 然後再 bc // 範例輸出: Abc
SendKeys.Send("a+(bc)d"); // a 再 Shift + b + c 然後再 d
    

重複按下

    
SendKeys.Send("{LEFT 10}"); // 方向鍵左 10 次
SendKeys.Send("{A 5}"); // A 5 次
    

Windows Key

在測試中筆者想要按下 Windows 鍵,但怎麼都無法按下,
    
System.ArgumentException: 關鍵字 "LWin" 無效。
   at System.Windows.Forms.SendKeys.ParseKeys(String keys, IntPtr hwnd)
   at System.Windows.Forms.SendKeys.Send(String keys, Control control, Boolean wait)
   at WinFormsAppSendKeys.Form1.OnLoad(EventArgs e) in C:\Users\ruyut\Documents\RiderProjects\2023\test\WinFormsAppSendKeys\WinFormsAppSendKeys\Form1.cs:line 44
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, WM msg, IntPtr wparam, IntPtr lparam)
    

後來發現可以使用 user32.dll 中的 keybd_event 達成:
    
    [DllImport("user32.dll")]
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

    const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
    const uint KEYEVENTF_KEYUP = 0x0002;
    
    
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        
        keybd_event((byte)Keys.LWin, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event((byte)Keys.LWin, 0, KEYEVENTF_KEYUP, 0);
	}
    

Win + E:
    
keybd_event((byte)Keys.LWin, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)Keys.E, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)Keys.LWin, 0, KEYEVENTF_KEYUP, 0);
keybd_event((byte)Keys.E, 0, KEYEVENTF_KEYUP, 0);
    



參考資料:
Microsoft.Learn - SendKeys Class

留言