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

最新文章

  1. NGUI 按钮点击音效统一管理开启与关闭
  2. hdu 1005 1021 递归超限 找规律 // 只要看题中n较大都是有规律的
  3. tp auth 转载保存
  4. mac skim 修改背景色
  5. Pubwin服务端重装(安装)教程
  6. HDU 1361 Parencodings(栈)
  7. Darwin Streaming Server 安装流程
  8. WOW
  9. Swift搭建本地http服务器,实现外部视频即时播放
  10. NFS配置与安装
  11. java程序中中常用到的linux操作
  12. Jmeter 录制脚本(二)
  13. Oracle性能优化1-总体思路和误区
  14. Hadoop系列-zookeeper基础
  15. SQL中rownum和order by的执行顺序的问题
  16. 内置函数——format
  17. gdb常用命令小结
  18. (转)Inno Setup入门(五)——添加readme文件
  19. Mobile IP
  20. python函数调用时传参方式

热门文章

  1. 【2013】将x插入有序数列
  2. c# 读/写文件(各种格式)
  3. Android shape画圆点
  4. java中关于File类的mkdirs()和FIle()构造方法在windows环境内网测试总结
  5. css3-1 css3游戏介绍、css3样式和优先级
  6. js进阶正则表达式13RegExp对象方法(RegExp对象的方法:compile,test,exec)(子表达式 var reg1=/([a-z]+)\d/)
  7. MethodInterceptor拦截器
  8. C++ 与 Java 语言对比
  9. AppStoreID--安装URL--应用更新URL--应用评分URL
  10. ANR问题分析实例