0

我试图检测用户 alt 选项卡何时离开我的窗口。我尝试了几条消息(WM_ACTIVATE、WM_KILLFOCUS、WM_ACTIVATEAPP、WM_NCACTIVATE、WM_CANCELMODE 和 WM_SYSCOMMAND 检查 SC_MINIMIZE)。但同样的问题仍然存在。发生以下情况。

  1. 我的应用程序是焦点,我按住 alt 并按 tab。
  2. 下一个窗口出现。
  3. 我一直按住 alt,然后再次按 tab,但这一次,只有 tab 被识别,所以我最终在新窗口中按 tab,而不是像通常的行为那样再次按 alt。

我正在使用低级键盘钩子,如果我卸载上面描述的这种 alt 选项卡行为完美地工作。一旦用户以这种方式离开我的窗口,我基本上想卸载键盘挂钩。一旦我在另一个窗口中释放 alt 选项卡,我的窗口就会收到我要查找的几条消息,并且该挂钩已被卸载。但是,当您以这种方式握住钥匙时,在安装挂钩时它不会按预期工作。

4

2 回答 2

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); 
}
于 2013-05-09T05:26:50.227 回答
0

为什么需要卸下键盘挂钩?SetWindowsHook 对于您的应用程序是本地的,不会影响其他应用程序,因此如果您的应用程序没有焦点,它已经什么都不做。

编辑 确保您使用 CallNextHookEx 在回调中调用下一个钩子,以免搞砸屏幕阅读器

于 2013-05-06T15:17:04.480 回答