トップ回答者
Microsoft Edgeが起動時のVBアプリへの影響(Zオーダーの状態)について

質問
-
Windows10Pro 64bit、VisualStudio2015(VB.NET)にて開発を行っております。
以下の事象が発生し、解決の目処が立っておらず、方法がありましたらご教授ください。
VB.NETで作成しているアプリはボタンクリックで親画面をHIDEしてから、ShowDialogで子画面を表示する。
その後、子画面を閉じて戻ってきた際に親画面をShowするといった動作を行います。
手順1.
VB.NETで作成した画面を起動しする
手順2.
Microsoft Edgeを起動する
手順3.
手順1で起動したアプリでボタンをクリックし、子画面を表示させる。
手順4.
手順3で表示した子画面を閉じて、親画面に戻る。
と、上記の手順を行った際に、Microsoft Edgeが最前面に表示され、VBの画面がその裏に隠れてしまう
事象が発生する場合があります。
その場合、VBの画面自体は有効でボタンをクリックすれば子画面を表示する動作を行いますが、
Microsoft Edgeが最前面表示なのは変わりません。
一度、Microsoft EdgeをクリックしてからVBの画面をクリックするとそちらが最前面に表示されます。
画面的にはVBの画面が有効な状態であるにも関わらずMicrosoft Edgeの方が有効になっているようにもみえます。
何か解決方法ありましたらよろしくお願い致します。
回答
-
ご返信ありがとうございます。
構成上対応が難しいということですね。
すみませんが、こちらではどの部分の修正が可能で、どの部分が不可なのかの把握が難しいので、上記のコードでは、フォームを表示・非表示にする微妙なタイミングで現象が再現したり再現しなく出来たりする。という程度に受け取っていただければと思います。Me.TopMost については、恒久的に True とするのではなく、一時的に True に設定した直後 False を設定することで、Microsoft Edge の手前に持ってくることができました。BringWindowToTop の処理もそうですが、クライアント領域のクリックしたときに処理が走るようにしたところ、Microsoft Edge の後ろに隠れてしまう状態になった際、クライアント領域をクリックして Microsoft Edge の手前に移動することができました(処理を行わない場合は、クライアント領域をクリックしても Microsoft Edge の後ろに隠れたままでした)。タイマーか何かを使って、フォームがアクティブのときに、このような処理を呼び出すことで Microsoft Edge の手前に表示してやることができるのではと思いました。
Microsoft Edgeの不具合と言ってしまえればよいのですが
本現象は、Microsoft Edge に限らず、どうもストアアプリ全般で再現するようです。「天気」、「ストア」のアプリで確認しました。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月5日 7:02
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年7月20日 2:29
すべての返信
-
すみません。同じ現象かどうかわかりませんが、下記のようなプログラムで、親画面(Form1)を表示後、Microsoft Edge をクリックしアクティブにした状態で、親画面のボタンをクリックすると、子画面(Form2)が Microsoft Edge の下に隠れてしまい、子画面をクリックしても Microsoft Edge の下に隠れたままで子画面が最前面に表示されない現象となりました。
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Form2.ShowDialog() End Sub End Class Public Class Form2 Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load Form1.Hide() End Sub Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed Form1.Show() End Sub End Class
Form2 のコードを下記のように、親画面を非表示にするタイミングを Form_Load から Form_Shown 変えたところ、現象が改善しました。
Public Class Form2 Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown Form1.Hide() End Sub Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed Form1.Show() End Sub End Class
想像ですが、一瞬でも親画面・子画面の両方が表示されないタイミングがあると、Microsoft Edge が最前面に表示されてしまう状態になるのかもしれません。Microsoft Edge が最前面に表示されてしまう状態になった場合、下記のようなコードでフォームを Microsoft Edge よりも手前に移動させることができるようです。
Me.TopMost = True Me.TopMost = False ' または、API の BringWindowToTop を使って BringWindowToTop(Me.Handle)
参考サイト: https://dobon.net/vb/dotnet/process/appactivate.html- 編集済み kenjinoteMVP 2017年6月28日 8:51
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年6月29日 0:15
-
早々にご回答ありがとうございます。
実際のアプリでは画面の構成上、同じDLL内からのボタンクリックによる子画面表示の場合もあれば、
別の子画面(DLL)を表示するといった構成となっている箇所もあり、今からでは、ご提示頂いた対応
は難しい状況です。
加えて、Me.TopMostについてもご提案頂きましたが、その場合は必ず最前面に表示されて
しまう為、子画面起動中は別の画面(EXCELであったり、IEであったり)が必ず下に隠れて
しまうので難しい状況です。
BringWindowToTopも試してみましたが、事象は再現してしまうことを確認しました。
Microsoft Edgeの不具合と言ってしまえればよいのですが・・・
-
ご返信ありがとうございます。
構成上対応が難しいということですね。
すみませんが、こちらではどの部分の修正が可能で、どの部分が不可なのかの把握が難しいので、上記のコードでは、フォームを表示・非表示にする微妙なタイミングで現象が再現したり再現しなく出来たりする。という程度に受け取っていただければと思います。Me.TopMost については、恒久的に True とするのではなく、一時的に True に設定した直後 False を設定することで、Microsoft Edge の手前に持ってくることができました。BringWindowToTop の処理もそうですが、クライアント領域のクリックしたときに処理が走るようにしたところ、Microsoft Edge の後ろに隠れてしまう状態になった際、クライアント領域をクリックして Microsoft Edge の手前に移動することができました(処理を行わない場合は、クライアント領域をクリックしても Microsoft Edge の後ろに隠れたままでした)。タイマーか何かを使って、フォームがアクティブのときに、このような処理を呼び出すことで Microsoft Edge の手前に表示してやることができるのではと思いました。
Microsoft Edgeの不具合と言ってしまえればよいのですが
本現象は、Microsoft Edge に限らず、どうもストアアプリ全般で再現するようです。「天気」、「ストア」のアプリで確認しました。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月5日 7:02
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年7月20日 2:29