DOBON.NET DOBON.NETプログラミング掲示板過去ログ

スプラッシュ表示すると起動画面がアクティブにならない

環境/言語:[Win7/VS2008/VB]
分類:[.NET]

はじめまして。

EXEの起動時にスプラッシュスクリーンを採用しています。
([アプリケーションフレームワークを有効にする]-[スプラッシュスクリーン])

起動画面であるMDIフォームのLoadイベントにて別フォームを.ShowDialog
にて起動しています。Win7なら問題なく起動し操作もそのまま可能なのですが、
WinXPで実行するとフォームは表示されるのですがアクティブになりません。
フォームをクリックすると、アクティブになり操作可能になります。

Activateイベントで.ShowDialogをしても同様の結果でした。
また.Activate()や等の処理を入れてみましたが特に状況は変わりません。
アクティブに関するAPI等も組み込んでみましたが状況は変わりませんでした。

色々調査してみると、スプラッシュスクリーンを表示しない場合は問題がない事
が分かりました。本掲示板でも同様の記事がありましたが、いまいち解決方法が分かりませんでした。

スプラッシュ側でメイン画面をアクティブにする事で解決しましたとの記事が
ありましたが、実際のロジックの記載がなかったため、知識不足のためどのよう
に修正すればよいのか解決できませんでした。

どなたかご教授頂けると助かります。宜しくお願い致します。
> 起動画面であるMDIフォームのLoadイベントにて別フォームを.ShowDialog
> にて起動しています。Win7なら問題なく起動し操作もそのまま可能なのですが、
> WinXPで実行するとフォームは表示されるのですがアクティブになりません。

アクティブにならないフォームはShowDialogで表示するフォームのことでしょうか?

> 色々調査してみると、スプラッシュスクリーンを表示しない場合は問題がない事
> が分かりました。

スプラッシュスクリーンを表示して、別フォームのShowDialogを行わない場合は起動画面はアクティブになるでしょうか?

> 本掲示板でも同様の記事がありましたが、いまいち解決方法が分かりませんでした。

差し支えなければこの掲示板の過去の記事のURLを教えてもらえないでしょうか?

あと、例えば、起動画面のLoadイベントではなく、Shownイベントで別フォームのShowDialogを行うとどうでしょうか?
> 起動画面であるMDIフォームのLoadイベントにて別フォームを.ShowDialog
> にて起動しています。

ところで、Loadイベントにて別フォームを.ShowDialogしてしまうと、スプラッシュウィンドウがまだ開いているときにShowDialogが走ってしまいますが、
これはOKなのでしょうか?
(この時点では起動画面はまだ表示されず。)
早速のご回答ありがとうございます。

> アクティブにならないフォームはShowDialogで表示するフォームのことでしょう> か?

ShowDialogで表示するフォームです。
ShoInTaskBarもTrueに設定していますが、下のバーに表示されません。

> スプラッシュスクリーンを表示して、別フォームのShowDialogを行わない場合は> 起動画面はアクティブになるでしょうか?

アクティブになります。

> 差し支えなければこの掲示板の過去の記事のURLを教えてもらえないでしょうか?

http://dobon.net/vb/bbs/log3-36/22327.html
です。ちょっとパターンが違うかも知れませんが・・・。

> あと、例えば、起動画面のLoadイベントではなく、Shownイベントで別フォームのShowDialogを行うとどうでしょうか?

Shownイベントで表示してみましたが、同様でした。

> ところで、Loadイベントにて別フォームを.ShowDialogしてしまうと、スプラッシュウィンドウがまだ開いているときにShowDialogが走ってしまいますが、
> これはOKなのでしょうか?
> (この時点では起動画面はまだ表示されず。)

すいません。記載漏れですが、別途スプラッシュ画面を終了させるロジックを
作成しており、ShowDialogする前にCALLしています。
以下に終了処理を記載しておきます。
(これもどこからか引用したロジックです・・・)

Friend Sub psbFormClose()

If Not Me.IsDisposed AndAlso Me.IsHandleCreated Then
If Me.InvokeRequired Then
Me.Invoke(New EventHandler(AddressOf Me.sbFormClose), New Object() {"", Nothing})
Else
Me.sbFormClose("", Nothing)
End If
End If

End Sub

Private Sub sbFormClose(ByVal sender As Object, ByVal e As System.EventArgs)

Me.Close()

End Sub

以上ご確認、宜しくお願い致します。
> すいません。記載漏れですが、別途スプラッシュ画面を終了させるロジックを
> 作成しており、ShowDialogする前にCALLしています。
> 以下に終了処理を記載しておきます。
> (これもどこからか引用したロジックです・・・)
(コードは略)

このコードからも推測できるように、スプラッシュウィンドウは起動画面と別スレッドで動作していますので、
スプラッシュウィンドウが完全に閉じる前にShowDialogが起こっているため、フォームのアクティブがうまくいっていないのだと思います。

念のため確認しますが、スプラッシュウィンドウが開いている間は起動画面は開いているのでしょうか?
また、わざわざスプラッシュウィンドウの終了ロジックを作成したのは何か理由があるのでしょうか?
面倒なことをしなくとも、起動画面の起動準備ができるまではスプラッシュウィンドウが表示されたままになりますし、
スプラッシュウィンドウの最低表示時間も設定できます。
何か特別なことをやっているのでしょうか?
■No28936に返信(ブーマーさんの記事)
> このコードからも推測できるように、スプラッシュウィンドウは起動画面と別スレッドで動作していますので、
> スプラッシュウィンドウが完全に閉じる前にShowDialogが起こっているため、フォームのアクティブがうまくいっていないのだと思います。
>
> 念のため確認しますが、スプラッシュウィンドウが開いている間は起動画面は開いているのでしょうか?

> また、わざわざスプラッシュウィンドウの終了ロジックを作成したのは何か理由があるのでしょうか?
> 面倒なことをしなくとも、起動画面の起動準備ができるまではスプラッシュウィンドウが表示されたままになりますし、
> スプラッシュウィンドウの最低表示時間も設定できます。
> 何か特別なことをやっているのでしょうか?

スプラッシュウィンドウを表示している間は別画面は表示しない様にしています。
理由は、起動段階でいくつかのチェック処理があり、場合によりメッセージ
BOX等を表示する事があります。その際、スプラッシュ画面の後ろにメッセージ
BOXが隠れたりする現象があったため、終了ロジックを作り、何か画面を表示する際は終了させる様にしています。

現状、[スプラッシュ画面]表示後、起動画面のLOADイベントで
以下手順で処理しています。

@ [スプラッシュ画面]終了
A [ShowDialog()画面]表示
B 起動画面表示。

Aの画面はログインIDを設定する様な処理です。
ログインIDにより起動画面の表示内容が変わるため、起動画面を表示
する前にA画面を表示していると言うロジックになっております。

以上宜しくお願い致します。
ありがとうございました。なんとか解決?できました。

ブーマーさんのおっしゃるとおり、スプラッシュウィンドウを閉じる作業がうまく動作していなかった様です。

今まではShowDialog()する前にスプラッシュを閉じる処理を行っていましたが、
ShowDialog()画面のShownイベントでスプラッシュを閉じる処理をいれると、
アクティブになる様になりました。

解決かどうか微妙?ですが、ひとまずこれでいきたいと思います。
ブーマーさん。大変貴重なヒントを頂きありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板