- ベストアンサー
MsgBoxをモーダルモードで開いたときと普通の時
- MsgBoxをモーダルモードで開くと、メッセージボックスが画面の中央に表示され、他の操作ができなくなります。
- 一方、モーダルモードを指定しない場合、メッセージボックスは画面のどこにでも表示され、背後の操作も可能です。
- vbSystemModalを指定すると、メッセージボックスの左上にアイコンが表示され、ユーザーにより注意を引きます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>結局はvbSystemModalをつけなくてもモーダルモードで開かれるのでしょうか? [MsgBox 関数] のヘルプを見ると、「vbSystemModal」は「引数 buttons」の一つで、その値は「4096」と出ています。 一方、その後ろに >最後のグループに属する値 (0、4096) は、メッセージ ボックスがモーダルかどうかを指定します。 と書かれているので、「vbSystemModal」でない場合は、値が「0」の「vbApplicationModal」になります。 「vbApplicationModal」は「アプリケーション モーダルに設定します。」、「vbSystemModal」は「システム モーダルに設定します。」ですので、#1さんがお書きのように、いずれも「モーダル」ということになります。 「引数 buttons」を指定しなかった場合は、「0」が設定されたことになりますから、無意識に「vbApplicationModal」を設定したことになります。 >しいて言えば、vbSystemModalにした場合、 >メッセージボックスの左上のアイコンが変わることくらいしか気付けません。 他のアプリケーションを起動しておいて、test1 を実行します。ここで MSGBOX が表示された段階で [Alt] + [Tab] でウィンドウを切り替えると、他のアプリケーションが最前面に出てきます。 一方、test2 を実行し、MSGBOX が表示された段階で [Alt] + [Tab] でウィンドウを切り替えても、MSGBOX は、最前面に出てきたはずの他のアプリケーションの更に前面に位置取っています。 #これより下は、回答ではありません。ご参考までに。 Microsoft社のソフトウェア開発者向けサポートサービスMSDN(Microsoft Developer Network)で資料を漁ってみましたが、あまり芳しい説明は出てきませんでした。 ただ、#2さんが引用されている livingintheblueshadowsさんのご回答についての関連情報が掲載されています。 livingintheblueshadowsさんは >Windows95以降はシステム全体が中断されずに、常に最全面に表示されるだけになっているみたい とお書きですが、どうも「32ビット版Windows以降」という表現の方がよいようです。 VBScript の情報ですが、 ●MsgBox 関数の定数 http://msdn.microsoft.com/ja-jp/library/cc392239.aspx システム モーダルに設定します。Win16 システムでは、メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。Win32 システムでは、実行中の他のプログラムより上に、アプリケーション モーダル メッセージ ボックスが表示されます。 ●How To Create a System-Modal Program/Window in Visual Basic(Visual Basic でシステム モーダル プログラム/ウィンドウを作成するには、方法) http://support.microsoft.com/kb/147817/ja NOTE: Because Visual Basic for Windows was not designed with system modal capabilities in mind, using a MsgBox, InputBox, or Form.Show of another form from a system modal window will not work correctly.If you want to show another window from a system modal form, use another Visual Basic for Windows form and call SetSysModalWindow for this second form also, so that it becomes the system modal window. 注: Visual Basic の Windows システム モーダル機能を考慮して設計されていないため、システム モーダル ウィンドウからは、MsgBox、inputbox メソッド、または Form.Show 別のフォームを使用して正しく動作しません。システム モーダル フォームから別のウィンドウを表示する場合は、別の Visual Basic の Windows フォームを使用して、システム モーダル ウィンドウになりますように SetSysModalWindow この 2 番目のフォームはまた、コールします。 上記を見て「SetSysModalWindow」を検索してみると、 ●SetSysModalWindow http://msdn.microsoft.com/ja-jp/library/cc411081.aspx この関数は使われなくなりました。16 ビット版 Windows との互換性のためにだけ残されています。新しい入力モデルでは、システムモーダルウィンドウを使えません。 と出ています。 ●How To Create a System-Modal Program/Window in Visual Basic(Visual Basic でシステム モーダル プログラム/ウィンドウを作成するには、方法) http://support.microsoft.com/kb/147817/ja NOTE: An equivalent Win32 API function for SetSysModalWindow does not exist. System modal windows contradict the concept of multitasking and thus are not implemented in Win32. 注: SetSysModalWindow を同等の Win32 API 関数は存在しません。システム モーダル ウィンドウは、マルチタスクの概念と矛盾し、したがって Win32 では実装されていません。 もう少し、話が逸れますが、 ●[VB] 言語仕様上の制限事項 - AppActivate ステートメントと SendKeys ステートメントを Win 32 オペレーティングシステムで使用する場合 http://support.microsoft.com/kb/408402/ja アクティブにしたアプリケーションにキー コード転送が行われない可能性があります。AppActivate ステートメントは指定したアプリケーションのウインドウをアクティブウインドウにし、SendKeys ステートメントはフォアグラウンド ウインドウにキー コードを送ります。Microsoft(R) Windows(R) Version 3.1 ではアクティブ ウインドウとフォアグラウンド ウィンドウは同じですが、Microsoft(R) Windows NT(R) Version 3.51 や Microsoft(R) Windows(R) 95ではアクティブ ウィンドウとフォアグラウンド ウィンドウは必ずしも等しくありません。32 ビット版では Win32 オペレーティング システムを対象として設計されているため、AppActivate ステートメントではアクティブ ウィンドウの切り替えとフォアグラウンド ウィンドウの切り替えが同時に行われます。 こんなところで、[SendKeys ステートメント] の挙動不審の原因が分かりました。
その他の回答 (2)
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
4096と0の差は十分にありそうだが、実はナニもナイ?? 実際の動作からみて、下の明快な解説を支持します。ヘルプはウソ、、、 vbApplicationModalと、vbSystemModalって何のためにあるんですか? http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1285605987 ~~~ Windows 3.1の時代までは vbApplicationModalっていうのは、そのプログラムが中断 vbSystemModalっていうのは、システム全体(全てのプログラム)が中断 っていう意味だったんだけど、例えばプログラムにバグ(不具合)があって、メッセージボックスを表示したまま止まってしまった場合を考えてみると、システムモーダルだと止まってしまったプログラムを強制終了させることもできなくなってしまうので、Windows95以降はシステム全体が中断されずに、常に最全面に表示されるだけになっているみたい。
お礼
ありがとうございます。
- masatsan
- ベストアンサー率15% (179/1159)
msgbox元々モーダルで開かれる。
お礼
そうだったのですか。
お礼
ありがとうございます。