周銀輝
其實SendKeys類提供的方法蠻好用的,可惜的是WPF中不能用了,說是WPF的消息循環方式改成了Dispatcher,所以直接調用System.Windows.Forms.SendKeys.Send()方法會報錯. 不過沒關係, 至少有use32的SendInput可用,通過P/Invoke方式,我們可以模擬鍵盤或鼠標操作.
定義是這樣的:
[DllImport("user32.dll", SetLastError = true)] internal static extern int SendInput(int nInputs, ref INPUT mi, int cbSize);
其中的INPUT結構表示一個鍵盤或鼠標操作:
[StructLayout(LayoutKind.Sequential)] internal struct INPUT { internal int type; internal INPUTUNION union; }; [StructLayout(LayoutKind.Explicit)] internal struct INPUTUNION { [FieldOffset(0)] internal MOUSEINPUT mouseInput; [FieldOffset(0)] internal KEYBDINPUT keyboardInput; }; [StructLayout(LayoutKind.Sequential)] internal struct MOUSEINPUT { internal int dx; internal int dy; internal int mouseData; internal int dwFlags; internal int time; internal IntPtr dwExtraInfo; }; [StructLayout(LayoutKind.Sequential)] internal struct KEYBDINPUT { internal short wVk; internal short wScan; internal int dwFlags; internal int time; internal IntPtr dwExtraInfo; }; [Flags] internal enum SendMouseInputFlags { Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008, RightUp = 0x0010, MiddleDown = 0x0020, MiddleUp = 0x0040, XDown = 0x0080, XUp = 0x0100, Wheel = 0x0800, Absolute = 0x8000, };
關於這些方法或結構的定義在http://www.pinvoke.net/index.aspx 這個網站上可以查找得到(但不保證百分百靠譜)
下面這個代碼文件做了一個很好的包裝,可以下載後參考:
Simulation.zip
如何使用呢?
很簡單, 要敲一個鍵, 比如回車:
Keyboard.Press(Key.Enter); Keyboard.Release(Key.Enter);
要敲一個組合鍵:比如Alt+F4
Keyboard.Press(Key.LeftAlt); Keyboard.Press(Key.F4); Keyboard.Release(Key.LeftAlt); Keyboard.Release(Key.F4);
要敲一段文字:
Keyboard.Type("notepad");
鼠標與之類似,比如:
Mouse.MoveTo(new System.Drawing.Point(x, y)); Mouse.Click(MouseButton.Right);