ahstax
Goto Top

Fenster-IDs auslesen und nutzen

Hallo,

ich möchte aus einem Arbeits-Programm heraus, das die Möglichkeit zu so etwas bietet, manuell initiiert eine vb.net-EXE starten. Das Arbeits-Programm kann mehrfach geöffnet sein, kennt aber seine Process-ID nicht. meine vb.net-EXE sollte aber wissen, welche "Instanz" des Arbeits-Programms sie geöffnet hat.

Man sagte mit, dass man das vielleicht über die "Darstellungs-Schicht" auf dem Monitor herausbekommen könnte, über die man dann die Process-ID herausbekommen kann. Das würde funktionieren, da im Prinzip sind ja alle Fenster der einzelnen, geöffneten Programme auf einer Ebene oberhalb und/oder unterhalb der anderen geöffneten Fenster.

Nehmen wir also das Arbeits-Programm, das meine vb.net-EXE öffnet, dann ist das Fenster des Arbeits-Programms in dem Moment, in den man die EXE-öffnet, das Top-Most Fenster. Ist die EXE gestartet, nur noch "second"-Top-Most.

Kann man tatsächlich programmatisch die "Ebene" eines Fensters herausfinden und davon dann die Process-ID?
Wenn ja, wie bzw wo kann ich dazu etwas finden?
Oder gibt es andere, bessere/einfachere Lösungen?

Neugierige Grüße,
Andreas

Content-ID: 382432

Url: https://administrator.de/contentid/382432

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

emeriks
emeriks 06.08.2018 um 10:46:58 Uhr
Goto Top
Hi,
kennt aber seine Process-ID nicht.
Process.GetCurrentProcess.ID

https://msdn.microsoft.com/de-de/library/system.diagnostics.process.getc ...

E.
SeaStorm
Lösung SeaStorm 06.08.2018 um 11:03:51 Uhr
Goto Top
Hi

using System;

using System.Diagnostics;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace ConsoleApp1
{
    class Program
    {
        /// <summary>
        /// A utility class to determine a process parent.
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct ParentProcessUtilities
        {
            // These members must match PROCESS_BASIC_INFORMATION
            internal IntPtr Reserved1;
            internal IntPtr PebBaseAddress;
            internal IntPtr Reserved2_0;
            internal IntPtr Reserved2_1;
            internal IntPtr UniqueProcessId;
            internal IntPtr InheritedFromUniqueProcessId;

            [DllImport("ntdll.dll")]  
            private static extern int NtQueryInformationProcess(IntPtr processHandle, int processInformationClass, ref ParentProcessUtilities processInformation, int processInformationLength, out int returnLength);

            /// <summary>
            /// Gets the parent process of the current process.
            /// </summary>
            /// <returns>An instance of the Process class.</returns>
            public static Process GetParentProcess()
            {
                return GetParentProcess(Process.GetCurrentProcess().Handle);
            }

            /// <summary>
            /// Gets the parent process of specified process.
            /// </summary>
            /// <param name="id">The process id.</param> 
            /// <returns>An instance of the Process class.</returns>
            public static Process GetParentProcess(int id)
            {
                Process process = Process.GetProcessById(id);
                return GetParentProcess(process.Handle);
            }

            /// <summary>
            /// Gets the parent process of a specified process.
            /// </summary>
            /// <param name="handle">The process handle.</param> 
            /// <returns>An instance of the Process class.</returns>
            public static Process GetParentProcess(IntPtr handle)
            {
                ParentProcessUtilities pbi = new ParentProcessUtilities();
                int returnLength;
                int status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out returnLength);
                if (status != 0)
                    throw new Win32Exception(status);

                try
                {
                    return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32());
                }
                catch (ArgumentException)
                {
                    // not found
                    return null;
                }
            }
        }






        static void Main(string args)
        {
            int pid = Process.GetCurrentProcess().Id;
            int parentPID = ParentProcessUtilities.GetParentProcess().Id;
            Console.WriteLine("PID:{0} ParentPID:{1}", pid, parentPID);  
            Console.ReadLine();
        }
    }
}

Von hier geklaut https://stackoverflow.com/questions/394816/how-to-get-parent-process-in- ...
ahstax
ahstax 06.08.2018 aktualisiert um 11:05:03 Uhr
Goto Top
Hi emeriks,

Danke für Deinen Hinweis.
Die eigene Process-ID des selbst programmierten Tools ist nicht die Frage.

Die Process-ID eines anderen Programms (das seine Process-ID aber nicht kennt!!!) ist aber gefragt. Dieses kann in mehreren Instanzen mit jeweils eigener Process-ID offen sein. Und nur eine dieser Instanzen öffnet dann das selbst programmierte Tool.


Hi SeaStorm,

vielen Dank, schau ich mir an!!! face-smile
colinardo
colinardo 06.08.2018 aktualisiert um 11:13:16 Uhr
Goto Top
Servus Andreas,
geht auch im "managed" Stil:
How to get parent process in .NET in managed way

Grüße Uwe
emeriks
emeriks 06.08.2018 um 11:12:32 Uhr
Goto Top
Ach, man ... Du willst den Parent Process ermitteln? Na dann z.B. so, wie @SeaStorm schon schreibt.
ahstax
ahstax 06.08.2018 aktualisiert um 11:24:33 Uhr
Goto Top
DANKE an alle!

Genau das, was SeaStorm gepostet hat, habe ich gesucht.

Danke für Eure Mühe face-smile