none
Microsoft Edgeが起動時のVBアプリへの影響(Zオーダーの状態)について RRS feed

  • 質問

  • 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の方が有効になっているようにもみえます。

    何か解決方法ありましたらよろしくお願い致します。

    2017年6月28日 6:13

回答

  • ご返信ありがとうございます。

    構成上対応が難しいということですね。
    すみませんが、こちらではどの部分の修正が可能で、どの部分が不可なのかの把握が難しいので、上記のコードでは、フォームを表示・非表示にする微妙なタイミングで現象が再現したり再現しなく出来たりする。という程度に受け取っていただければと思います。

    Me.TopMost については、恒久的に True とするのではなく、一時的に True に設定した直後 False を設定することで、Microsoft Edge の手前に持ってくることができました。BringWindowToTop の処理もそうですが、クライアント領域のクリックしたときに処理が走るようにしたところ、Microsoft Edge の後ろに隠れてしまう状態になった際、クライアント領域をクリックして Microsoft Edge の手前に移動することができました(処理を行わない場合は、クライアント領域をクリックしても Microsoft Edge の後ろに隠れたままでした)。タイマーか何かを使って、フォームがアクティブのときに、このような処理を呼び出すことで Microsoft Edge の手前に表示してやることができるのではと思いました。

    Microsoft Edgeの不具合と言ってしまえればよいのですが
    本現象は、Microsoft Edge に限らず、どうもストアアプリ全般で再現するようです。「天気」、「ストア」のアプリで確認しました。
    2017年6月29日 4:20

すべての返信

  • すみません。同じ現象かどうかわかりませんが、下記のようなプログラムで、親画面(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
    2017年6月28日 8:10
  • 早々にご回答ありがとうございます。

    実際のアプリでは画面の構成上、同じDLL内からのボタンクリックによる子画面表示の場合もあれば、

    別の子画面(DLL)を表示するといった構成となっている箇所もあり、今からでは、ご提示頂いた対応

    は難しい状況です。

    加えて、Me.TopMostについてもご提案頂きましたが、その場合は必ず最前面に表示されて

    しまう為、子画面起動中は別の画面(EXCELであったり、IEであったり)が必ず下に隠れて

    しまうので難しい状況です。

    BringWindowToTopも試してみましたが、事象は再現してしまうことを確認しました。

    Microsoft Edgeの不具合と言ってしまえればよいのですが・・・

    2017年6月29日 0:52
  • ご返信ありがとうございます。

    構成上対応が難しいということですね。
    すみませんが、こちらではどの部分の修正が可能で、どの部分が不可なのかの把握が難しいので、上記のコードでは、フォームを表示・非表示にする微妙なタイミングで現象が再現したり再現しなく出来たりする。という程度に受け取っていただければと思います。

    Me.TopMost については、恒久的に True とするのではなく、一時的に True に設定した直後 False を設定することで、Microsoft Edge の手前に持ってくることができました。BringWindowToTop の処理もそうですが、クライアント領域のクリックしたときに処理が走るようにしたところ、Microsoft Edge の後ろに隠れてしまう状態になった際、クライアント領域をクリックして Microsoft Edge の手前に移動することができました(処理を行わない場合は、クライアント領域をクリックしても Microsoft Edge の後ろに隠れたままでした)。タイマーか何かを使って、フォームがアクティブのときに、このような処理を呼び出すことで Microsoft Edge の手前に表示してやることができるのではと思いました。

    Microsoft Edgeの不具合と言ってしまえればよいのですが
    本現象は、Microsoft Edge に限らず、どうもストアアプリ全般で再現するようです。「天気」、「ストア」のアプリで確認しました。
    2017年6月29日 4:20
  • 早々にご回答頂きありがとうございます。

    ご丁寧な回答恐れ入ります。

    なるほど、Me.TopMostのTrue、Falseの切り替えを連続で行うのですね。

    そこは勘違いして試しておりました。

    当該の事象がMicrosoft Edge起動中に発生したものであった為、そこだけを

    みておりましたが、他のでも発生しうるのですね。

    頂いたご意見を参考に対策を検討してみます。

    ありがとうございました。

    2017年6月30日 0:27