トップ回答者
KB3153199の不具合??モードレスで起動した画面が最背面で起動される(再現ソースあり)

質問
-
長文失礼いたします。
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ここから-->///////////////////////////////////
/////////////////////////ソース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 Class2016年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 さん
フォーラムオペレータの佐伯 玲 です。
以下の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 -