Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取嵌套应用程序的父级_C#_Process - Fatal编程技术网

C# 获取嵌套应用程序的父级

C# 获取嵌套应用程序的父级,c#,process,C#,Process,我认为这不应该被标记为复制品 这是我的设想。我需要检查应用程序是否正在RemoteApp会话中运行。 RemoteApp启动一个应用程序菜单窗口,然后启动其他应用程序,因此链应如下所示 rdpinit.exe > appmenu.exe > myapp.exe 因此,我需要完成以下工作。检查myapp.exe的父进程,它应该返回appmenu.exe,然后我需要知道哪个启动的appmenu.exe应该返回rdpinit 顺便说一句,rdpinit.exe是RemoteApp 我现在

我认为这不应该被标记为复制品

这是我的设想。我需要检查应用程序是否正在RemoteApp会话中运行。 RemoteApp启动一个应用程序菜单窗口,然后启动其他应用程序,因此链应如下所示

rdpinit.exe > appmenu.exe > myapp.exe
因此,我需要完成以下工作。检查myapp.exe的父进程,它应该返回appmenu.exe,然后我需要知道哪个启动的appmenu.exe应该返回rdpinit

顺便说一句,rdpinit.exe是RemoteApp

我现在正在做下面的事情,但还没到关键的地步

        public static string IsRemoteApp()
    {
        Process currentProc = ParentProcessUtilities.GetParentProcess();
        do
        {
            currentProc = GetParentProcess(currentProc.Id);
            if (currentProc != null)
            {
                if (currentProc.ProcessName.Equals("rdpinit"))
                {
                    //return true;
                }
            }
        }
        while (currentProc != null);
        //return false;
        return currentProc.ProcessName;
    }

    private static Process GetParentProcess(int procId)
    {
        try
        {
            string query = string.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", procId);
            ManagementObjectSearcher search = new ManagementObjectSearcher("root\\CIMV2", query);
            ManagementObjectCollection.ManagementObjectEnumerator results = search.Get().GetEnumerator();
            if (!results.MoveNext())
            {
                return null;
            }

            ManagementBaseObject queryObj = results.Current;
            uint parentID = (uint)queryObj["ParentProcessId"];
            return Process.GetProcessById((int)parentID);
        }
        catch
        {
            return null;
        }
    }
我也试了一会儿

 Process currentProc = ParentProcessUtilities.GetParentProcess();

            while (GetParentProcess(currentProc.Id) != null)
            {
                currentProc = GetParentProcess(currentProc.Id);
            }

            return currentProc.ProcessName;
我只能得到appmenu.exe

我也不相信我所想的总是可以假设的,但它可能是。 获取myapp的会话id,获取rpdinit的进程[]。如果rdpinit等于相同的会话id,那么我可以假设它是由RemoteApp启动的


似乎有一种情况是,当RemoteApp没有实际启动应用程序时,情况会是这样的

对不起,你的问题?可能是@HansPassant的重复版本不是真正的重复版本,也没有回答我的问题。我从来没听说过。我只能得到appmenu。myapp应返回父应用程序菜单。appmenu然后应该返回父rdpinit,但它在链中没有那么远。@sam更新了文章