2012-03-28 41 views
2

我試圖製作一個應用程序,如Launchy/Enso等,當用戶按Caps Lock鍵時彈出。如何繞過「前臺鎖定超時」來激活我的窗口?

爲此,我需要安裝一個低級別鍵盤鉤子(WH_KEYBOARD_LL),從中我隨後生成一個線程來顯示要呈現給用戶的對話框。

問題是,當我以某種方式竊取焦點時(例如通過單擊另一個窗口),然後按下Caps Lock一小段時間,我的窗口就沒有得到鍵盤輸入:輸入進入背景窗口,即使我的窗口是「活動」(從看標題欄)。因爲我最終在文本處理器(或聊天框......)中輸入了類似「visu」(對於「Visual Studio」),並按Enter,withotu意識到它沒有按照我的意圖去做。

(有趣的是,在3秒後(左右)暫停,我的窗口標題欄突然變得「不活躍」,儘管它在第一個地方是從來沒有激活!)

我怎麼能繞過這個「保護」機制到其實激活我的窗口?

+0

Raymond Chen在Old New Thing上介紹了這一點...您需要使用shell熱鍵功能而不是試圖竊取焦點。 – 2012-03-28 02:51:24

+0

@BenVoigt:我怎麼用Caps Lock做到這一點,同時抑制輸入? – Mehrdad 2012-03-28 03:02:11

+1

我建議你先閱讀雷蒙德的整個「軍備競賽」系列。 [這是我已經提到的那個](http://blogs.msdn.com/b/oldnewthing/archive/2009/02/26/9445006.aspx)。 – 2012-03-28 03:21:11

回答

1

好的,我終於想出了一個破解。 (微軟老闆:請把目光移開...)

我攔截Caps Lock鍵與一個低級別的鍵盤鉤子,然後當我發現VK_CAPITAL,我叫

keybd_event(
    VK_OEM_8, 
    (BYTE)MapVirtualKey(pKBDLLHook->vkCode, MAPVK_VK_TO_VSC), 
    (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) ? KEYEVENTF_KEYUP : 0, 
    0 
); 

在處理程序中。

本質上,我只是將請求更改爲VK_OEM_8
但是,請注意,虛擬密鑰代碼而不是對應於掃描代碼。這是故意的 - VK_OEM_8掃描代碼(據我所知,無論如何),所以我沒有太多的選項。

然後我只是基於VK_OEM_8而編程 - 這很容易攔截/處理/等。

希望這可以幫助其他人。