天天看點

.net中模拟鍵盤和滑鼠操作

原文: .net中模拟鍵盤和滑鼠操作

            周銀輝

其實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://11011.net/software/vspaste http://11011.net/software/vspaste

關于這些方法或結構的定義在

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);
      
http://11011.net/software/vspaste

繼續閱讀