2010-12-20 57 views
4

ボタンをクリックするとWM_COMMANDメッセージがその親に送信されますが、このメッセージを送信するメッセージはどのようなメッセージですか?私はボタンのデフォルトのWndProcをオーバーライドしており、ボタンはWM_COMMANDメッセージを受け取らないので、その機能を複製できるようにWM_COMMANDメッセージを送信するボタンがどのメッセージで発生するのかを知る必要があります。ボタンがWM_COMMANDメッセージを送信するメッセージ

答えて

3

実際には、WM_LBUTTONDOWN、WM_MOUSELEAVEなど、いくつかの組み合わせがあります。たとえば、WM_COMMANDは、ボタン上でマウスが押された場合にのみ起動され、WM_LBUTTONUPが起動されてもボタン上に残ります。スペースについては、など、私はそれだけでVK_ENTERメッセージやものを処理すると信じています。

+0

明示的にトラップしたくないメッセージのボタンのために古いWndProcを呼び出すことができます。 (メモリから、私はそれを取得する 'GetWindowLongPtr(hWnd、GWL_WNDPROC)'だと思う...)それはあなたがしようとしていることをするためにフックを入れている間、通常のように 'WM_COMMAND'メッセージを送信する新しいボタンを取得する必要があります行う。しかし、これがあなたの状況に適しているかどうかは本当に分かりません... –

+0

@broneいいえ、私はボタンが(ボタンのルールに従って)本当に "クリック"されたかどうかを知ることができる必要があります元のWndProc、私は自分のものをすることができます。親ウィンドウ内にWM_COMMANDをトラップすることは、私が必要とするものではありません。 –

0

私はそれがWM_LBUTTONUPだと思いますが、Spyプログラムを使って確かめてください。

+1

何時にあなたを約できるボタンラッパーオブジェクトへのポインタで、以前の例some_infoため、この

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

のように、この情報を設定しておく必要があります

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

呼び出して、あなたのボタンについての情報を抽出することができますスペースキーでそれをクリックしますか?またはEnterキー?またはアクセラレータキーを使用しますか? –

0

WM_LBUTTONDOWNメッセージがWM_COMMANDメッセージに変換されて親制御に送信されるため、WM_COMMANDメッセージを上書きすることはできません。これはバックグラウンドで行われるメカニズムです。

あなたは宇宙についての質問とkey.Thisを入力するにはvk_entervk_tab ...などのような仮想キーコードによって制御することができる。、

0

WM_COMMANDメッセージは常にコントロールの親で受信されます。あなたがボタンをクリックしますプログラムで、あなたはこれを行うことができます:WM_COMMANDの

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

LPARAMはbutton_handleを保持しています。だから、あなたが

関連する問題