我一直在努力學習如何使用SetWindowLongPtr()
並把它理解爲以下幾點:SetWindowLongPtr()如何傳遞消息?
您可以使用下面的函數來獲取當前消息,並將其發送至自定義協議:
LONG_PTR Some_Ptr = SetWindowLongPtr(Some_Hwnd, GWLP_WNDPROC, (LONG_PTR)Custom_Proc);
創建自定義協議,舉例如下:
static LRESULT CALLBACK Custom_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: MessageBox(hwnd,"This is a window","OKAY",NULL); break; default: return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam); break; } return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam); }
我的問題如下:
- 我在這裏錯過了什麼嗎?它是否正確?
- 你在哪裏打電話
SetWindowLongPtr()
?如果你需要特定的情況,想象一下在WM_CREATE中創建的按鈕句柄爲Some_Hwnd
。但我寧願讓它在其他情況下開放。
我覺得你很困惑。根據文檔,GWLP_WNDPROC更改指定窗口的窗口過程,因此發送到該窗口的任何未來消息都將轉到新過程。它不會「以任何我知道的方式獲取當前消息」。 –
好的...我想我明白了。這裏有另一個需要澄清的問題,假設我在更改其過程到一個新的'Custom_Proc'後點擊一個按鈕。通常情況下,它會發送'WM_COMMAND'和'LOWORD(wParam)== BN_CLICKED'。它是否也這樣做? – hherbol
對於後續問題,至少如果新問題有其自己的意義,那麼發佈一個新問題是一個好主意,就像第二個問題一樣。 – alk