我正在按:
模拟按下的 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);
答案 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
谢谢!