ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4025905 マウスのクリックを無視したい
質問者:BearCave Visual C++ 2005、Windows APIを使ってアプリケーションを作成しています。

とあるファイルの処理に10数秒程度かかるため、この間はプログレスバー付きのダイアログを表示し、マウスカーソルも砂時計に変えています。

この処理の間にもしユーザーがメインウインドウのボタンなどをクリックした場合、クリックした瞬間は何も起こりませんが、処理が終わってプログレスバーが消えた途端にそのクリックに反応してしまいます。どうやらファイル処理中でも、マウスの挙動は記録されているようです。(メッセージキューに溜まってるのでしょうか?)

処理中のマウスのクリック情報は一切無視したい(破棄したい)のですが、どのような手段があるでしょうか?
困り度:
  • 困っています
質問投稿日時:
08/05/16 09:13
この質問に対する回答は締め切られました。
最新から表示回答順に表示

回答

ANo.3 ★アドバイス
・次のAPIがあります。
 BlockInput()
 ​http://msdn.microsoft.com/ja-jp/library/cc410616.aspx
 これを使ってみませんか?
回答者:Oh-Orange
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/05/16 13:13
参考URL: http://msdn.microsoft.com/ja-jp/library/cc410616.aspx
この回答へのお礼早速試してみましたが、この関数はWindows上すべての入力を止めてしまうので、他のアプリにも影響が出てしまいます。自分のアプリ内だけで入力をブロックできれば良いのですが… アドバイスありがとうございました。

回答

ANo.2 メインウィンドウの方で処理している間は「EnableWindow()」で無効化しておいてもいいかも。
回答者:Apr2nd
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/16 10:24
この回答への補足親ウインドウをEnableWindowで無効化してみましたが、やはり処理が終わってから、処理中に押したクリックに反応してしまいました。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 ダイアログを モーダルで表示すれば 親ウィンドウの操作は出来ないともいますが …

WinAPIなら DialogBoxやDialogBoxIndirectなどでモーダルダイアログが作成出来ますよ
回答者:redfox63
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/16 09:36
この回答への補足プログレスダイアログはモーダルですので、親ウインドウの操作はできません。なのでクリックした瞬間は何も起きませんが、処理が終わってダイアログが消えた途端に、以前押したクリックに反応してしまうというのが問題のポイントです。
この回答へのお礼すみません、補足内容は勘違いしていました。プログレスダイアログはCreateDialog関数で作ったモードレスです。でも親ウインドウの方はループで処理しているので、処理中は操作はできません。ダイアログをモーダルにしてしまうと、ファイル処理を親ウインドウではなく、プログレスダイアログに任せることになるので、汎用性が失われてしまいますが、検討してみます。アドバイスありがとうございました。
最新から表示回答順に表示