C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

fromアクティブについて

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■87159 / inTopicNo.1)  fromアクティブについて
  
□投稿者/ ピカチュウ (2回)-(2018/04/17(Tue) 22:54:43)

分類:[C#] 

VS2017 net.framwork3.5 window7

---コントロール---
A.from(自作)テキストボックス(権限ID)、ラベル(権限の結果)
B,C,D.from(他社アプリ)いろいろなコントロールがある

---仕様---
Aアプリは、テキストボックスに権限IDを入力して、チェックOKなら、BCDアプリを起動するようにしてあります。
しかしながら、BCDアプリを立ち上げた経過後、ほかの人が入れ替わった場合は、Aアプリのテキストボックスに権限IDを入力する必要があります。
権限OKならBCDアプリを操作できますが、権限NGの場合は、Aアプリで権限IDのやり直し(BCDアプリはFromごとすべて操作禁止)するようにしたいのです。


これを下記のようにプログラムしてみました。


---Aアプリのソースコード---
 Private void MainForm_Deactivate(object sender, EventArgs e)
 {
     if(IDcheck()==false)//権限IDをチェック
     {
         MessageBox.Show("NGのため操作できません");
         this.Activate();
         this.textBoxID.Focus();//権限IDのやり直し
     }
 }

権限NGの場合を検証したところ、
最初はAアプリからBCDアプリをクリックすると、BCDアプリはアクティブさせずにAアプリにアクティブすることができましたが、
そのあと、BCDアプリをマウスでクリック(アクティブ)すると、なぜか操作できてしまいます。
※MainForm_Deactivateのソースコードにブレークポイントするとなぜか正常になっている・・・

この現象はどういうことが起きるのかわからないので、ご教示ください。。。

引用返信 編集キー/
■87161 / inTopicNo.2)  Re[1]: fromアクティブについて
□投稿者/ furu (166回)-(2018/04/18(Wed) 11:04:41)
No87159 (ピカチュウ さん) に返信

Formのアクティブで、他のプログラムの操作を禁止にするのは無理があると思います。

"NGのため操作できません"のメッセージが表示中にも
BCDアプリの操作は可能です。

引用返信 編集キー/
■87162 / inTopicNo.3)  Re[1]: fromアクティブについて
□投稿者/ 魔界の仮面弁士 (1647回)-(2018/04/18(Wed) 12:22:17)
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」を加えれば、
他のアプリよりも前面に表示されるようになります。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ