如果你不想使用WMI,并宁愿做这个土生土长的方式,我写了基本要求NtQueryInformationProcess()
和派生从返回的信息的命令行的DLL。
它是用C++编写的,没有依赖关系,因此它可以在任何Windows系统上工作。
要使用它,只需添加这些进口:
[DllImport("ProcCmdLine32.dll", CharSet = CharSet.Unicode, EntryPoint = "GetProcCmdLine")]
public extern static bool GetProcCmdLine32(uint nProcId, StringBuilder sb, uint dwSizeBuf);
[DllImport("ProcCmdLine64.dll", CharSet = CharSet.Unicode, EntryPoint = "GetProcCmdLine")]
public extern static bool GetProcCmdLine64(uint nProcId, StringBuilder sb, uint dwSizeBuf);
然后调用它像这样:
public static string GetCommandLineOfProcess(Process proc)
{
// max size of a command line is USHORT/sizeof(WCHAR), so we are going
// just allocate max USHORT for sanity's sake.
var sb = new StringBuilder(0xFFFF);
switch (IntPtr.Size)
{
case 4: GetProcCmdLine32((uint)proc.Id, sb, (uint)sb.Capacity); break;
case 8: GetProcCmdLine64((uint)proc.Id, sb, (uint)sb.Capacity); break;
}
return sb.ToString();
}
的源代码/ DLL是可用here。
您是否可以控制要重启的应用程序? – 2010-04-13 22:30:35
是的,我完全控制了我尝试重新启动的应用程序代码 - 它总是会成为我运行的同一应用程序的另一个实例。这是一个WPF应用程序,如果这有所作为,但我认为它不应该。 – 2010-04-13 22:36:25
根据StartInfo上的MSDN文章(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.startinfo.aspx),如果该进程是使用Process启动的,则StartInfo对象仅包含信息。开始。它还表示在使用GetProcesses *函数时,StartInfo将为空。 – Corin 2010-04-13 22:37:27