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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 382432
Url: https://administrator.de/contentid/382432
Ausgedruckt am: 25.11.2024 um 18:11 Uhr
6 Kommentare
Neuester Kommentar
Hi,
https://msdn.microsoft.com/de-de/library/system.diagnostics.process.getc ...
E.
kennt aber seine Process-ID nicht.
Process.GetCurrentProcess.ID
https://msdn.microsoft.com/de-de/library/system.diagnostics.process.getc ...
E.
Hi
Von hier geklaut https://stackoverflow.com/questions/394816/how-to-get-parent-process-in- ...
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- ...
Servus Andreas,
geht auch im "managed" Stil:
How to get parent process in .NET in managed way
Grüße Uwe
geht auch im "managed" Stil:
How to get parent process in .NET in managed way
Grüße Uwe
Ach, man ... Du willst den Parent Process ermitteln? Na dann z.B. so, wie @SeaStorm schon schreibt.