none
KB3153199の不具合??モードレスで起動した画面が最背面で起動される(再現ソースあり) RRS feed

  • 質問

  • 長文失礼いたします。

    2016年5月に更新プログラムKB3153199を適用したところ、Windows8.1(64bit)環境で不正な動きをしました。
    モードレスで起動した画面が最前面に表示されなくなりました。
    解決方法を探していますが、見つかっておらず困っています。

    【アプリ概要】
    ・メイン画面(以下、画面A)にボタンを配置し、押下すると他画面(以下、画面B)を
     モードレスで起動する。複数起動可能。
    ・画面Aと画面Bの間に、(IEなど)別ものが挟まらないように、
     どちらかの画面がアクティブになったタイミングで、残りの画面の表示順を制御している。

    【問題点】
    画面Aのボタンを押下した際、更新プログラムの適用前までは画面Bが最前面で表示されていましたが、
    適用後は画面Aの後ろに回ってしまいました。

    【環境】
    開発環境:Windows7(32bit)
    VSバージョン:Visual Studio 2010 professional
    開発言語:VB.Net
    フレームワーク:.NET Framework 4
    実行環境:Windows8.1(64bit)およびWindows7(32bit)
          ※Windows7環境では、問題は発生しておりません。

    探した限りではKB3153199を適用したことで、アプリケーションに不具合が生じたような
    事例は見つけられておりません。
    KB3153199をアンインストールする以外に対応方法はないでしょうか?

    以下、再現用のサンプルソース(3つ)です。Designer.vbは割愛させていただいております。

    /////////////////////////ソース1ここから-->///////////////////////////////////
    Option Strict Off
    Option Explicit On
    Imports System.Windows.Forms
    Module modMain
        Public dspColl As New Collection
        Public dspFlg As Boolean = False
        Public Sub Main()
            'Main画面を表示
            Dim f As New frmMainmenu
            f.ShowDialog()
        End Sub
    End Module

    /////////////////////////ソース1ここまで<--///////////////////////////////////

    /////////////////////////ソース2ここから-->///////////////////////////////////
    Option Strict Off
    Option Explicit On
    Imports System.Windows.Forms
    Friend Class frmMainmenu
        Private Sub frmMainmenu_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
            dspColl.Add(Me)
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            '画面Bを表示
            Dim f As New Form2
            f.Show()
        End Sub
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            '自画面を閉じる
            Me.Close()
            Me.Dispose()
        End Sub
        Private Sub frmMainmenu_Activated(sender As Object, e As System.EventArgs) Handles Me.Activated
            Dim st As Form
            Dim sColl As New Collection
            If dspFlg = False Then
                '表示している画面をコレクションに格納する関数を呼び出し
                setDspCollection(dspColl, Me, sColl)
                dspColl.Clear()
                For Each st In sColl
                    dspColl.Add(st)
                Next
                '全画面をアクティブにする関数を呼び出し
                setFrmActivate(dspColl, Me)
            End If
        End Sub
        Public Sub setFrmActivate(nColl As Collection, frm As Form)
            Dim st As Form
            dspFlg = True
            '表示している画面を順にアクティブにする
            For Each st In nColl
                st.Activate()
            Next
            '自画面をアクティブにする
            frm.Activate()
            dspFlg = False
        End Sub
        Public Sub setDspCollection(nColl As Collection, frm As Form, reColl As Collection)
            Dim st As Form
            '表示している画面を順番にコレクションに格納
            For Each st In nColl
                If st.IsHandleCreated = True Then
                    '自画面はコレクションに格納しない
                    If st.Handle <> frm.Handle Then
                        reColl.Add(st)
                    End If
                End If
            Next
            '自画面をコレクションに格納する
            reColl.Add(frm)
        End Sub
    End Class

    /////////////////////////ソース2ここまで<--///////////////////////////////////

    /////////////////////////ソース3ここから-->///////////////////////////////////
    Option Strict Off
    Option Explicit On
    Imports System.Windows.Forms
    Friend Class Form2
        Private Sub form2_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
            dspColl.Add(Me)
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            '自画面を閉じる
            Me.Close()
            Me.Dispose()
        End Sub
        Private Sub Form2_Activated(sender As Object, e As System.EventArgs) Handles Me.Activated
            Dim st As Form
            Dim sColl As New Collection
            If dspFlg = False Then
                '表示している画面をコレクションに格納する関数を呼び出し
                setDspCollection(dspColl, Me, sColl)
                dspColl.Clear()
                For Each st In sColl
                    dspColl.Add(st)
                Next
                '全画面をアクティブにする関数を呼び出し
                setFrmActivate(dspColl, Me)
            End If
        End Sub
        Public Sub setFrmActivate(nColl As Collection, frm As Form)
            Dim st As Form
            dspFlg = True
            '表示している画面を順にアクティブにする
            For Each st In nColl
                st.Activate()
            Next
            '自画面をアクティブにする
            frm.Activate()
            dspFlg = False
        End Sub
        Public Sub setDspCollection(nColl As Collection, frm As Form, reColl As Collection)
            Dim st As Form
            '表示している画面を順番にコレクションに格納
            For Each st In nColl
                If st.IsHandleCreated = True Then
                    '自画面はコレクションに格納しない
                    If st.Handle <> frm.Handle Then
                        reColl.Add(st)
                    End If
                End If
            Next
            '自画面をコレクションに格納する
            reColl.Add(frm)
        End Sub
    End Class

    /////////////////////////ソース3ここまで<--///////////////////////////////////
    2016年5月27日 2:46

回答

  • こんにちは、TKsen_MMPYT さん
    フォーラムオペレータの佐伯 玲 です。

    以下のVisual Basicフォーラムでも同様のご投稿いただいているようですが基本的には複数スレッドでご質問されると情報が分散してしまいますのでできればどちらかに絞ってご質問されたほう良いかと思います。

    KB3153199の不具合??モードレスで起動した画面が最背面で起動される(再現ソースあり)
    https://social.msdn.microsoft.com/Forums/ja-JP/024f88b8-800f-439b-8ee5-3ae7d263eb59/kb3153199?forum=vbgeneralja


    また時として同様の内容を複数投稿するマルチポストはマナー違反等とされる場合もございますのでご注意ください。

    通常は解決に至った際には解決した旨ご返信いただき回答としてマークを設定することでスレッドをクローズしていただくようお願い致しますが
    もしどちらかのスレッドへ絞ってご質問をご継続いただく際には使用なさらない方のスレッドをひとまずクローズいただけましたらと思います。


    ご確認の程宜しくお願い致します。

    TechNet Community Support 佐伯 玲

    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:14
    • 回答としてマークされていない TKsen_MMPYT 2016年5月27日 8:14
    • 回答としてマーク 佐伯玲 2016年5月27日 8:28
    2016年5月27日 6:00
  • フォーラムオペレータ 佐伯様

    承知しました。TechNetのほうはクローズいたします。まだクローズの仕方が分かっていないのですが、もし管理者権限でクローズ可能でしたら、実施していただいて問題ございません。

    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:37
    2016年5月27日 8:17
  • ご確認ありがとうございます。

    回答としてマークを設定するとスレッドのステータスが「回答済み」となりクローズ状態となります。
    Visual Basicフォーラムのほうでも解決に至ったり区切りがついた際にはご活用くださいね。

    宜しくお願い致します。

    TechNet Community Support 佐伯 玲

    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:32
    2016年5月27日 8:29
  • 承知いたしました。ご教授ありがとうございます。
    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:34
    2016年5月27日 8:33

すべての返信

  • こんにちは、TKsen_MMPYT さん
    フォーラムオペレータの佐伯 玲 です。

    以下のVisual Basicフォーラムでも同様のご投稿いただいているようですが基本的には複数スレッドでご質問されると情報が分散してしまいますのでできればどちらかに絞ってご質問されたほう良いかと思います。

    KB3153199の不具合??モードレスで起動した画面が最背面で起動される(再現ソースあり)
    https://social.msdn.microsoft.com/Forums/ja-JP/024f88b8-800f-439b-8ee5-3ae7d263eb59/kb3153199?forum=vbgeneralja


    また時として同様の内容を複数投稿するマルチポストはマナー違反等とされる場合もございますのでご注意ください。

    通常は解決に至った際には解決した旨ご返信いただき回答としてマークを設定することでスレッドをクローズしていただくようお願い致しますが
    もしどちらかのスレッドへ絞ってご質問をご継続いただく際には使用なさらない方のスレッドをひとまずクローズいただけましたらと思います。


    ご確認の程宜しくお願い致します。

    TechNet Community Support 佐伯 玲

    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:14
    • 回答としてマークされていない TKsen_MMPYT 2016年5月27日 8:14
    • 回答としてマーク 佐伯玲 2016年5月27日 8:28
    2016年5月27日 6:00
  • フォーラムオペレータ 佐伯様

    承知しました。TechNetのほうはクローズいたします。まだクローズの仕方が分かっていないのですが、もし管理者権限でクローズ可能でしたら、実施していただいて問題ございません。

    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:37
    2016年5月27日 8:17
  • ご確認ありがとうございます。

    回答としてマークを設定するとスレッドのステータスが「回答済み」となりクローズ状態となります。
    Visual Basicフォーラムのほうでも解決に至ったり区切りがついた際にはご活用くださいね。

    宜しくお願い致します。

    TechNet Community Support 佐伯 玲

    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:32
    2016年5月27日 8:29
  • 承知いたしました。ご教授ありがとうございます。
    • 回答としてマーク TKsen_MMPYT 2016年5月27日 8:34
    2016年5月27日 8:33