我正在实施一个桌面分析应用程序,需要记录用户在PC上打开的程序的名称和时间。它是一个C#(WPF)应用程序,在用户登录并在没有UI的情况下运行时启动。对于Word或IE等程序,它还可以捕获他们正在查看的文档或URL。
目前我的工作解决方案如下:
为鼠标按下安装Windows挂钩。当该事件触发时我使用p-Invoke来“GetForegroundWindow”然后使用窗口句柄来“GetWindowThreadProcessId”,使用ProcessId我可以获得包含名称,开始时间和参数开始列表的System.Diagnostics.Process对象。我维护一个历史列表,所以如果以前没有记录过这个processId / window句柄组合,我只会写一个跟踪条目。
此解决方案确实可以正常工作,但需要鼠标挂钩,Windows可以在没有任何通知的情况下丢弃,或者有问题检查是否仍然挂钩。更不用说这个实现似乎是一个黑客。
如果有更好的更直接的方法,请告知。
感谢。
答案 0 :(得分:12)
您可以使用__InstanceCreationEvent
事件和Win32_Process
WMI类来监控已创建的进程。
试试这个示例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();
}
}
}
答案 1 :(得分:2)
如果您想要监控Windows上运行的所有内容的性能,那么可以使用PerformanceCounter class。每次应用程序启动时,Windows都会创建数十个性能计数器,以跟踪应用程序的ProcessID,CPU使用率,内存使用情况,每秒I / O操作数等。
例如,以下代码会为您提供Chrome的进程ID:
PerformanceCounter perf = new PerformanceCounter("Process", "ID Process", "chrome");
int procId = (int)perf.NextValue();
您还可以使用PerformanceCounterCategory class轻松枚举类别,实例和计数器。
您可以使用Windows's PerfMon tool了解您将能够检索哪些信息。我建议您查看流程类别(使用PerfMon),在其中您可以找到所有活动流程的列表。