在我的C#Winforms应用程序中,我实现了一个观察程序,在本地操作系统中启动新进程时通知我。
ManagementEventWatcher watcher = new ManagementEventWatcher(new ManagementScope("\\\\.\\root\\cimv2"), new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 0, 1), "TargetInstance ISA 'Win32_Process'"));
watcher.Scope.Options.EnablePrivileges = true;
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
我对启动的流程没有直接感兴趣,但在最终文件中导致流程启动。 想想双击" d:\ documents \ doc.txt"导致notepad.exe启动。 观察者通知我关于新的notepad.exe进程,然后我可以检查是否有一个文件负责它的启动。
这是在事件到来时通知我的代码。
void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject mbo = (ManagementBaseObject)e.NewEvent["TargetInstance"];
string executable = mbo.GetPropertyValue("ExecutablePath").ToString().ToLower();
string commandLine = mbo.GetPropertyValue("CommandLine").ToString().ToLower();
[...]
}
在变量commandLine中,我找到了完整的命令行,在我的例子中:
c:\ windows \ system32 \ notepad.exe d:\ documents \ doc.txt
该代码适用于几乎所有程序,但我发现文件的扩展名与无程序链接有问题。 当我双击其中一个文件时,弹出“打开方式”对话框(进程名称为openwith.exe),观察者会定期通知我,但是当我读取CommandLine属性时,我发现了类似这样的内容:
c:\ windows \ system32 \ openwith.exe -embedding
而不是预期的:
c:\ windows \ system32 \ openwith.exe d:\ documents \ document.unlinkedExt
我可以从mbo对象中分析的所有属性都不会帮助我。我的假设是这种实例没有使用通常的命令行来执行该过程。
问题是:如何提取导致“打开方式”对话框打开的完整文件路径?
使用.NET framework 2.0和4.0检查Windows 8.1和10.