C++での連続した左クリックの禁止の仕方について

このQ&Aのポイント
  • VC++2005のWin32プロジェクトでアプリケーションを作成し、連続した左クリックを禁止する方法を探しています。
  • EnableWindow関数を使って連続した左クリックを禁止しようとしましたが、うまくいきませんでした。
  • どなたか連続した左クリックを禁止する方法をご存知でしたら教えてください。
回答を見る
  • ベストアンサー

C++での連続した左クリックの禁止の仕方について

C++での連続した左クリックの禁止の仕方について VC++2005のWin32プロジェクトでアプリケーションを作成使用と思いプログラムを組んでいるのですが,連続した左クリックを禁止する方法について色々試してみたのですが,解決出来ず、今回質問するに至りました。 ちなみにダブルクリック処理をつけず,あくまでも『連続した左クリック』を禁止する方法を探しております。 EnableWindow関数を使って連続した左クリックを禁止しようとしたのですが.... ↓ソースの一部 switch (message){   //略 case WM_LBUTTONDOWN:   EnableWindow(hWnd,FALSE); //左クリックした時の動作(数秒間)を記述(内容は省略) EnableWindow(hWnd,TRUE); break; 左クリックをした時点で更なるクリックを不可状態にして、数秒間作業させた後,再びクリック可能状態に戻したいのですが,上記のようなプログラムで実行し,連続で左クリックしたところ,やはり連続で左クリックを禁止することができませんでした。 どなたか,連続した左クリックを禁止する方法をご存知でしたらご教授お願いします.

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

タイマーとフラグ、あるいはタイマーとEnableWindowの組み合わせでできるんじゃないかな。 case WM_LBUTTONDOWN:   if( flg ){ flg=FALSE; SetTimer(~); } break; case WM_TIEMR: KillTimer(~); flg=TRUE; break; とか。

kono6318
質問者

お礼

ご回答ありがとうございます. SetTimer関数とWM_TIMERはすでに使用しているので,タイマ-とEnableWindowでちょっと試してみようと思います.

その他の回答 (2)

回答No.2

ああ、ごめんなさい。勘違いしていました。 クリックした1動作の中で数秒間無効にしたいということですね。 メッセージポンプはシリアルに処理されるので ここでがんばっても、このクリック時の動作が終わってしまえば、 次のクリックを処理できるようになってしまいます。 左クリックしたときの動作を別のスレッドで処理したり、 処理を自前で分割して擬似的に並列実行するようにしてあげないとフラグ制御とかしても無意味です。 あとは、 別のウィンドウでマウス操作をフックしてしまうとかも考えられるけれど 異常系で一切の操作ができなくなってしまいかねないのでやめておいた方がいいです。 クリックしたときの動作で何が数秒間も動いてるのかわからないので 対処方法はこのくらいしか思い浮かびません。 ちなみにですが、一般的にメッセージポンプを処理するときのレスポンスは一瞬で戻ってくるようにしてあげないと ユーザーからはフリーズしたように見えるので注意してください。

kono6318
質問者

お礼

>メッセージポンプはシリアルに処理されるので >ここでがんばっても、このクリック時の動作が終わってしまえば、 >次のクリックを処理できるようになってしまいます。 なるほど!そうだったんですね。勉強になります! ありがとうございます。 ちなみにクリックした際ですが、2秒間ほど音声が流れるようにしています。

回答No.1

単純にフラグ制御じゃだめなんですかね 何もしないでbreakしてしまえば無効化したのと同じはずだけど

kono6318
質問者

お礼

御回答ありがとうございます。 すみません。具体的にはどのようなフラグ制御行えば良いでしょうか? まだまだ素人で細かいところのプログラミングがよくわかっていないので、教えていただけると幸いです。

関連するQ&A

  • マウスの左クリックの内容を知りたい

    いつもお世話になっております。 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をチェックして処理をしてみましたが結果は一緒でした。 移動開始の左クリックなのか、シングルクリックなのかが分かればいいような気がするのですが、それもどのように知ることが出来るか分かりません。 アドバイスをお願い致します。

  • MessageBoxについて

    次のようなプログラムを作りました。 /*ウィンドウプロシージャ内*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){   ・・・  case WM_LBUTTONDOWN:    hantei(hWnd);    break;   ・・・ } /* 判定関数 */ void hantei(HWND hWnd){   MessageBox(hWnd,"テスト","テストです。",MB_OK); } このようになって動かしてみた(左クリックした)ところ、 ウィンドウ自体は非アクティブになったのですが、 BEEP音が鳴るだけで肝心のメッセージボックスが表示されません。 ALTキーを押すと表示されるのですが・・・ 左クリックをするとすぐにメッセージボックスを表示させるにはどうしたらよいのでしょう? 言葉足らずの説明かもしれませんがお願いします。

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

  • ビットマップ表示とSetTimer関数を同居させる方法

    ビットマップ表示とSetTimer関数を同居させる方法 現在、vc++2005を使用して、簡易的なGUIアプリケーションを作成しようとしているのですが、自分では解決ができない問題が発生してしまったので、質問させていただきます。 それはビットマップ表示とSetTimer関数を同居させる方法についてです。 ビットマップを読み込んで表示させる機能を追加してから、SetTimer関数が反応しなくなってしまい困っています。 ちなみにビットマップ表示の機能を追加する前まではSetTimer関数が正常に機能していました。 ウィンドウのハンドルhWndが何か関係しているのかと思ったのですが、解決方法がわからず・・・・・・ ご存知の方がいらっしゃましたら御教授いただけると幸いです。 ↓ ソースの一部です case WM_CREATE: //ビットマップファイル読み込み + 表示の準備 static HBITMAP hbitmap,prebitmap; static HDC hDC, hcomDC;      hbitmap = (HBITMAP)LoadImage(NULL,_T("kouen.bmp"),IMAGE_BITMAP,0,0, LR_LOADFROMFILE); if( hbitmap == NULL ) { MessageBox(hWnd, _T("ビットマップのロードに失敗しました"), _T("エラー"),MB_OK | MB_ICONWARNING); return 0; } hDC =GetDC(hWnd); hcomDC =CreateCompatibleDC(hDC); prebitmap= (HBITMAP)SelectObject(hcomDC,hbitmap);            (中略) break;                     case WM_LBUTTONDOWN: //2連続のシングルクリック防止 EnableWindow(hWnd,FALSE); SetTimer(hWnd, ID_TIMER1, 500, NULL); ← これが機能していない          (中略) break; case WM_PAINT: BitBlt( hDC, 0, 0, 1024, 690, hcomDC, 0, 0, SRCCOPY ); break; case WM_TIMER://機能しなくなってしまった部分 if(wParam==ID_TIMER1){ KillTimer(hWnd,ID_TIMER1); EnableWindow(hWnd,TRUE); }

  • C言語・Windows RECTが渡せない

    C言語のWindowsプログラムで、左クリック後に四角形の描画をしたいのですがうまくいきません。 WM_LBUTTONDOWNイベントで定義したRECT構造体を、別の関数に渡しRectangleで描画したいのですが、その関数内でRECTの値を調べるととんでもない値になっています。 何度やってもどうして値がおかしくなるのかわかりません。 WM_LBUTTONDOWNもWM_PAINTも正常に反応していると思います。 どうか知恵をお貸しくださいm(_ _)m 以下ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型はサイトの物を丸写しし、正常に動作することを確認しています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rcPos; switch (msg){ case WM_LBUTTONDOWN: rcPos.top =0; rcPos.left =0; rcPos.bottom =100; rcPos.right =100; InvalidateRect(hWnd, &rcPos, FALSE); break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); DrawGr(hWnd, hdc, &rcPos); EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //描画 int DrawGr(HWND hWnd, HDC hdc, RECT *rcPos) { int i; HBRUSH hBrush, hOldBrush; char *str_org = "rc.top=%d rc.left=%d rc.bottom=%d rc.right=%d"; char strx[256]; //四角形 hBrush = CreateSolidBrush(RGB(100, 100, 255)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); //デバッグ用 wsprintf((LPSTR)strx, (LPCSTR)str_org, rcPos->top, rcPos->left, rcPos->bottom, rcPos->right); MessageBox(hWnd, (LPCSTR)strx, (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); Rectangle(hdc, rcPos->left, rcPos->top, rcPos->right, rcPos->bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return 0; }

  • BCC32 右クリ イベント

    LRESULT CALLBACK WinWin(HWND hwnd,UINT mess,WPARAM wParam,LPARAM lParam) {  switch(mess){  case WM_LBUTTONDOWN:  処理;  break; これで、ウインドウ上でクリックした時の処理が実行できたけど。 ウインドウ上で右クリックした時の処理をさせるためには どういうソースを書けばいいのか教えてください。  case WM_RBUTTONDPWN: ではコンパイルエラーになりました。

  • 閉じるを押してもデバッグが終了しません。

    プログラム初心者です。よろしくお願いします。 フォームアプリケーションで入門としてクリックやウィンドウの検知を行うプログラムを書いてみたのですが、右上の閉じるボタン[×]を押すとウィンドウは閉じますが、デバックは終了しません。 プロセスを見てもプロジェクト名のプロセスは残ったままで、デバッグを手動で停止させると消えます。 これはこういうものなのでしょうか? 初めて書いたプログラムなので比較対象が無くて分かりません。 以下プログラムコード project1 ------------------------------------------ (略) protected: virtual void WndProc(System::Windows::Forms::Message% m) override { switch(m.Msg) { case WM_TIMER: if(m.WParam.ToInt32()==1) { POINT point; GetCursorPos(&point); Form1::label2->Text="X:"+point.x; Form1::label3->Text="Y:"+point.y; setlocale( LC_ALL, "Japanese" ); TCHAR buff[260]; HWND hWnd; hWnd=WindowFromPoint(point); GetWindowText(hWnd, buff, sizeof(buff)); Form1::label1->Text=gcnew String(buff); }break; case WM_MOVE: Form1::label4->Text="移動しました。";break; case WM_LBUTTONDOWN: Form1::label4->Text="左クリック";break; case WM_RBUTTONDOWN: Form1::label4->Text="右クリック";break; /* default: Form1::label4->Text=m.Msg.ToString();break;*/ } Form::WndProc(m); } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { HWND hmyWnd = static_cast<HWND>(this->Handle.ToPointer()); SetTimer(hmyWnd,1,100,NULL); } }; ------------------------------------------------------------- また、case WM_RBUTTONDOWN:の内部にClose();を書き足して実行すると 「'System.ObjectDisposedException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。」 と出ます。 何かおかしいところはありますでしょうか? それとも仕様でしょうか? お教えくださいm(_ _)m

  • CListView クラスのタイトル部分をクリックしたときのイベントは?

    VC6.0のMFCでプログラムしています。 あるウィンドウにCListView クラスの派生クラスを作成して貼り付けています。 このタイトル部分をマウスでクリック(ドラッグして幅を変更)した時のイベントはどのようにすれば拾えるのでしょうか? WM_LBUTTONDOWN イベントですと、タイトル下の一覧をクリックしたときには拾えるのですが、タイトル部分をクリックしても拾えません。 すみませんがよろしくお願いします。

  • クリック連打ソフトの作り方

    windows APIを使い、実際にマウスを使わずにクリックしたことにできるソフトを作りたいのですが方法がわかりません。 実際にマウスでクリックした場合、WM_LBUTTONDOWN等のメッセージが発生し そのメッセージに対する処理を書けばいいことはわかるのですが、 この場合にはこの方法ではできないように思います。 WM_LBUTTONDOWN等のメッセージを任意に発生させる方法があるのか、 それともまったく別な方法なのか見当もつきません。 どのようにすれば実際にマウスを使わずにクリックしたことにできるのか教えてください。 よろしくお願いします。

  • PostMessageの連続送信

    毎々お世話になります。 開発環境はNT4.0+SP6、VC++6.0です。 CWndのウインドウに対し上位のアプリからPostMessageを行いイベントを発行させようとしています。 1回ずつPostMessageを行うと問題ないのですが、 Call PostMessage(hwnd, WM_USER + &H1000, 1, 100) Call PostMessage(hwnd, WM_USER + &H1001, 1, 102) Call PostMessage(hwnd, WM_USER + &H1002, 1, 103) のように連続してPostMessageを行うとイベントが逆転して発行されてしまいます。(103,102,100の順にイベントが発行されます。) イベントをPostMessageを行った順に発行させることは可能でしょうか? よろしくお願いいたします。

専門家に質問してみよう