5

ユーザーが PC で開いたプログラムの名前と時間を記録する必要があるデスクトップ分析アプリケーションを実装しています。これは、ユーザーがログオンしたときに開始され、UI なしで実行される C# (WPF) アプリケーションです。Word や IE などのプログラムの場合、表示しているドキュメントや URL も取得します。

現在、次のような実用的なソリューションがあります。

マウス ダウン用の Windows フックをインストールします。そのイベントが発生したら、p-Invoke を使用して "GetForegroundWindow" を実行し、ウィンドウ ハンドルを使用して "GetWindowThreadProcessId" を実行します。ProcessId を使用すると、名前、開始時刻、および引数の開始リストを含む System.Diagnostics.Process オブジェクトを取得できます。履歴リストを維持しているので、このプロセス ID とウィンドウ ハンドルの組み合わせが以前に記録されていない場合にのみ、追跡エントリを書き込みます。

この解決策は問題なく機能しますが、マウス フックが必要です。このマウス フックは、通知がなくても Windows によってドロップされる可能性があり、まだフックされているかどうかを確認する機能もありません。言うまでもなく、この実装はハックのようです。

より簡単なアプローチがあれば、アドバイスしてください。

ありがとう。

4

2 に答える 2

12

__InstanceCreationEventイベントとWin32_ProcessWMI クラスを使用して、作成されたプロセスを監視できます。

このサンプル C# アプリケーションを試してください

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;


namespace GetWMI_Info
{
    public class EventWatcherAsync 
    {
        private void WmiEventHandler(object sender, EventArrivedEventArgs e)
        {
            //in this point the new events arrives
            //you can access to any property of the Win32_Process class
            Console.WriteLine("TargetInstance.Handle :    " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["Handle"]);
            Console.WriteLine("TargetInstance.Name :      " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["Name"]);

        }

        public EventWatcherAsync()
        {
            try
            {
                string ComputerName = "localhost";
                string WmiQuery;
                ManagementEventWatcher Watcher;
                ManagementScope Scope;                

                Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
                Scope.Connect();

                WmiQuery ="Select * From __InstanceCreationEvent Within 1 "+
                "Where TargetInstance ISA 'Win32_Process' ";

                Watcher = new ManagementEventWatcher(Scope, new EventQuery(WmiQuery));
                Watcher.EventArrived += new EventArrivedEventHandler(this.WmiEventHandler);
                Watcher.Start();
                Console.Read();
                Watcher.Stop();
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception {0} Trace {1}", e.Message, e.StackTrace);
            }

        }

        public static void Main(string[] args)
        {
           Console.WriteLine("Listening process creation, Press Enter to exit");
           EventWatcherAsync eventWatcher = new EventWatcherAsync();
           Console.Read();
        }
    }
}
于 2012-05-25T01:13:50.123 に答える
2

Windows で実行されているすべてのパフォーマンスを監視する場合は、PerformanceCounter クラスを使用します。アプリケーションが Windows を起動するたびに、アプリケーションの ProcessID、CPU 使用率、メモリ使用率、1 秒あたりの I/O 操作などを追跡するために、多数のパフォーマンス カウンターが作成されます。

たとえば、次のコードは Chrome のプロセス ID を提供します。

PerformanceCounter perf = new PerformanceCounter("Process", "ID Process", "chrome");
int procId = (int)perf.NextValue();

また、 PerformanceCounterCategory クラスを使用して、カテゴリ、インスタンス、およびカウンターを簡単に列挙することもできます。

Windows の PerfMon ツールを使用して、取得できる情報を把握できます。プロセスカテゴリ (PerfMonを使用) を確認すると、すべてのアクティブなプロセスのリストが表示されます。

于 2012-05-24T23:48:58.447 に答える