メッセージ・ボックスでタイムアウト機能はないのかしらと探していたら、Maurizio Pisano氏によるMessageBoxTimeout APIという記事がありました。その記事のソース・コードが Visual Studio .NET 2003用だったので、Visual C++ 2005 Express Edition 移植して、様々な種類のメッセージ・ボックスを試せるサンプル・プログラム(mbxwithtimeout.zip)を作りました。
使い方は簡単です。メッセージ・ボックスの種類を選び、メッセージとタイトルを入力し、開始ボタンを押すだけ。タイムアウトで指定された時間が経過すると、メッセージ・ボックスが消えます。タイムアウト値は、一応5分(msecで入力)まで設定できます。
戻り値には、メッセージ・ボックスで選択したボタンの値が表示されます。タイムアウトした時は、32000が戻ります。ただし、MB_OKを選択した時は、ボタンを押しても、タイムアウトしても 1 しか戻りません。
ちなみにMessageBoxTimeoutは、user32.dll のドキュメントされていない API です。したがって、将来なくなる可能性もありますし、使えない Windows バージョンもあります。私が試した環境は、Windows XP と Windows 2000。Windows 2000 では動きませんでした。お使いの際はご注意を。
Maurizio Pisano氏のソース・コードにも、その辺りの配慮を組み込むように、コメントされています。ご参考下さい。
ちなみに、Visual C++ 2005 Express Edition への変更内容は、
#include <tchar.h>の削除
プロトタイプ宣言の削除
_T() を TEXT() に変更
String → LPCWSTR 変換追加
といったところです。上記、Maurizio Pisano氏の記事でも述べられているように、移植は簡単です。興味ある方は、同記事をお読みの上、プログラミングされることをお薦めします。
プログラム作製に使ったツールは、Visual C++ 2005 Express Edition 日本語版です。レジストリ等は使用していませんので、適当なフォルダに実行ファイル(MBXwithTimeOut.exe)を解凍すれば使えます。なおプログラムの実行に際しては、以下のモジュールが必要です。必要に応じてインストールして下さい。
Microsoft .NET Framework Version 2.0 再頒布可能パッケージ (x86)
Microsoft .NET Framework 2.0 Service Pack 1 (x86)
なお、掲載したソースおよび実行ファイルは、ご自由にお使い下さい。ただし、ご使用により、いかなる弊害や不具合が生じたとしても、当方ではいかなる責任も持ちません。予め、ご了承下さい。
追記:
コンソール・アプリケーションから使えるように、"DialogServices.exe" にまとめました。
コマンドライン・オプションで、タイムアウト付メッセージ・ボックスの他、ファイル・ダイアログやテキスト・ボックスが使えます。
詳しい使い方は、ダウンロードしたファイル中の dialogservices.pd fをご参照ください。
Thinking-J
https://sites.google.com/site/thinkingj2007/home
mail : thinkingj.2007@gmail.com