5

通知領域にあるこの Windows フォーム アプリケーションがあります。アイコンをクリックすると前面に表示され、もう一度クリック (またはアプリ X アイコンをクリック) すると元に戻ります。これは、アイコンをクリックして表示するときにウィンドウを常に手前に表示することが重要なタイプのアプリです (オプションですが)。

アイコンを右クリックするとコンテキスト メニューが表示され、[常に手前に表示] オプションを有効にするかどうかを選択できます。アプリケーションが最初に起動すると、アプリケーションの設定が XML ファイルから読み取られます。これが正常に機能していることは 99% で、TopMostプロパティは適切に読み取られます (および書き込まれます)。

しばらくすると(分、時間、日など、通常は休止状態になり、シャットダウンすることはめったにありません)、TopMost 動作が停止します。オプションを変更しません。オプションの値が変更されているとは思いませんが、通知領域のアイコンをクリックすると、アプリが前面に表示されません。表示されますが、背景にあります (Alt+Tab で表示されます)。本来あるべき「常に一番上」ではありません。コンテキストメニューを表示し、オプションを無効にして(有効になっているため)、再度有効にすると、その後動作し始めます。アプリは「常に一番上」になりました。ただし、しばらくするといつでもこの能力を失う可能性があります。

なぜこれが起こるのか、どのように起こるのか理解できません。誰かが理由を知っていますか?そうでない場合、そのような動作をデバッグするにはどうすればよいですか?

編集:プロパティが変更され
たときに MessageBox を表示するコードを追加して、奇妙な動作に気付くことができるかどうかを確認しましたが、うまくいきませんでした。TopMostフォームは付いていたので役に立ちませんでしたTopMost = trueが、まだバックグラウンドにありました...

4

2 に答える 2

5

「最上位」ウィンドウは 1 つだけではありません。Topmost は、「最上位以外のすべてのウィンドウの前」と言うだけです。

SetWindowPos(hwnd, HWND_TOPMOST, ...)デスクトップの再初期化 (休止状態など)には、別の (基になる Win32 API 呼び出し) が必要であると確信しています。

回避策として、ウィンドウを表示するときにプロパティをリセットして再度設定することができます。

もう 1 つの可能性は、ウィンドウを非表示にすると Z オーダーも変更されることです。Win32 がそれを実装する方法を暗黙的に変更するか、WinForms が非表示/表示ウィンドウを呼び出す方法で明示的に変更します。

于 2010-05-11T14:11:58.737 に答える
1

peterchen のように、根本的な原因を突き止める方法もわかりません。でも、もう少しシンプルにしてみませんか?

アイコンをクリックすると、ウィンドウが表示され、TopMost がまだアクティブであることを確認できます。SetWindowPos()ウィンドウを表示する直前に、現在の設定で呼び出してみませんか。これにより、パフォーマンスの問題 (ユーザーがアイコンをクリックした場合にのみ発生) やその他の副作用は発生しません。

根本的な原因を突き止めることができるのは素晴らしいことですが、そのような小さな回避策で解決できるのであれば、価値がないかもしれません。

于 2010-05-12T11:36:15.263 に答える