11 12響應組合鍵與全域性熱鍵

2021-05-27 16:42:27 字數 1553 閱讀 5353

①、利用 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...