.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://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);

 

posted @ 2009-06-15 16:15 周银辉 阅读(3276) 评论(8) 编辑 收藏

 回复 引用 查看   
#1楼 2009-06-15 16:25 楚广明      
兄弟有点搞恶了。。。我没有看就点DEMO了,关机了。。。下次不要了。。。
 回复 引用 查看   
#2楼[楼主] 2009-06-15 16:38 周银辉      
@楚广明
哈哈哈, 本来打算用HOOK将键盘和鼠标都锁了的,但想想放弃了,其实你可以用 shutdown -a 取消关机的

 回复 引用   
#3楼 2009-06-15 16:47 lujunjie[未注册用户]
lz加油,最好再发点驱动级的模拟
 回复 引用   
#4楼 2009-06-15 18:06 Ariex[未注册用户]
还好以前有红色蠕虫的时候对shutdown有一点研究……
不过做Demo不要这样,会引起大部分人的反感,比如ls的……

 回复 引用 查看   
#5楼[楼主] 2009-06-15 19:44 周银辉      
@Ariex
OK, 采纳,我将DEMO删掉了~

 回复 引用 查看   
#6楼 2009-06-15 20:51 Galactica      
请问楼主,如何实现"锁屏",具体点说,就是Vista/7那样的 User Account Control 对话框.
 回复 引用 查看   
#7楼[楼主] 2009-06-15 22:49 周银辉      
@Galactica
研究下再说

 回复 引用 查看   
#8楼 2009-06-16 09:24 airwolf2026      
这东西还是不错的哈.
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1503688 d39yEFNzyso=