日前在開發乙個多桌面系統,即利用createdesktop建立多個桌面,並自由切換,類似sysinternal上的desktops。開發過程中遇到乙個問題,當在新建立的桌面上按下某個win組合快捷鍵後,當前桌面並不會響應這個訊息,而是預設桌面響應了這個訊息。為了能在新建立的桌面上響應熱鍵訊息,同事反編譯了desktops軟體,發現它使用了低階鍵盤鉤子(wh_keyboard_ll),於是仿照這個方法,我們也掛上了低階鍵盤鉤子,當發現按鍵組合屬於熱鍵對映表中的某一項時,向當前桌面的shell_traywnd視窗傳送wm_hotkey訊息並且不在傳遞此hook訊息。這個方法用起來還行,但是由於自身寫的**處理不夠好,或者說逆向的不夠,功能上有個bug。當使用者按下熱鍵後,例如win+r,輸入(按下)t 時會繼續觸發win+t熱鍵訊息。**顯示按下t是win鍵也處於按下狀態,我分析了**也沒找到原因,想徹底的反彙編desktops的鉤子函式又能力不夠,只能另想其它方法解決了。
既然預設桌面的shell_traywnd視窗處理了熱鍵訊息,那麼我是不是可以利用訊息鉤子截獲它呢?於是我利用wh_getmessage鉤子截獲了傳送到這個視窗執行緒的訊息
hwnd hwnd = ::findwindow(_t("shell_traywnd"),0);
dword processid;
dword tid=getwindowthreadprocessid(hwnd,&processid);
fninstallhooklib(tid,hwnd,m_hwnd);
為新桌面建立的執行緒上等待訊息,**熱鍵訊息
dword winapi chookdemodlg::threadfun(lpvoid lp)
} else
pthis->ms_newtraywnd = ::findwindow(_t("shell_traywnd"), null);
msg msg;
cstring strmsg;
while(getmessage(&msg,null,0,0)) }
::outputdebugstring(_t("assist thread exit"));
return 0;
}
在鉤子函式(dll模組中)處理熱鍵訊息
#pragma data_seg("shareddataname")
hhook ms_hhook=null;
hwnd ms_hsourcewnd=null;
hwnd ms_hdirectwnd=null;
#pragma data_seg()
extern hmodule ms_hmodule;
#pragma comment(linker,"/section:shareddataname,rws")
lresult callback getmsgproc(
_in_ int code,
_in_ wparam wparam,
_in_ lparam lparam
) pmsg->message = wm_null;
return 1;
} }return callnexthookex(ms_hhook,code,wparam,lparam);
}
本來我是打算利用postthreadmessage向新桌面關聯的執行緒傳送訊息,但是傳送失敗,因為鉤子函式執行在預設桌面下,而新桌面關聯的執行緒關聯的新桌面,乙個執行緒不能向乙個屬於另外桌面的執行緒傳送執行緒訊息(如果這兩個執行緒屬於同乙個程序則例外,下面會有這個情形用法),於是我只好向主視窗傳送訊息。
主視窗執行緒收到訊息後,它可以向新桌面關聯的執行緒傳送訊息,如下
if (message == (wm_user + 1000))
return 0;
}
這樣子新建立的桌面就可以截獲熱鍵訊息了。
注意:1. setwindowshookex只能截獲當前桌面的訊息,msdn有說明
2. findwindow函式會在呼叫執行緒關聯的桌面上查詢視窗
3. 若程式以管理員身份啟動,為了讓鉤子函式(在explorer程序中)向程式傳送訊息,越過uipi,需要呼叫函式
changewindowmessagefilter(wm_user+1000,msgflt_add);
實現gnome桌面的全域性熱鍵
gtk 2.0 沒有提供全域性熱鍵的功能,而需要使用gconf和 metacity才能得到該功能。不過有個叫 mikkel kamstrup erlandsen 的人寫了乙個 libgtkhotkey 可以提供該功能,而且是跨平台的。在fedora系統上,安裝libgtkhotkey su yum ...
WIN32開發 獲取鍵盤訊息 註冊全域性熱鍵
獲取wm keydown訊息需要相應的獲取焦點問題,只有正確的焦點位置才能操作,這個方法存在一定的體驗問題,現在使用熱鍵在任何情況下都可以獲取你想要的鍵盤訊息。缺點是別的程式將無法再獲取到這個鍵盤訊息,所以一般推薦使用組合鍵熱鍵,單鍵熱鍵不推薦 bool registerhotkey hwnd hw...
桌面訊息通知 HTML5 Notification
使用場景 常見的大多適用於提示使用者有新的未讀訊息,一系列推送廣告 系統更新訊息等.知道了使用場景後,接著先上一段完整 1 註冊許可權 2notification.requestpermission function status 7 8 訊息推送 9var n new notification 部...