- ベストアンサー
2重Func禁止。クリセク。セマフォ。
MyFunc( ) の実行中は WM_LBUTTONDOWN を無視されるように しようと思いました。 LRESULT CALLBACK WndProc(… { static bool b = TRUE; switch(msg){ case WM_LBUTTONDOWN: if(b){ b = FALSE; MyFunc( ); // MessageBox(hWnd, "", "", MB_OK); b = TRUE; } break; でもこれでは、例えば MyFunc( ) が実行中に3回クリックすると その後に MyFunc( ) は3回実行されてしまいます。 MessageBox( ) を使えばうまくいくけと、それは使いたくありません。 できるだけ簡単なソースで、 MyFunc( ) の実行中のクリックで、後で MyFunc( ) が 実行されないようにするにはどこを直したらいいですか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
一応 terra5 さんのおっしゃっているヤツです。 --------------------------------------------- void XXFunc(HWND hwnd) // メッセージキュー削除 { MSG msg; // while(PeekMessage(&msg, hwnd, // WM_MOUSEFIRST, WM_MOUSELAST, // PM_REMOVE)); while(PeekMessage(&msg, hwnd, WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, PM_REMOVE)); } --------------------------------------------- でも確かにあんまりお勧めできません。 素直にメッセージボックス出しといた方が良いような。
その他の回答 (4)
>お勧めでないのはどうしてですか? いえ、解決したんでしたら良いです。 システムのメッセージループに関わる部分自体をイジる のは避けたいという感覚があるので、というだけです。 ユーザインターフェース動作の方針そのものを変更した 解決の方が、できれば望ましいので。 その部分の動作については仕様上譲れないという状況で あるのなら、全然問題無いと思います。
お礼
ありがとうございます。
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 ボタンの押下を無効にしてしまうのはダメなのでしょうか? >LRESULT CALLBACK WndProc(… >{ > static bool b = TRUE; > switch(msg){ > case WM_LBUTTONDOWN: > if(b){ > b = FALSE; HWND hwBtn = GetDlgItem(hWnd, IDC_BTN_XXX ); // (1) EnableWindow(hwBtn, FALSE ); // (2) > MyFunc( ); EnableWindow(hwBtn, TRUE ); // (3) >// MessageBox(hWnd, "", "", MB_OK); > b = TRUE; > } > break; (1) ボタン(IDC_BTN_XXX)のハンドルを取得する。 (2) マウス入力とキーボード入力を無効する。 (3) マウス入力とキーボード入力を有効する。 これで、MyFunc関数が完了するまでボタンを押下することが出来なくなります。
お礼
ありがとうございます。 今回の場合はボタンは無く、マウスクリックで 関数を実行するんだけど、ボタンクリックで 関数起動だったとしたら、ボタンを非活性にする法も使えますね。
- terra5
- ベストアンサー率34% (574/1662)
>クリックの回数はストックされていて、 >その回数だけ必ず MyFunc( ) が実行されてしまうんです。 それは、未処理のメッセージがあるためでしょうね。 MyFunc()終了後、バッファにたまっているメッセージをクリアするような処理が必要でしょう。 もしくは、処理を開始した時点で一時的にクリックで メッセージが発生しないようにしておき、 終わった時点で元に戻すとか。 今手元には参考になるものが無いので、 具体的にどうするかはわかりませんが(^^;
- terra5
- ベストアンサー率34% (574/1662)
多分この程度で大丈夫でしょう。 > static bool b = TRUE; static int b = 0; > if(b){ if(!b){ > b = FALSE; b++; > b = TRUE; b--; Windowsは詳しくないんですが, 多分マルチスレッドを使わなければ、 クリティカルセクションもセマフォも不要でしょう。
お礼
ありがとうございます。 int もやってみたけど、bool と同じく、 クリックの回数はストックされていて、 その回数だけ必ず MyFunc( ) が実行されてしまうんです。
補足
ありがとうございます。 その方法で解決しました。 お勧めでないのはどうしてですか?