多桌面熱鍵訊息掛鉤

2021-06-25 14:15:39 字數 2190 閱讀 3938

日前在開發乙個多桌面系統,即利用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 部...