2

Microsoft Windows APIコードパックを利用するC#アプリケーションがあります。特に、ストレージデバイスとメディアの挿入と削除を監視するために使用するShellExtensionsがあります。

ただし、Visual C#2010(Express)でアプリを閉じようとすると、デバッガーを手動で停止する必要があります。ShellObjectWatcherを手動で破棄した場合でも、WinAPIコードパックにバックグラウンドループがまだ実行されているようです。私がそれを殺すことができる唯一の方法は、デバッガーを手動で停止することです。

アプリはWPFに組み込まれています。

最終的に、VisC#2010は、デバッガーでアプリを実行しようとすることを諦めます。デバッグを開始するように指示しましたが、開始しません。再開する唯一の方法は、タスクマネージャーを使用してアプリを強制終了し、VC#2010をシャットダウンしてコーヒーを飲みに行ってから再起動することです。奇数。アプリをクリーンアップしようとしたときにシャットダウンされていない、隠れたプロセスまたはウィンドウがぶら下がっていると思われます。

このShellObjectWatcherをもう少し効果的にクリーンアップする方法はありますか?

4

3 に答える 3

2

コードパックシェルプロジェクトのバグを修正するには、次の行に1行追加しMessageListener.WndProc()ます。

case (uint)WindowMessage.Destr​oy:
 **_running = false;**
 break;

ThreadMethod()メッセージループを終了します。

于 2013-05-24T20:25:03.367 に答える
1

OKを使用System.Environment.Exit(0);すると、この問題が修正されます。アプリがシャットダウンし、デバッガーが制御を解放します。この場合、ブルートフォースが機能します。

于 2012-02-17T07:45:22.077 に答える
0

私は同じ問題にぶつかりましたが、スレッドをバックグラウンドスレッドとして設定することで解決しました(つまり、アプリケーションが停止すると強制終了されます)。

MessageListener.csコンストラクターの40行目で、次のようになります。

_windowThread = new Thread(ThreadMethod);
// The line below will force the thread to terminate when the app exits.
_windowThread.IsBackground = true;
_windowThread.SetApartmentState(ApartmentState.STA);
于 2013-12-10T13:09:33.757 に答える