2 个解决方案
#1
可以使用NtQueryInformationProcess,它有一个未公开的调用。
不过未公开,意味着得不到微软的正式支持,你要自己斟酌使用。
其他方法包括用wmi查询Process class,或使用CreateToolhelp32Snapshot API等等。
注解一:
NtQueryInformationProcess 方法可以参考这里:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
其中PROCESS_BASIC_INFORMATION的第6个参数为PVOID Reserved3;
文档里是Reserved(保留),目前实际上放了父进程的ID。
不过未公开,意味着得不到微软的正式支持,你要自己斟酌使用。
其他方法包括用wmi查询Process class,或使用CreateToolhelp32Snapshot API等等。
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
var process = Process.GetCurrentProcess();
var buffer = new byte[IntPtr.Size * 6];
var length = 0;
var status = NtQueryInformationProcess(process.Handle, 0, buffer, buffer.Length, out length);
if (status != 0) throw new Win32Exception();
var parentId = BitConverter.ToInt32(buffer, IntPtr.Size * 5); // 注解一
Console.WriteLine("父进程ID:{0}", parentId);
Console.WriteLine("父进程名字:{0}", Process.GetProcessById(parentId).ProcessName);
}
[DllImport("NtDll", SetLastError = true)]
static extern int NtQueryInformationProcess(
IntPtr handle,
int @class,
byte[] buffer,
int bufferLength,
out int returnLength);
}
注解一:
NtQueryInformationProcess 方法可以参考这里:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
其中PROCESS_BASIC_INFORMATION的第6个参数为PVOID Reserved3;
文档里是Reserved(保留),目前实际上放了父进程的ID。
#2
扩展下Process的方法即可。
参考:
http://outofmemory.cn/code-snippet/1632/c-how-get-process-father-process
参考:
http://outofmemory.cn/code-snippet/1632/c-how-get-process-father-process
#1
可以使用NtQueryInformationProcess,它有一个未公开的调用。
不过未公开,意味着得不到微软的正式支持,你要自己斟酌使用。
其他方法包括用wmi查询Process class,或使用CreateToolhelp32Snapshot API等等。
注解一:
NtQueryInformationProcess 方法可以参考这里:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
其中PROCESS_BASIC_INFORMATION的第6个参数为PVOID Reserved3;
文档里是Reserved(保留),目前实际上放了父进程的ID。
不过未公开,意味着得不到微软的正式支持,你要自己斟酌使用。
其他方法包括用wmi查询Process class,或使用CreateToolhelp32Snapshot API等等。
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
var process = Process.GetCurrentProcess();
var buffer = new byte[IntPtr.Size * 6];
var length = 0;
var status = NtQueryInformationProcess(process.Handle, 0, buffer, buffer.Length, out length);
if (status != 0) throw new Win32Exception();
var parentId = BitConverter.ToInt32(buffer, IntPtr.Size * 5); // 注解一
Console.WriteLine("父进程ID:{0}", parentId);
Console.WriteLine("父进程名字:{0}", Process.GetProcessById(parentId).ProcessName);
}
[DllImport("NtDll", SetLastError = true)]
static extern int NtQueryInformationProcess(
IntPtr handle,
int @class,
byte[] buffer,
int bufferLength,
out int returnLength);
}
注解一:
NtQueryInformationProcess 方法可以参考这里:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
其中PROCESS_BASIC_INFORMATION的第6个参数为PVOID Reserved3;
文档里是Reserved(保留),目前实际上放了父进程的ID。
#2
扩展下Process的方法即可。
参考:
http://outofmemory.cn/code-snippet/1632/c-how-get-process-father-process
参考:
http://outofmemory.cn/code-snippet/1632/c-how-get-process-father-process