• ベストアンサー

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( ) が 実行されないようにするにはどこを直したらいいですか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#2009
noname#2009
回答No.3

一応 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)); } --------------------------------------------- でも確かにあんまりお勧めできません。 素直にメッセージボックス出しといた方が良いような。

A__
質問者

補足

ありがとうございます。 その方法で解決しました。 お勧めでないのはどうしてですか?

その他の回答 (4)

noname#2009
noname#2009
回答No.5

>お勧めでないのはどうしてですか? いえ、解決したんでしたら良いです。 システムのメッセージループに関わる部分自体をイジる のは避けたいという感覚があるので、というだけです。 ユーザインターフェース動作の方針そのものを変更した 解決の方が、できれば望ましいので。 その部分の動作については仕様上譲れないという状況で あるのなら、全然問題無いと思います。

A__
質問者

お礼

ありがとうございます。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.4

こんにちは。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関数が完了するまでボタンを押下することが出来なくなります。

A__
質問者

お礼

ありがとうございます。 今回の場合はボタンは無く、マウスクリックで 関数を実行するんだけど、ボタンクリックで 関数起動だったとしたら、ボタンを非活性にする法も使えますね。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

>クリックの回数はストックされていて、 >その回数だけ必ず MyFunc( ) が実行されてしまうんです。 それは、未処理のメッセージがあるためでしょうね。 MyFunc()終了後、バッファにたまっているメッセージをクリアするような処理が必要でしょう。 もしくは、処理を開始した時点で一時的にクリックで メッセージが発生しないようにしておき、 終わった時点で元に戻すとか。 今手元には参考になるものが無いので、 具体的にどうするかはわかりませんが(^^;

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

多分この程度で大丈夫でしょう。 > static bool b = TRUE;  static int b = 0; >  if(b){   if(!b){ >   b = FALSE;    b++; >   b = TRUE;    b--; Windowsは詳しくないんですが, 多分マルチスレッドを使わなければ、 クリティカルセクションもセマフォも不要でしょう。

A__
質問者

お礼

ありがとうございます。 int もやってみたけど、bool と同じく、 クリックの回数はストックされていて、 その回数だけ必ず MyFunc( ) が実行されてしまうんです。