日期:2014-05-18  浏览次数:21543 次

C#如何模拟键盘某个键的长按动作
首先祝各位新年快乐!!!

我的需求:
模拟键盘上某个键长按一段时间。
也就是你在键盘上按着"a"键不放的效果。

网上找的模拟键盘东西,我总结下,有三种:

1.最简单的,.net的方法

SendKeys.Send("A");
但是熟悉的大侠都知道,这只是一个按下,弹起的过程,也就单击一个键。

2.windows api keybd_event

[DllImport("user32.dll", EntryPoint = "keybd_event")]
  public static extern void keybd_event(
  byte bVk, //虚拟键值
  byte bScan,// 一般为0
  int dwFlags, //这里是整数类型 0 为按下,2为释放
  int dwExtraInfo //这里是整数类型 一般情况下设成为 0
  );
这是转换到C#后的形式
keybd_event((byte)Keys.A, 0, 0,0);//按下
Thread.Sleep(3000);
keybd_event((byte)Keys.A, 0, 2,0);//弹起

这样做,我用记事本测试了一下,如果长按,应该是出现aaaaaa,但是问题是只出现了2个a,
分别是开头和结束的时候两个操作出现2个a

3.windows api sendmessage
这个我不多说了,很经典的东西
同样有键盘事件,但是诸多不便,需要窗口句柄,不满足我的要求

问题仍然没有解决,请各位大侠指点一二,谢谢


------解决方案--------------------
DllImport("user32.dll", EntryPoint = "keybd_event", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern void Keybd_event(byte vk, byte scan, int flags, int extrainfo);
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
//VK_MENU 相当于Alt键
Keybd_event((byte)12, 0x45, KEYEVENTF_EXTENDEDKEY, 0);//按下,有KEYEVENTF_KEYUP即为长按


Keybd_event((byte)12, 0x45, KEYEVENTF_KEYUP, 0);//抬起

------解决方案--------------------
利用标志位,处理keydown和keyup事件
这里的标志位用于控制是否按下某个键,按下状态下不断send就是你要的长按