我正在尝试检测用户alt选项卡何时离开我的窗口。我已经尝试了几个消息(WM_ACTIVATE,WM_KILLFOCUS,WM_ACTIVATEAPP,WM_NCACTIVATE,WM_CANCELMODE和WM_SYSCOMMAND检查SC_MINIMIZE)。但同样的问题仍然存在。发生以下情况。
我正在使用一个低级别的键盘钩子,如果我卸载它,上面描述的alt tabbing行为完美无缺。一旦用户以这种方式离开我的窗口,我基本上想要卸载键盘钩子。一旦我在另一个窗口中释放alt选项卡,我的窗口就会收到我要查找的几条消息,并且卸载了挂钩。但是,当您以这种方式按住键时,在安装挂钩时它不会按预期工作。
答案 0 :(得分:0)
为什么需要取下键盘钩子? SetWindowsHook对您的应用程序来说是本地的,不会影响其他应用程序,因此如果您的应用程序没有焦点,它就无法执行任何操作。
修改强> 确保使用CallNextHookEx调用回调中的下一个钩子,以免搞砸屏幕阅读器
答案 1 :(得分:0)
我使用了以下代码,它似乎正在捕捉焦点变化,并且我没有遇到任何关于按下各种组合的ALT或TAB的问题。但我还没有彻底测试它。
编辑:我再次阅读你的帖子,看到你的问题可能是两个不同钩子之间的互动。所以我也在我的应用程序中挂钩键盘,但我正在使用DispatchMessage的导入地址表钩子。我的钩子不会像你那样互动,但我的解决方案可能不适合你。bool AddHookToKeyboardFocusChanges()
{
HHOOK hhookFocusChange = NULL;
hhookFocusChange = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWindowProcHook, NULL, GetCurrentThreadId()); // the last parameter makes it a local, not global hook
if(hhookFocusChange == NULL)
return false;
return true;
}
///////////////////////////////////////////////////////////////////////////////
// This is the routine that we register to be called on every call to a
// WindowProc in our application; we use it to catch WM_SETFOCUS and
// WM_KILLFOCUS messages that indicate gaining or losing keyboard input focus.
// Unlike keyboard, mouse, paint, and timer messages, the focus messages are not
// posted to the message queue. Instead they are sent directly to WindowProc.
// We must hook them here.
//
LRESULT WINAPI CallWindowProcHook(int nCode, WPARAM wParam, LPARAM lParam)
{
UINT message = ((CWPSTRUCT*)lParam)->message;
switch(message)
{
case WM_ACTIVATE:
OutputDebugString(L"Window activated.\n");
break;
case WM_SETFOCUS:
OutputDebugString(L"Window focused.\n");
break;
case WM_KILLFOCUS:
OutputDebugString(L"Window focus lost.\n");
break;
default:
break;
}
// CallNextHookEx calls the next hook in the chain.
return CallNextHookEx(NULL, nCode, wParam, lParam);
}