如何在使用WinAPI在c#中发送密钥组合后使虚拟密钥成为可能

时间:2012-09-20 18:14:26

标签: c# winapi keyboard

我在c#中使用winapi发送密钥组合时遇到了一个奇怪的问题。 我的目标是创建一个发送两个密钥的方法,例如: SHIFT + HOME:

 private const int WM_KEYDOWN = 0x0100;
 private const int WM_KEYUP = 0x0101;

 [DllImport("user32.dll")]
 static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

 public static void SendKey(byte key1, byte key2)
 {
      //SHIFT down
      keybd_event(key1, 0, WM_KEYDOWN, UIntPtr.Zero);
      //press HOME
      keybd_event(key2, 0, WM_KEYDOWN, UIntPtr.Zero);
      keybd_event(key2, 0, WM_KEYUP, UIntPtr.Zero);
      //SHIFT up
      keybd_event(key1, 0, WM_KEYUP, UIntPtr.Zero);
 }

问题是在方法执行完毕后仍然按下key1(SHIFT)。换句话说,附加方法调用将从上一次运行中按下SHIFT开始。 它看起来非常简单,但我找不到使它工作的解决方案。我已经查看了许多相关的SO问题并尝试了它们,但问题仍然存在。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

检查keybd_event documentation!特别是第3个参数的标志。 在你的代码中,你一直按两次键而不释放它们。

将您的窗口消息常量替换为KEYEVENTF_KEYUP (0x2)以压缩,并将其简单地归零为keydown。

您也可以查看.NETs SendKeys class.