4
我已經編寫了一個應用程序桌面工具欄(a.k.a AppBar),除非事實發生,如果我終止進程,AppBar代碼將永遠無法通過發送ABM_REMOVE進行清理。問題在於,這基本上將用戶桌面搞砸了。 AppBar是使用互操作代碼以.NET編寫的。刪除進程後清理AppBar
有沒有人知道一種方法來清理這個資源,即使在從TaskManager中進程kill的情況下?
我已經編寫了一個應用程序桌面工具欄(a.k.a AppBar),除非事實發生,如果我終止進程,AppBar代碼將永遠無法通過發送ABM_REMOVE進行清理。問題在於,這基本上將用戶桌面搞砸了。 AppBar是使用互操作代碼以.NET編寫的。刪除進程後清理AppBar
有沒有人知道一種方法來清理這個資源,即使在從TaskManager中進程kill的情況下?
當進程從任務管理器中被終止時,該應用程序中不會引發任何事件。通常使用獨立的幫助應用程序來偵聽您的進程的Win32_ProcessStopTrace事件。您可以使用WqlEventQuery,這是System.Management的一部分。
這是a MegaSolutions post的一些示例代碼。
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();
}
}