我有一個用作疊加層的視窗,并且只有一部分是不透明的。視窗具有擴展樣式
WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED
透明度設定為:
SetLayeredWindowAttributes(hwnd, RGB(255, 255, 255), 0, LWA_COLORKEY);
我確實想讀取滑鼠事件來實作覆寫的互動部分。
到目前為止,我嘗試捕獲諸如
WM_MOUSEMOVE,
WM_KEYDOWN,
WM_NCLBUTTONDOWN,
在我的 WNDPROC 中,他們沒有開火。我認為這是由于一些視窗擴展樣式,并且通過一次洗掉一個我發現它是導致它的分層視窗屬性。可悲的是,我的應用確實依賴于這個屬性的透明度。
然后我嘗試為那個行程和執行緒注冊一個 Windows 鉤子來攔截滑鼠事件。我根本不知道鉤子的內部結構——但我認為它們在進入應用程式佇列之前就可以訪問訊息,因此我希望我能在任何干擾傳遞它們之前閱讀它們。可悲的是,這并沒有奏效。我像這樣注冊了鉤子:
app_state.hhook = SetWindowsHookExW(WH_MOUSE,
Some(Self::HOOKPROC),
GetModuleHandleW(null_mut()),
GetCurrentThreadId();
實際的 HOOKPROC 是這樣定義的:
pub unsafe extern "system" fn HOOKPROC(ncode: c_int, wparam: WPARAM, lparam: LPARAM) -> LRESULT {
println!("fired!");
CallNextHookEx(null_mut(), ncode, wparam, lparam)
}
可悲的是,這沒有向 STDOUT 輸出任何內容,但我確實認為該鉤子已注冊為取消鉤子函式沒有回傳 0。
我的下一個想法是將鉤子放在管理前一個視窗的行程中。但是以下不起作用。
app_state.hhook = SetWindowsHookExW(WH_MOUSE,
Some(Self::HOOKPROC),
GetModuleHandleW(null_mut()),
GetWindowThreadProcessId(
GetWindow(hwnd, GW_HWNDPREV), null_mut())
);
我認為這是因為我需要將鉤子放在一個單獨的 dll 中,但如果它確實有效 - 這個解決方案似乎很臟,并且可能在極少數情況下作業而無需提升權限。我可以做些什么來通過接受和有凝聚力的代碼來實作期望?
uj5u.com熱心網友回復:
只需擺脫WS_EX_TRANSPARENT樣式并WS_EX_LAYERED自行使用,讓作業系統正常處理滑鼠輸入(無需掛鉤)。完全透明的像素將按預期落下,并且視窗將接收關于非透明像素的輸入訊息。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/432446.html
