1

この問題にこれ以上時間を割きたくはありませんが、この問題について読むことに興味があり、答えを知っている場合は、返信してください。前もって感謝します。

ShowInTaskbar を False に設定して、別の Windows フォーム アプリケーションを最小化モードで起動する Windows フォーム アプリケーションがあります。最初のアプリケーションには、次のメソッドを使用して他のアプリケーションを表示する [表示] ボタンがあります。

        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        SetForegroundWindow(WindowHandle)

2 番目のアプリケーションでアクティブ化イベントを使用して、アクティブ化されたときにそのフォームを更新しています。問題は、多くの場合、フォームがアクティブ化されたときに activate イベントが発生しないことです。非表示のフォームが表示され、アクティブ化されますが、アクティブ化イベント ハンドラーは呼び出されません。最初のアプリケーションは MDI アプリケーションですが、それがどのように影響するかわかりません。

2 番目のフォームには、それを非表示にするボタンがあります。このボタンは、フォームの Hide メソッドを呼び出すだけで、フォームを最小化しません。次に最初のアプリケーションで Show ボタンが押されると、2 番目のアプリケーションの activate イベントが発生します。2 番目のアプリケーションの ShowInTask バーを True に設定しても役に立ちません。ウィンドウを非表示にする代わりに最小化しても、アプリケーションが 2 回目にアクティブ化されたときに Activate イベントが発生するのを防ぐことはできません。

4

3 に答える 3

0

さて、最小化された非表示のウィンドウが初めて表示されてアクティブになったときに、フォームの Activated イベント ハンドラーが確実に起動しない理由を突き止めようとしています。考えられるすべての ShowWindow コマンドの組み合わせを試しました。タイミングの問題に備えて、タイマーとスリープを導入してみました。最小化されたウィンドウが表示されるたびに、Activated イベントが確実に発生しない可能性があり、その発生しないことは、ウィンドウが非表示になっているという事実とは関係がない可能性があります。これらのケースはテストしていません。

次のコードは、Activate イベントの代わりに VisibleChanged イベントを使用して毎回動作させることができる唯一のコードです。

        If IsIconic(WindowHandle) Then
            ShowWindow(WindowHandle, ShowWindowCommands.Normal)
            ShowWindow(WindowHandle, ShowWindowCommands.Hide)
        End If
        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        SetForegroundWindow(WindowHandle)
于 2012-08-29T15:13:00.257 に答える
0

問題の原因はまだわかりませんが、次のコードを使用し、フォームの Activated イベントではなく VisibleChanged イベントに切り替えることで問題を回避できました。

        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        ShowWindow(WindowHandle, ShowWindowCommands.Hide)
        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        SetForegroundWindow(WindowHandle)

上記のコードでは、VisibleChanged イベントは 1 回だけ発生することに注意してください。

于 2012-08-28T19:14:32.970 に答える
0

これは、 Activate イベントが表示されている Windows 用であるためだと思われます。MSDNのドキュメントから(私の強調):

フォームをアクティブにすると、アクティブなアプリケーションの場合はフォームが前面に表示され、アクティブなアプリケーションでない場合はウィンドウのキャプションが点滅します。このメソッドが有効になるには、フォームが表示されている必要があります。アプリケーションでアクティブなフォームを確認するには、フォームがマルチ ドキュメント インターフェイス (MDI) アプリケーションにある場合は、ActiveForm プロパティまたは ActiveMdiChild プロパティを使用します。

別の方法として、最初のアプリケーションが 2 番目のアプリケーションにキーの組み合わせを送信して、コンテンツの更新をトリガーすることもできます。

于 2012-08-28T16:42:54.607 に答える