質問
アプリケーションデスクトップツールバー(別名:AppBar)を作成しましたが、プロセスを強制終了すると、AppBarコードがABM_REMOVEを送信してクリーンアップする機会を得られないという事実を除いて、非常にうまく機能します。問題は、これが基本的にユーザーのデスクトップを台無しにすることです。 AppBarは、相互運用コードを使用して.NETで記述されています。
TaskManagerからプロセスを強制終了した場合でも、このリソースをクリーンアップする方法を知っている人はいますか?
解決
プロセスがタスクマネージャーから強制終了されると、そのアプリケーション内でイベントは発生しません。プロセスのWin32_ProcessStopTraceイベントをリッスンする別個のヘルパーアプリケーションを使用するのが一般的です。このためのSystem.Managementの一部であるWqlEventQueryを使用できます。
MegaSolutionsの投稿のサンプルコードを次に示します。 。
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
class ProcessObserver : IDisposable
{
ManagementEventWatcher m_processStartEvent = null;
ManagementEventWatcher m_processStopEvent = null;
public ProcessObserver(string processName, EventArrivedEventHandler onStart, EventArrivedEventHandler onStop)
{
WqlEventQuery startQuery = new WqlEventQuery("Win32_ProcessStartTrace", String.Format("ProcessName='{0}'", processName));
m_processStartEvent = new ManagementEventWatcher(startQuery);
WqlEventQuery stopQuery = new WqlEventQuery("Win32_ProcessStopTrace", String.Format("ProcessName='{0}'", processName));
m_processStopEvent = new ManagementEventWatcher(stopQuery);
if (onStart != null)
m_processStartEvent.EventArrived += onStart;
if (onStop != null)
m_processStopEvent.EventArrived += onStop;
}
public void Start()
{
m_processStartEvent.Start();
m_processStopEvent.Start();
}
public void Dispose()
{
m_processStartEvent.Dispose();
m_processStopEvent.Dispose();
}
}
所属していません StackOverflow