Button をクリックすると、その親に WM_COMMAND メッセージが送信されることはわかっていますが、このメッセージを送信するためにどのようなメッセージを受信するのでしょうか? ボタンのデフォルトの WndProc をオーバーライドしていますが、ボタンは WM_COMMAND メッセージを受信しません。そのため、ボタンが WM_COMMAND メッセージを送信する原因となるメッセージを知る必要があるため、その機能を複製できます。
4 に答える
実際には、WM_LBUTTONDOWN、WM_MOUSELEAVE、およびその他のいくつかの組み合わせであることがわかりました。たとえば、WM_COMMANDは、マウスがボタン上で押された場合にのみ起動され、WM_LBUTTONUPが起動されたときもボタン上にあります。スペースやエンターなどは、VK_ENTERのメッセージなどを処理するだけだと思います。
メッセージはメッセージとして変換され、親コントロールに送信されるWM_COMMAND
ため、メッセージをオーバーライドすることはできません。これは、バックグラウンドで実行されるメカニズムです。WM_LBUTTONDOWN
WM_COMMAND
スペースについて質問し、キーを入力します。これは、、...などの仮想キーコードで制御できvk_enter
ますvk_tab
。
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 は、ボタン ラッパー オブジェクトへのポインターによって行うことができます。
WM_LBUTTONUP だと思い出すようですが、Spy プログラムを使用して確認してください。