質問 |
||
| 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関数で作ったモードレスです。でも親ウインドウの方はループで処理しているので、処理中は操作はできません。ダイアログをモーダルにしてしまうと、ファイル処理を親ウインドウではなく、プログレスダイアログに任せることになるので、汎用性が失われてしまいますが、検討してみます。アドバイスありがとうございました。 |