首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主机上的SetWindowsHookEx帮助

主机上的SetWindowsHookEx帮助
EN

Stack Overflow用户
提问于 2022-04-27 13:40:34
回答 1查看 42关注 0票数 0

我编写了一个程序,它连接一个键盘挂钩来侦听F12被按下,当收到F12被按下时,我会触发一个事件,在我的主程序中启动一个单独的进程。

这在我的主机上工作得很好,而且机器上的任何其他应用程序都有焦点,但是当全屏RDP会话焦点集中或虚拟机在VMWare中运行时,键盘挂钩就停止工作。

我使用SetWindowsHookEx设置键盘挂钩,如下所示:

代码语言:javascript
复制
public static int KeyboardHook;

public void AwaitKeyboard(IntPtr handle)
{
    _keyboardHookProcedure = new HookProc(KeyboardHookProc);
    KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, _keyboardHookProcedure, handle, 0);
}

然后,在KeyboardHookProc方法中,我可以添加代码来处理主窗口

代码语言:javascript
复制
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键时,我的键盘钩子就会活跃起来,并按我所需要的操作。

有人有什么建议吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-04-27 18:45:35

很可能是一个内核驱动程序或其他在钩子链中的东西正在吃掉钥匙。就其他产品而言,这可能是设计造成的。

我在我的机器上看到了同样的问题,当VirtualBox有焦点时,它正在吃我的Foobar2000热键。

WH_KEYBOARD_LL非常低,因为您可以进入用户模式。你可以试试原始输入,但我怀疑这是否可行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72029845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档