|
■No87159 (ピカチュウ さん) に返信 > window7 単数形になっていますよ。「Windows 7」ですよね。
> A.from(自作)テキストボックス(権限ID)、ラベル(権限の結果) > B,C,D.from(他社アプリ)いろいろなコントロールがある 「from」(フロム)というのは 「Form」(フォーム)のことでしょうか。
> そのあと、BCDアプリをマウスでクリック(アクティブ)すると、なぜか操作できてしまいます。
Deactivate イベントの実行中に、MessageBox を呼び出しているからだと思います。
Activated イベントの発生タイミングを追跡してみたところ、this.Activate(); を 実行するよりも前、すなわち、MessageBox が閉じられた瞬間に、 MainForm がアクティブな状態に戻っているようです。
「Deactivate イベントが完了した後」で this.Activate(); を呼ぶことで、 問題を軽減できるかも知れません。
private void Form1_Deactivate(object sender, EventArgs e) { this.BringToFront(); MessageBox.Show("NGのため操作できません"); this.BeginInvoke(new MethodInvoker(this.Activate)); }
上記は、「権限 ID のチェック」や、「フォームを閉じるときの Deactivate への対処」は 省略していますので、適宜調整してください。
とはいえ、そもそも MessageBox では根本的な解決にはならないと思います。
(問題点 1) MessageBox で最前面表示オプションを付与していないので、 メッセージが他のアプリの背面に表示されることになる。
(問題点 2) MessageBox を閉じずに画面の隅にでも追いやった状態で そのまま他のアプリケーションを利用できてしまう。
(問題点 3) そもそも「他社アプリ」側に手を加えない限り、呼出元の 権限ID を無視して、exe のダブルクリック実行などにより単独起動できてしまう。
根本的には、他社アプリ側に権限情報を受け取るための機能を実装してもらった方が良いでしょう。
ちなみに問題点 1 については、Microsoft.VisualBasic.DLL を参照設定して Microsoft.VisualBasic.Interaction.MsgBox("NGのため操作できません", Microsoft.VisualBasic.MsgBoxStyle.SystemModal); とすることで、他のアプリよりも前面に表示させることができます。
VB のランタイムに頼りたくない場合には、MessageBox.Show メソッドのうち、 MessageBoxOptions を受け取るのオーバーロードを用いて 引数に MB_SYSTEMMODAL すなわち「options: (MessageBoxOptions)0x1000」を加えれば、 他のアプリよりも前面に表示されるようになります。
|