Domanda

Ho scritto una barra degli strumenti di Application Desktop (a.k.a AppBar), funziona benissimo, tranne per il fatto che se uccido il processo, il codice AppBar non ha mai la possibilità di ripulire inviando un ABM_REMOVE. Il problema è che questo fondamentalmente rovina il desktop degli utenti. L'AppBar è scritta in .NET usando il codice di interop.

Qualcuno sa come ripulire questa risorsa, anche nel caso di un kill di processo da TaskManager?

È stato utile?

Soluzione

Quando un processo viene interrotto da Task Manager, nessun evento viene generato all'interno di quell'applicazione. È comune utilizzare un'applicazione helper separata che ascolta l'evento Win32_ProcessStopTrace per il processo. È possibile utilizzare WqlEventQuery, che fa parte di System.Management per questo.

Ecco un esempio di codice per questo da un post 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(); 
    } 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top