2013-05-06 54 views
0

我試圖檢測用戶何時退出我的窗口。我嘗試了幾條消息(WM_ACTIVATE,WM_KILLFOCUS,WM_ACTIVATEAPP,WM_NCACTIVATE,WM_CANCELMODE和WM_SYSCOMMAND檢查SC_MINIMIZE)。但同樣的問題仍然存在。發生以下情況。當用戶離開應用程序時卸載鍵盤鉤子

  1. 我的應用程序是關注焦點,我按住a​​lt並按下tab鍵。
  2. 下一個窗口提出。
  3. 我一直按住ALT鍵,然後再次按Tab鍵,但是這一次,只有標籤被識別,所以我最終在新窗口中掛鉤,而不是像常見的行爲那樣再次使用tab鍵。

我正在使用低級別的鍵盤掛鉤,如果我卸載了上述alt製表符行爲完美的作品。我基本上想要在用戶以這種方式離開我的窗口時立即卸載鍵盤鉤子。只要我在另一個窗口中釋放alt標籤,我的窗口會收到我查找的幾條消息,並卸載掛鉤。但是,如果按這種方式按住按鍵,則安裝掛鉤時無法按預期工作。

+1

如果我理解正確,您正在使用全局掛鉤並嘗試重新創建本地行爲。 – chris 2013-05-06 15:14:53

回答

0

爲什麼你需要刪除鍵盤鉤子? SetWindowsHook是本地的應用程序,不會影響其他應用程序,因此如果您的應用程序沒有焦點,它已經不做任何事情。

編輯 確保你調用一個鉤子與CallNextHookEx方法回調不搞砸了屏幕閱讀器

+0

它似乎影響我的應用程序之外的事情。我的用戶羣是屏幕閱讀器用戶(盲人),特別是一個屏幕閱讀器不能很好地使用我使用的鉤子。我的鉤子創建調用如下所示: g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle(NULL),0); – 2013-05-06 15:34:38

+0

@ user749473,你應該指定線程ID,因此它隻影響你的線程而不是每個線程。 – chris 2013-05-06 17:26:11

+0

@luceric,低級別的鍵盤和鼠標掛鉤完全可能影響一切(我一直這樣做)。雖然調用'CallNextHookEx'應該完成,但它對全局低級別鍵盤掛鉤沒有影響。我記得在MSDN上改變'lParam'並將新的傳遞給'CallNextHookEx'沒有奏效。 – chris 2013-05-06 17:27:54

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); 
} 
相關問題