Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用WinAPI在c#中发送组合键后生成虚拟键_C#_Winapi_Keyboard - Fatal编程技术网

如何使用WinAPI在c#中发送组合键后生成虚拟键

如何使用WinAPI在c#中发送组合键后生成虚拟键,c#,winapi,keyboard,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 dwExtr

我在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);
 }
问题是,在方法完成执行后,仍然按下键1(SHIFT)。换句话说,额外的方法调用将从上一次运行中按下SHIFT开始。 它看起来非常简单,但我找不到使它工作的解决方案。我已经研究了很多相关的SO问题并尝试了它们,但问题仍然存在。非常感谢您的帮助。

请检查,尤其是第3个参数的标志。 在代码中,每个键都按了两次,但都没有释放

将窗口消息常量替换为
KEYEVENTF\u KEYUP(0x2)
以按下,只需将其归零即可按下


此外,您可能希望查看错误的标志。WM\U KEYDOWN=0,WM\U KEYUP=KEYEVENTF\U KEYUP。相反,如果SendInput()返回0,则可以引发异常。我已按照您的建议正确替换了常量,但SHIFT+HOME仍然无法一起发送。实际上,第一个键会上下移动,第二个键也会上下移动。我又错过了什么。