2012-01-31 2 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

ОК, я только что добавил код для ответа – Salaros

+0

Спасибо за ответ. Тем не менее, я хочу, чтобы мое приложение начиналось с окон и ожидало, пока не появится приложение, которое я хочу (например, блокнот). То, что вы предлагаете, - это опрос, периодически проверяя запущенные процессы. Или нет? –

Смежные вопросы