質問

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

TaskManagerからプロセスを強制終了した場合でも、このリソースをクリーンアップする方法を知っている人はいますか?

役に立ちましたか?

解決

プロセスがタスクマネージャーから強制終了されると、そのアプリケーション内でイベントは発生しません。プロセスの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(); 
    } 
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top