WM_LBUTTONDOWNを無効にしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
爺プログラマー

WM_LBUTTONDOWNを無効にしたい

#1

投稿記事 by 爺プログラマー » 15年前

WM_LBUTTONDOWN:をシステム上無効にしたり有効にしたりしたいのですが、
可能でしょうか?
よろしくお願いします。

toyo

Re:WM_LBUTTONDOWNを無効にしたい

#2

投稿記事 by toyo » 15年前

クリックされた場所で方法は変わってくると思います
普通のクライアント領域
タイトルバーや最大化、×ボタンなどの非クライアント領域
ボタンやテキストボックスなどの子ウィンドウ
無効化したいのは一部でしょうか全部でしょうか

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#3

投稿記事 by 爺プログラマー » 15年前

デスクトップ上に作成した子ウインドーの普通のクライアント領域です。
よろしくお願いします。

toyo

Re:WM_LBUTTONDOWNを無効にしたい

#4

投稿記事 by toyo » 15年前

それは
case WM_LBUTTONDOWN:
//何がしかの処理
break;
とあるのを無効にしたいということでしょうか
それなら
case WM_LBUTTONDOWN:
if (クリック無効フラグがないとき) {
//何がしかの処理
}
break;
のような処理ではだめでしょうか

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#5

投稿記事 by 爺プログラマー » 15年前

WM_LBUTTONDOWNのイベント自体をWindowsに発生させない方法になります。
WM_LBUTTONDOWNが必要なければソフトでいくらでも無効として処理することは可能ですから・・・

シエル

Re:WM_LBUTTONDOWNを無効にしたい

#6

投稿記事 by シエル » 15年前

確かヒットテストのメッセージを処理すればいけたような…
勘違いだったらすみません。
以下を参考にしてみて下さい。

http://wisdom.sakura.ne.jp/system/winap ... win43.html

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#7

投稿記事 by 爺プログラマー » 15年前

シエル ..上級者さん いつもありがとうございます。

さて、ご指摘のサイトを参考に下記のように記述しました。

case WM_NCHITTEST:
i = DefWindowProc(hWnd, uMsg, wParam, lParam);
if (i == HTCLIENT)
{
mouse_dw=1; mouse_dw1=1;
return HTCAPTION;
}
break;


でも、マウスを移動させるだけでボタンが押し下げしたのと同じ効果が出てしまいました、移動情報とクリック情報を切り離せないでしょうか?
よろしくお願いします。

シエル

Re:WM_LBUTTONDOWNを無効にしたい

#8

投稿記事 by シエル » 15年前

HTCAPTIONを返すと、ウィンドウを掴んでしまうと思いますので、
違う値を返さなければいけないと思われます。

それと、上記のコードでは、クライアント領域でクリックされているのかの判定は
されていますが、右クリックか左クリックかの判定がされていないので、
その判定も必要だと思います。

と、偉そうに言ってますが、私はこのメッセージを処理したことがないので、
申し訳ありませんが、あまり理解しておりません。

ググってみたら、下記のサイトを見つけましたので参考にしてみて下さい。
以後は答えられる範囲であれば、答えます。すみません。。。

http://eternalwindows.jp/winbase/menu/menu09.html

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#9

投稿記事 by 爺プログラマー » 15年前

シエル ..上級者 さん

貴重な情報ありがとうございます。
後は自力で頑張ります。今後ともよろしくお願いします。

DirectX複雑ですね、順番を間違えないように。
衝突判定は裏画面ですると見えないところで簡単に早くできます。
奥行きで捕らえて、2D表示の無色でかなり早く判定できます。
衝突判定の関数は重たいです。この方式だと線同士の衝突も外しません。

あっ!!余計な事でした。

シエル

Re:WM_LBUTTONDOWNを無効にしたい

#10

投稿記事 by シエル » 15年前

いえ、情報ありがとうございます。
今はDirectXのアルファブレンド、テクスチャブレンド、加算合成等で
思いっきりつまずいてます。
こちらこそ、私がDirectXの質問をした際は、よろしくお願い致します!

shiro4ao

Re:WM_LBUTTONDOWNを無効にしたい

#11

投稿記事 by shiro4ao » 15年前

「システム上」とのことでしたので、自分のアプリケーション以外
へのクリックでも無効にしたいということでしょうか?でしたらマ
ウスフックをインストールして、メッセージを無効にするという方
法はどうでしょうか?
・・・・と思ったのですが、うまくいきませんでした・・・

==================hookdll.cpp===============================
EXPORT LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wp, LPARAM lp)
{
if (nCode > 0){
if (wp == WM_LBUTTONDOWN) {
// MessageBox(pmh->hWnd,"左クリックが押されました","hook",NULL);
return TRUE;
}
}

return CallNextHookEx(hHook, nCode, wp, lp);
}
==================ここまで===============================
上記のコードでMessageBoxの行をコメントアウトすると、左クリックを無効にできず、
普通にクリックが出来てしまいます。
コメントアウトしないと、左クリックが効かないようになりました。


さらなる問題点として、非クライアント領域(タイトルバーとかウィンドウの枠など)
だと普通にクリックできてしまいます・・・・

解決策でなくて申し訳ありません・・・・


追記:TRUEをreturnするようにしたら無効化できました。(上記のコードで可能になりました)
   ただ非クライアント領域ではふつうにクリックできるという問題は依然起こります。 画像

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#12

投稿記事 by 爺プログラマー » 15年前

shiro4ao さん

回答ありがとうございます。

実は自力で解決したのですが、普通のウインドープロシージャー内で次のように記述すると無効になりましたが・・・完全ではなく極まれに発生してしまいます。

case WM_LBUTTONDOWN:
if(mouse_dw_cancel)return 0;
mouse_dw=1; mouse_dw1=1;
break;

メインルーチンで「mouse_dw_cancel」を真にすると「mouse_dw」に値が入りませんでした。
無効になる率はかなり大きくなりましたが、ハード的な要因が関わっているような気がします。

ちなみに「ヒットテスト」では効果がありませんでした。プログラム進行上のタイミングがとれないのだと考えます。

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#13

投稿記事 by 爺プログラマー » 15年前

皆さんにこの件でお騒がせしておりますが、興味のある方はご一読ください。
ダイレクトサウンド8で10秒間隔のストリーミング再生をしています。
再生進行バーをクリックして再生位置をランダムに変更できます。
マウスクリックが、ちょうど再生が終わった時と重なった場合「問題が発生したため、通話録音の記録操作.exe を終了します。 ご不便をおかけして申し訳ありません。」のメッセージがでます。
そのため、スライーダーが終端に来た時、例えクリックしてもプログラム上無視したのですが、効果がありません。クリックしなければ、最終まで難なく再生できるのです。
これってハード的な要因ではないでしょうか。DSとの素性が悪いとか?

このWindowsメッセージは割り算の時や許容アクセスを超えたメモリー(ファイル)アクセスでも発生するようで、この当たりは徹底的に追及しております。
他にもこのようなメッセージを回避する手段がありましたら、ご教授ください。

シエル

Re:WM_LBUTTONDOWNを無効にしたい

#14

投稿記事 by シエル » 15年前

私は数日前にDirectsound8で、ストリーミング再生に成功しました。
成功したときは声を出して喜びましたw

まあ個人的な話は置いといて、メッセージが違いますが、テスト中は何十回と
エラーが発生しましたが、そのときの原因はメモリにまだデータがコピーされないときに、
再生しようとしてエラーが発生していたのが多かったと思います。

クリックしたときに、終端であれば、再生しないという条件にしてはどうでしょうか?

ど素人の意見ですので、あまり気にしなくてもいいです…

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#15

投稿記事 by 爺プログラマー » 15年前

シエル ..上級者 さん お世話になります。同じプログラムを組んでいたとは奇遇です。

さて、私の場合ファイルを最後まで再生すると、lpSecondary->Stop();をさせています。
この状態で次の再生を開始するには再生ボタンをクリックした時点で初期設定して新たにプレイが再開されます。
空のバッファーを再生することは先ずないと思いますが、どこかでアクセス違反が起こっているのかも知れません。



今のところmouse_dw_cancelが真でクリックイベントをキャンセルさせるには

case WM_NCHITTEST:
lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
if ( lRet == HTCLIENT)
{
if(mouse_dw_cancel)lRet = HTNOWHERE;
}
return lRet;

の処理より

case WM_LBUTTONDOWN:
if(mouse_dw_cancel)return 0;
mouse_dw=1; mouse_dw1=1;
break;

の方が効果があります。

シエル

Re:WM_LBUTTONDOWNを無効にしたい

#16

投稿記事 by シエル » 15年前

マウスでバーをクリックしたときは、その位置から再生されるようにしているということですが、
左マウスボタンクリックを無効にするというより、
クリック時の再生処理内で再生するかしないかを判定してはどうでしょうか?

そのクリック時の再生処理がどうなってるのかわからないので、あまり言えませんが。
画像

爺プログラマー

Re:WM_LBUTTONDOWNを無効にしたい

#17

投稿記事 by 爺プログラマー » 15年前

シエル ..上級者 さん いつも親切にありがとうございます。

再生終盤でクリックするとエラーになるため、終盤に差し掛かると再生が完全に終了するまで終盤フラグを立ててサウンド関連の処理を全てパスしているのです。
ですからプログラム進行上では終盤においてはクリックの有り無しは無関係になっています。
ですが、クリックイベントの発生を止めると正常に終わりまで再生できるのです。
不思議でなりません。

シエル

Re:WM_LBUTTONDOWNを無効にしたい

#18

投稿記事 by シエル » 15年前

う~ん。じゃあDirectSound関連の処理は関係なさそうですね。
クリックイベントが何で影響するのか…
さっぱりですね。すみません。。。

閉鎖

“C言語何でも質問掲示板” へ戻る