我编写了一个程序,它连接一个键盘挂钩来侦听F12被按下,当收到F12被按下时,我会触发一个事件,在我的主程序中启动一个单独的进程。
这在我的主机上工作得很好,而且机器上的任何其他应用程序都有焦点,但是当全屏RDP会话焦点集中或虚拟机在VMWare中运行时,键盘挂钩就停止工作。
我使用SetWindowsHookEx设置键盘挂钩,如下所示:
public static int KeyboardHook;
public void AwaitKeyboard(IntPtr handle)
{
_keyboardHookProcedure = new HookProc(KeyboardHookProc);
KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, _keyboardHookProcedure, handle, 0);
}然后,在KeyboardHookProc方法中,我可以添加代码来处理主窗口
public static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode < 0)
{
return CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
}
MainWindow mainWindow = (MainWindow)Application.Current.MainWindow;
if (mainWindow != null)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
if (vkCode == mainWindow.KeyboardShortcutCode) // Keyboard shortcut pressed
{
mainWindow.KeyboardShortcutPressed();
}
}
return CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
}
else
{
return CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
}
}对于我的主机上的应用程序来说,这一切都很好。但是,当VM或全屏RDP窗口被激活时,KeyboardHookProc方法就永远不会被调用。
我读过这样的建议:每当Windows中的活动窗口发生变化时,我就可以清除钩子并重新设置它。我已经尝试过了,但是重新设置钩子并没有解决问题,因为在VM或RDP中仍然没有调用KeyboardHookProc。
当我回到主机并按下F12键时,我的键盘钩子就会活跃起来,并按我所需要的操作。
有人有什么建议吗?
谢谢
发布于 2022-04-27 18:45:35
很可能是一个内核驱动程序或其他在钩子链中的东西正在吃掉钥匙。就其他产品而言,这可能是设计造成的。
我在我的机器上看到了同样的问题,当VirtualBox有焦点时,它正在吃我的Foobar2000热键。
WH_KEYBOARD_LL非常低,因为您可以进入用户模式。你可以试试原始输入,但我怀疑这是否可行。
https://stackoverflow.com/questions/72029845
复制相似问题