測試使用 WinForm 專案,因為使用的是 System.Windows.Forms 命名空間。
不能在 Form1 建構子中使用,不然會出現下面的錯誤:
不過可以複寫 OnLoad 事件,在裡面使用:
A -> Enter -> 方向鍵左 -> 1
後來發現可以使用 user32.dll 中的 keybd_event 達成:
Win + E:
參考資料:
Microsoft.Learn - SendKeys Class
基本操作
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
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com