【问题标题】:Keyboard hooking alt-tab causing strange behavior?键盘挂钩 alt-tab 导致奇怪的行为?
【发布时间】:2023-03-11 20:11:01
【问题描述】:

我想禁止我的应用程序的用户使用 alt-tab。我正在尝试通过使用低级键盘挂钩来解决这个问题。

设置它工作得很好,当我按下组合键等时触发回调过程。发生的奇怪的事情是我可以在应用程序中使用 alt-tab,但之后 alt-tabbing 被完全禁用。我用鼠标切换应用程序并尝试使用 alt-tabbing 但没有任何反应。我再次切换回我的应用程序和 alt-tab 并切换应用程序,但只有一步。当退出我的应用程序时,alt-tab 不再起作用。

我尝试了不同的场景,首先我认为它与 VS2010 中的调试器有关,但不,在没有调试器的情况下运行它会得到相同的结果。

我是否完全误解了这个钩子程序,它是否意味着只在应用程序不在焦点时捕获发生的事情?

osman.hpp:

static HHOOK m_hhook;

static LRESULT CALLBACK lowLevelKeyboardProc( int key, WPARAM wParam, LPARAM lParam );

osman.cpp:

HHOOK OSMan::m_hhook;

/*
* pseudo init code
*/
void OSMan::init()
{
     m_hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC)lowLevelKeyboardProc, 0, 0 );
}

LRESULT CALLBACK OSMan::lowLevelKeyboardProc( int key, WPARAM wParam, LPARAM lParam )
{
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;

    switch (key)
    {
    case HC_ACTION:
        {
           if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN)
                 return 1;

        }

    default:
         break;
    }
   return CallNextHookEx( m_hHook, key, wParam, lParam);
}

编辑:

  • 添加了代码。

【问题讨论】:

  • 一些演示如何设置钩子的代码会很有帮助。
  • @InS:每当有人想要这种限制性的东西时,他们通常会构建一个信息亭应用程序,用户只是想知道一本书是否有存货或商店里的橡皮筋在哪里存货.
  • @sarnold:制作信息亭之类的东西的正确方法是使用诸如group policies 之类的操作系统功能,并将管理员和“信息亭”用户帐户分开。与尝试开发基本上旨在削弱操作系统的软件黑客相比,设置具有适当权限的计算机帐户所需的时间更少。
  • @ins:这值得一票作为答案。 :)
  • @sarnold:如果 OP 谈到信息亭,我会发布一个答案。 :-)

标签: c++ visual-studio-2010 hook


【解决方案1】:

如果你想正确禁用 alt+tab,你应该通过RegisterHotKey(0,0,MOD_ALT,VK_TAB); 注册热键,然后处理(好吧,更忽略)这个消息生成,这使您可以使其成为本地应用程序,而不必担心 Windows 挂钩链,并允许您轻松地即时启用或禁用它。

虽然对于游戏来说,idTech 4 input handling code 有大量的输入宝石。

【讨论】:

  • 我已经尝试过这条路线,没有任何运气。函数本身返回 false,当使用 GetLastError() 方法时,我收到了类似“HotKeyId 已注册”之类的信息。
  • @Alex:如果你取消注册旧的会发生什么?
  • 这很有趣,没有旧的。即使它不存在,我什至试图取消注册它。就在我进行注册调用之前进行注销调用。没有区别。
【解决方案2】:

您正在安装系统范围的挂钩,这就是您在整个系统上禁用 Alt-TAB 的原因。

您不能使用 WH_KEYBOARD_LL,您必须使用 WH_KEYBOARD 挂钩,并使其特定于进程。

SetWindowsHookEx 的参数会改变,如果你指定你的钩子进程。

这里是参数的概述:

dwThreadId [in] 类型:DWORD

要与钩子过程关联的线程的标识符。

如果此参数为零,则挂钩过程与与调用线程在同一桌面上运行的所有现有线程相关联。

PS:回复评论:

只有在进程获得一个适当的事件后才会安装挂钩。在挂钩键盘消息时,您必须在安装挂钩之前发送至少一条键盘消息。

解决方法

也许您想通过使用 ShowWindow 函数来解决这个问题? 这是文档:http://www.pinvoke.net/default.aspx/user32.showwindow

cf : http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces

cfhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx#wh_keyboardhook

【讨论】:

  • WH_KEYBOARD_LL0 作为SetWindowsHookEx 的最后一个参数,据我了解,不会导致我遇到的问题。因为由于某种原因,我仍然可以将alt-tab 退出我的应用程序,但是当我的应用程序不在焦点上时,alt-tabbing 不起作用 - alt-tabbing 在应用程序之外不起作用不是问题.. 它的alt-tabbing 是问题所在!
  • 所以你是说你可以 alt tab out 一次,然后 alt tab 就被完全禁用了?
  • 是的,这就是我正在经历的。但是当我再次将焦点设置到我的应用程序时,我可以再次alt-tab,然后再次禁用它。所以看起来当我的应用程序处于焦点时,我的钩子被禁用了。
  • 检查我的编辑,我认为这是因为钩子仅在第一个适当的事件之后安装(在你的情况下,在你发送的第一次击键之后)。
  • 不,因为当我的应用程序处于焦点时,挂钩根本不活动。只有当我的应用程序失焦时才会触发钩子..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2011-01-30
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
相关资源
最近更新 更多