- ベストアンサー
マウスの左クリックの内容を知りたい
いつもお世話になっております。 WinXP,SDKです。 WM_LBUTTONDOWN時に、別なウィンドウへ移動メッセージを出しています。 SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); ただ、受け取り側のウィンドウでは WM_EXITSIZEMOVE時にのみ処理を行っています。 マウスを左クリックし、押したままの状態で移動した時はWM_EXITSIZEMOVEが有効ですが、マウスを左クリックしてすぐに離した時はWM_EXITSIZEMOVEメッセージは来ない為に結果がおかしくなります。 左クリック後にすぐに離した時は SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); このメッセージは送らないようにしたいのですが、どのようなタイミングでどうチェックすれば良いでしょうか? ウィンドウの移動をさせたいので、どうしても左クリックと同時に移動メッセージは出したいのです。 でも、まったく移動されずにマウスを離された時に困ります。 WM_MOSEMOVE時にMK_LBUTTONをチェックして処理をしてみましたが結果は一緒でした。 移動開始の左クリックなのか、シングルクリックなのかが分かればいいような気がするのですが、それもどのように知ることが出来るか分かりません。 アドバイスをお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 どうやら、色々バグがある様です。 SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); はそのままで、WM_EXITSIZEMOVEと同時にWM_SETCURSORも追加して見て下さい。 //移動ウィンドウのプロシージャ LRESULT CALLBACK WndProcMove(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { POINT pt = {0}; RECT rc = {0}; switch(uMsg) { case WM_SETCURSOR : //クリックだけで離されると此れが送られる(ココを追加) case WM_EXITSIZEMOVE: //移動されて話されると此れが送られる //アプリウィンドウの外側に居るので浮揚する if(!::IsMouseIn(s_data.hWndApp)) { ::TransformWindow(s_data.ftb.hWndFloat, s_data.ftb.hWndMove, WS_OVERLAPPEDWINDOW, WS_EX_TOOLWINDOW); } else//アプリウィンドウの内側に居るので着地する { //着地点を決める pt = GetLandWindowPointHelper(&s_data); ::TransformWindow(s_data.ftb.hWndLand, s_data.ftb.hWndMove, WS_BORDER, 0, &pt); } break; } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); }
その他の回答 (1)
- gau_puzzler
- ベストアンサー率48% (39/81)
最近vcな案件やってないので、想像ですが WM_LBUTTONDOWN時にWM_EXITSIZEMOVEも相手windowに送ったらどうですか?
お礼
ありがとうございます。 WM_EXITSIZEMOVEを一緒に送ったところ、上手く動作するようになりました! 助かりました。ありがとうございます。
お礼
前回のアドバイスも本当にありがとうございました。 使わせて頂いています。 WM_SETCURSOR を追加したところ、ツールバーが後に行ってしまう事がなくなりました! 助かりました。 いつもありがとうございます。