键盘挂钩alt-tab导致奇怪的行为?

时间:2012-02-29 09:52:43

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

我想禁止我的应用程序的用户使用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);
}

编辑:

  
      
  • 添加了代码。
  •   

2 个答案:

答案 0 :(得分:1)

您正在安装系统范围挂钩,这就是您在整个系统上禁用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

cf http://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

答案 1 :(得分:0)

如果你想正确地禁用 alt + tab ,你应该只通过RegisterHotKey(0,0,MOD_ALT,VK_TAB);注册热键,然后处理(好吧,更多地忽略)消息这会产生,这使您可以将应用程序设置为本地,而不用担心Windows挂钩链,并允许您在运行中轻松启用或禁用它。

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