2012-01-31 8 views
0

プログラムが起動したかどうかを監視するWindowsアプリケーションを開発したいとします。私はそれがオンになっているかどうかを確認するためにプロセスをポーリングすることができますが、これが最善の解決策であるとは確信していません。プログラムが起動しているかどうかを確認する

私はグローバルシステムフックを検討していましたが、何時間も探してから、私が始めた時よりも混乱しました。チュートリアルの指針は、私がしたいことや、いくつかのアイデアを行う方法についてです。これはグローバルなフックを必要とするものなのでしょうか?

私はC#またはC++を使用しても構いませんので、関連するチュートリアルやマニュアルのいずれかを自由に指摘してください。

おかげで(ポーリングを使用)

答えて

0

チェックプロセス情報

Process [] processes = Process.GetProcessesByName("notepad"); 
if(processes.Length > 0) 
    processes[0].StartTime; 

ネイティブのWindows(WMI)APIを使用してイベントを登録します。

using System; 
using System.ComponentModel; 
using System.Collections; 
using System.Globalization; 
using System.Management; 

namespace WMI.Win32 
{ 
    public delegate void ProcessEventHandler(Win32_Process proc); 
    public class ProcessWatcher : ManagementEventWatcher 
    { 
     // Process Events 
     public event ProcessEventHandler ProcessCreated; 
     public event ProcessEventHandler ProcessDeleted; 
     public event ProcessEventHandler ProcessModified; 

     // WMI WQL process query strings 
     static readonly string WMI_OPER_EVENT_QUERY = @"SELECT * FROM 
__InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"; 
     static readonly string WMI_OPER_EVENT_QUERY_WITH_PROC = 
      WMI_OPER_EVENT_QUERY + " and TargetInstance.Name = '{0}'"; 

     public ProcessWatcher() 
     { 
      Init(string.Empty); 
     } 
     public ProcessWatcher(string processName) 
     { 
      Init(processName); 
     } 
     private void Init(string processName) 
     { 
      this.Query.QueryLanguage = "WQL"; 
      if (string.IsNullOrEmpty(processName)) 
      { 
       this.Query.QueryString = WMI_OPER_EVENT_QUERY; 
      } 
      else 
      { 
       this.Query.QueryString = 
        string.Format(WMI_OPER_EVENT_QUERY_WITH_PROC, processName); 
      } 

      this.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); 
     } 
     private void watcher_EventArrived(object sender, EventArrivedEventArgs e) 
     { 
      string eventType = e.NewEvent.ClassPath.ClassName; 
      Win32_Process proc = new 
       Win32_Process(e.NewEvent["TargetInstance"] as ManagementBaseObject); 

      switch (eventType) 
      { 
       case "__InstanceCreationEvent": 
        if (ProcessCreated != null) ProcessCreated(proc); break; 
       case "__InstanceDeletionEvent": 
        if (ProcessDeleted != null) ProcessDeleted(proc); break; 
       case "__InstanceModificationEvent": 
        if (ProcessModified != null) ProcessModified(proc); break; 
      } 
     } 
    } 

    // Auto-Generated running: mgmtclassgen Win32_Process /n root\cimv2 /o WMI.Win32 
    // Renaming the class from Process to Win32_Process 
    public class Win32_Process { ... } 
} 

// Sample Usage 
ProcessWatcher procWatcher = new ProcessWatcher("notepad.exe"); 
procWatcher.ProcessCreated += new ProcessEventHandler(procWatcher_ProcessCreated); 
procWatcher.ProcessDeleted += new ProcessEventHandler(procWatcher_ProcessDeleted); 
procWatcher.ProcessModified += new ProcessEventHandler(procWatcher_ProcessModified); 
procWatcher.Start(); 

// Do Work 

procWatcher.Stop(); 
+0

リンクは唯一の答えは良い答えをしないでください。ここにコンテンツを保管することは、他のサイトと照らし合わせて参考にしているものです。 – ChrisF

+0

OK、私はちょうど答えにいくつかのコードを追加しました – Salaros

+0

お返事ありがとうございます。しかし、私は自分のアプリケーションをウィンドウで起動し、必要なアプリケーション(例えば、メモ帳)が起動するまで待っています。あなたが提案するものは、実行中のプロセスを定期的にチェックすることによってポーリングすることです。か否か? –

関連する問題