c# 获取调用者进程的进程名

时间:2022-10-01 19:04:15
C#中假设有一进程为A有一进程为B,B进程通过点击按钮调用打开进程A,现在不知道进程调用是否存在多级调用关系,A为被调用者,B为调用者,怎么在A进程中通过代码来获取到调用者B的进程名!!!!!求大神支招

2 个解决方案

#1


可以使用NtQueryInformationProcess,它有一个未公开的调用。
不过未公开,意味着得不到微软的正式支持,你要自己斟酌使用。
其他方法包括用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

#1


可以使用NtQueryInformationProcess,它有一个未公开的调用。
不过未公开,意味着得不到微软的正式支持,你要自己斟酌使用。
其他方法包括用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