2010-12-20 80 views
4

我知道一個按鈕,當點擊時,發送WM_COMMAND消息給它的父,但它收到什麼信息,使它發送此消息?我重寫了按鈕的默認WndProc,並且該按鈕沒有收到WM_COMMAND消息,所以我需要知道什麼消息導致按鈕發送WM_COMMAND消息,以便我可以複製該功能。什麼消息導致一個按鈕發送一個WM_COMMAND消息

回答

3

我發現它實際上是WM_LBUTTONDOWN,WM_MOUSELEAVE和其他一些東西的組合。例如,只有鼠標在按鈕上被按下時,WM_COMMAND纔會被觸發,並且當WM_LBUTTONUP被觸發時,WM_COMMAND仍然在按鈕上。至於空間,輸入等,我相信它只是處理VK_ENTER消息和東西。

+0

你可以調用舊的WndProc作爲任何你不明確想要陷阱的消息的按鈕。 (從內存中,我認爲它是'GetWindowLongPtr(hWnd,GWL_WNDPROC)'來檢索它...)這應該讓你的新按鈕發送正常的WM_COMMAND消息,同時讓你掛鉤做任何你想要的做。真的不知道這是否對你的情況有好處,雖然... – 2010-12-21 00:22:02

+0

@brone不,它不是,我需要能夠分辨按鈕是否真正「按下」(根據按鈕的規則),除了原WndProc,所以我可以做我自己的東西。在父窗口中捕獲WM_COMMAND並不是我所需要的。 – 2010-12-21 00:28:33

0

我似乎記得它是WM_LBUTTONUP,但使用間諜程序找出肯定。

+1

什麼,當你的信息用空格鍵點擊它?或者回車鍵?或者用加速鍵? – 2010-12-20 22:41:04

0

無法覆蓋WM_COMMAND消息,因爲WM_LBUTTONDOWN消息被轉換爲WM_COMMAND消息並將其發送給父控件。這是在後臺完成的機制。

你問到的空間,進入key.This可以通過虛擬鍵代碼像vk_entervk_tab控制...等,

0

WM_COMMAND消息總是被控制父節點接收。如果要以編程方式單擊按鈕,可以執行以下操作:

::SendMessage(button_handle, BM_CLICK, 0, 0); 

WM_COMMAND的LPARAM包含button_handle。所以,你可以提取你按鈕調用

::GetWindowLongPtr(HWND(lParam), GWL_USERDATA); 

您必須已設置此信息前面這樣

::SetWindowLongPtr(button_handle, GWL_USERDATA, reinterpret_cast<LONG_PTR>(some_info)); 

例如some_info可以通過指針按鈕包裝對象