①、利用 getkeystate 函式獲得某一按鍵的按下、彈起狀態;
#define iskeypressed(nvirtkey) ((getkeystate(nvirtkey) & (1<<(sizeof(short)*8-1))) != 0)
#define iskeytoggled(nvirtkey) ((getkeystate(nvirtkey) & 1) != 0)//例如caps lock鍵
//用 pretranslatemessage 的方法,判斷 ctrl+q 是否同時按下:
if(pmsg->message == wm_keydown && pmsg->wparam == 'q' && iskeypressed(vk_control))
7> 在 pretranslatemessage 函式中進行攔截處理:
switch(pmsg->message)
③、兩種方法的比較:
第一種方法比較直接,使用方便,但一般只應用於快捷鍵比較少的程式;
第二種方法比較實用,雖然實現起來**量稍微大一些,但是適用於快捷鍵比較多的程式中;
④、弊端:只在程式為當前活動視窗的時候有效,最小化、非活動視窗時無效!
解決方法:註冊全域性系統熱鍵
①、註冊全域性系統熱鍵的優點:
即使程式的視窗不是當前活動視窗、或者視窗最小化、隱藏後,也都可以響應熱鍵;
比如qq軟體的預設呼出熱鍵:ctrl+alt+z 就是註冊了全域性系統熱鍵;
②、註冊視窗全域性系統熱鍵的步驟:
1> 呼叫 registerhotkey 函式註冊全域性系統熱鍵;
bool registerhotkey(
hwnd hwnd,
int id,
uint fsmodifiers,
uint vk
);hwnd : 指定響應該熱鍵的視窗控制代碼;
id : 熱鍵的標識,有點類似於 settimer 中的標識,作用域為執行緒內;
fsmodifiers : 指定組合鍵,這個值可以由 mod_alt、mod_control、mod_shift、mod_win 中的乙個或幾個組成;
vk : 指定熱鍵的虛擬鍵盤碼,如:'a'
備註:這裡的 ctrl+alt+a 這個組合鍵的作用域是全域性的;
示例:registerhotkey(m_hwnd, 1000, mod_control|mod_alt, 'q');
2> 響應目標視窗的 wm_hotkey 訊息;//也可以重寫對話方塊的pretranslatemessage函式 wm_hotkey
3> 呼叫 unregisterhotkey 解除安裝熱鍵:
bool unregisterhotkey(
hwnd hwnd,
int id
);hwnd : 熱鍵關聯的視窗控制代碼;
id : 熱鍵的標識;
可以放到對話方塊類的 ondestroy() 函式中進行呼叫,這樣模態與非模態對話方塊都可以成功的進行解除安裝;
判斷組合鍵
getasynckeystate查詢指定鍵的實時狀態 使用後發現兩者的區別 以組合鍵ctrl a為例 if nchar 0x041 getkeystate vk control 0x8000 ctrl a 的效果是按下ctrl和a,實現指定的操作 只有先按下ctrl然後按a或者同時按下二者,才能執行...
電腦組合鍵
電腦高手最常用的五個組合鍵 winkey d 這是高手最常用的第一快捷組合鍵。這個快捷鍵組合可以將桌面上的所有視窗瞬間最小化,無論是聊天的視窗還是遊戲的視窗,只要再次按下這個組合鍵,剛才的所有視窗都回來了,而且啟動的也正是你最小化之前在使用的視窗!winkey e 當你需要開啟windows檔案總管...
C winform中組合鍵奇怪不響應問題
再winform中使用processcmdkey處理快捷鍵響應,針對單一快捷鍵響應沒有任何問題。但是針對組合鍵總是無法響應,如下 protected override bool processcmdkey ref system.windows.forms.message msg,keys keyda...