【问题标题】:How to make virtual key up after sending key combination in c# using WinAPI使用WinAPI在c#中发送组合键后如何制作虚拟键
【发布时间】:2012-09-13 03:54:27
【问题描述】:

在 c# 中使用 winapi 发送组合键时遇到了奇怪的问题。 我的目标是创建一种发送两个密钥的方法,例如 f.e. 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 问题并尝试了它们,但问题仍然存在。任何帮助表示赞赏。

【问题讨论】:

  • 错误的标志。 WM_KEYDOWN = 0,WM_KEYUP = KEYEVENTF_KEYUP。改用 SendInput(),你可以在它返回 0 时抛出异常。

标签: c# winapi keyboard


【解决方案1】:

检查keybd_event documentation! 特别是第三个参数的标志。 在您的代码中,您一直按每个键两次,也没有释放。

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

你也可以看看.NETs SendKeys class.

【讨论】:

  • 我已按照您的建议正确替换了常量,但 SHIFT+HOME 仍然不能一起发送。实际上,第一个键上下移动,然后第二个键也上下移动。我又错过了什么。
猜你喜欢
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2012-12-01
相关资源
最近更新 更多