从“打开方式”对话框

时间:2016-07-20 09:49:31

标签: c# .net windows winforms

在我的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.

0 个答案:

没有答案