4

私はアプリケーション デスクトップ ツールバー (別名 AppBar) を作成しました。プロセスを強制終了すると、AppBar コードは ABM_REMOVE を送信してクリーンアップする機会を得られないという事実を除いて、うまく機能します。問題は、これが基本的にユーザーのデスクトップを台無しにすることです。AppBar は相互運用コードを使用して .NET で記述されています。

タスクマネージャーからプロセスが強制終了された場合でも、このリソースをクリーンアップする方法を知っている人はいますか?

4

1 に答える 1

3

プロセスがタスク マネージャーから強制終了されると、そのアプリケーション内でイベントは発生しません。プロセスの 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(); 
    } 
}
于 2008-11-25T19:45:48.943 に答える