C++ 键盘挂接alt tab导致异常行为?

C++ 键盘挂接alt tab导致异常行为?,c++,visual-studio-2010,hook,C++,Visual Studio 2010,Hook,我想禁止我的应用程序的用户使用alt tab。我试图通过使用低级键盘挂钩来解决这个问题 设置它效果很好,当我按下组合键等时会触发回调过程。奇怪的是,我可以将alt tab移出应用程序,但随后alt tab被完全禁用。我用鼠标切换应用程序并尝试alt tabbing,但什么也没发生。我再次切换回我的应用程序和alt选项卡,它会切换应用程序,但只有一步。当退出我的应用程序时,alt选项卡不再工作 我尝试过不同的场景,首先我认为它与VS2010中的调试器有关,但是没有,在没有调试器的情况下运行它会得到

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

设置它效果很好,当我按下组合键等时会触发回调过程。奇怪的是,我可以将alt tab移出应用程序,但随后alt tab被完全禁用。我用鼠标切换应用程序并尝试alt tabbing,但什么也没发生。我再次切换回我的应用程序和alt选项卡,它会切换应用程序,但只有一步。当退出我的应用程序时,alt选项卡不再工作

我尝试过不同的场景,首先我认为它与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);
}
编辑:

  • 添加了代码

您正在安装一个系统范围的钩子,这就是为什么您在整个系统上禁用了Alt TAB的使用

您不能使用WH\u键盘\u LL必须使用WH\u键盘挂钩,并使其特定于进程

如果使钩子进程特定,则设置WindowsHookEx的参数将更改

以下是参数的概述:

dwThreadId[in] 类型:DWORD

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

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

附:回应评论:

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

解决问题

也许您想通过使用ShowWindow功能来解决此问题? 这是文件:

cf:

碳纤维 及

如果要正确禁用alt+tab,只需通过注册表快捷键(0,0,MOD_alt,VK_tab)注册热键即可然后处理(嗯,更多忽略)由此生成的消息,这允许您将其设置为本地应用程序,而不必担心Windows钩子链,并允许您轻松地动态启用或禁用它


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

一些代码演示如何设置钩子会很有帮助。@InS:每当有人想要这样的限制,他们经常在构建一个kiosk应用程序,用户只想知道一本书是否有存货,或者橡皮筋在商店的什么地方有存货。@sarnold:制作类似kiosk的东西的正确方法是使用操作系统的功能,例如和独立的管理员和“kiosk”用户帐户。设置具有适当权限的计算机帐户所需的时间比尝试开发一种基本上是用来破坏操作系统的软件黑客所需的时间要少。@ins:作为答案,值得投赞成票。:)@萨诺尔德:如果OP谈论的是信息亭,我会发布一个答案。:-)据我所知,使用
WH\u KEYBOARD\u LL
0
作为
SetWindowsHookEx
的最后一个参数不会导致我遇到的问题。因为出于某种原因,我仍然能够
alt tab
退出我的应用程序,但是当我的应用程序不在焦点
alt tabbing
不工作时,
alt tabbing
在应用程序之外不工作不是问题。。问题出在应用程序的
alt选项卡上!你是说你可以用alt-tab退出一次,但是alt-tab被完全禁用了?是的,这就是我所经历的。但是,当我再次将焦点设置到应用程序时,我可以再次
alt tab
,然后再次禁用它。因此,当我的应用程序处于焦点时,我的挂钩似乎被禁用。检查我的编辑,我认为这是因为挂钩仅在第一个Approvariate事件之后安装(在您的情况下,在您发送的第一次击键之后)。否,因为当我的应用程序处于焦点时挂钩根本不活动。只有当我的应用程序失去焦点时,钩子才会被触发。我已经尝试过这种方法,但没有任何运气。函数本身返回false,当使用方法
GetLastError()
时,我收到类似“HotKeyId已注册”之类的消息,或者类似的消息。@Alex:如果你注销旧的会发生什么?有趣的是,没有旧的。我甚至试图注销它,即使它不存在。就在我做注册呼叫之前做注销呼叫。没有区别。