我想禁止我的应用程序的用户使用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);
}
编辑:
- 添加了代码。
答案 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).aspx 和 http://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拥有大量的输入宝石。