0

環境:

Windows 8.1でVS2010 .NET 4.0を使用してC#でスクリーンセーバーを開発しています。初期ロード時にデータベースにアクセスし、マルチモニターに表示する前にいくつかの画像処理を行うなど、非常に「ビジー」です。

問題:

ほとんどの場合、プロセスは a) /s モードでマウス/キーボードを動かしたとき、または /p モードで desk.cpl を閉じたときに、正常にシャットダウンします。/p モード (desk.cpl を開く) で実行し、"設定" (/c モード) または "プレビュー" (/s モード) のいずれかを実行すると、問題が発生すると考えられます。これらの新しいプロセスが閉じられると、/p モードは期待どおりに戻りますが、desk.cpl が閉じられると、/p モード プロセスは引き続き実行されます。 ただし、これは断続的です。閉じることもあれば、閉じないこともあります。

/p モードでは、マウスの移動などでフォームを明示的に閉じません。これは、desk.cpl プレビュー ウィンドウには適していないためです。したがって、私の想定では、desk.cpl は私のプロセスを強制終了しますが、これは一貫して発生していないようです。

質問:

/p モードが確実に確実に終了するようにするにはどうすればよいですか?

4

1 に答える 1

0

2 つの方法。WM_DESTROY のメッセージ ポンプを監視してそれを閉じるか、タイマーを設定して、ウィンドウが表示されなくなったかどうかを監視することができます。コントロール パネルが代わりに表示される (閉じるか、ユーザーが新しいスクリーン セーバーを選択する) と、ウィンドウは非表示になり、破壊されたと思います。あなたはスクリーン セーバーであるため、永久にハングアップするよりも、早期に中止する方がリスクが低いように思われます。

そのため、非フォーム タイマーを設定し (ウィンドウが破棄されるとフォーム タイマーが破棄される場合があります)、定期的にチェックしてください。また、誰かがあなたの質問へのコメントで指摘しているように、GetParent を監視して、それが変化するかどうかを確認することもできます。

于 2014-08-25T04:33:36.930 に答える