进程终止后清理AppBar

时间:2008-11-21 02:30:55

标签: c# .net appbar

我已经编写了一个应用程序桌面工具栏(a.k.a AppBar),它的效果很好,除非我杀死进程,AppBar代码永远不会有机会通过发送ABM_REMOVE进行清理。问题是,这基本上会破坏用户桌面。 AppBar是使用互操作代码在.NET中编写的。

有没有人知道清理此资源的方法,即使在从TaskManager中删除进程的情况下也是如此?

1 个答案:

答案 0 :(得分: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(); 
    } 
}