2008-11-21 71 views
4

我已經編寫了一個應用程序桌面工具欄(a.k.a AppBar),除非事實發生,如果我終止進程,AppBar代碼將永遠無法通過發送ABM_REMOVE進行清理。問題在於,這基本上將用戶桌面搞砸了。 AppBar是使用互操作代碼以.NET編寫的。刪除進程後清理AppBar

有沒有人知道一種方法來清理這個資源,即使在從TaskManager中進程kill的情況下?

回答

3

當進程從任務管理器中被終止時,該應用程序中不會引發任何事件。通常使用獨立的幫助應用程序來偵聽您的進程的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(); 
    } 
}