模拟按下Ctrl键

时间:2014-01-30 12:08:33

标签: c# wpf winapi events

我正在按:

模拟按下的 Ctrl 按钮
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

keybd_event(VK_CONTROL, 0, 0, 0); //key down
/* Stuff which needs ctrl to be pressed is done here */
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); //key up

此代码位于.dll文件中。该DLL用于WPF应用程序。现在我有一个奇怪的行为,只有当WPF窗口不活动时才会识别按下的 Ctrl 键。这意味着当我单击另一个窗口以取消激活WPF窗口并强制运行代码而不再激活WPF窗口时,它可以工作。单击WPF窗口后,它不再起作用。

这里有什么想法吗?

编辑: 我将代码从dll移动到wpf应用程序,它没有改变任何东西。在我测试的WPF应用程序中:

keybd_event(VK_CONTROL, 0, 0, 0);
child.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

1 个答案:

答案 0 :(得分:0)

manuell提到了解决方案并在我的问题的第三条评论中解释了问题:

  

keybd_event是异步的。使用SetKeyboardState。将所有256个字节设置为0,但indice VL_CONTROL(设置为-128或0x80)除外。同步RaiseEvent后再使用all为0 - manuell

Joe Whites进一步解释并提出了一个潜在的好解决方案:

  

manuell提出了关于keybd_event异步的一个好点 - 你通过调用RaiseEvent来跟随它,我认为它是同步的。因此,在您的应用有机会处理“按下CTRL”消息之前,您正在调用您的活动。尝试在Dispatcher.BeginInvoke中包装RaiseEvent调用(即,在“CTRL被按下”消息处理后注册回调以运行)并查看是否可以解决您的问题。 - Joe White

谢谢!