Meine Winform-Anwendung wird von einer anderen Anwendung (der Eltern) gestartet, ich muss die PID der Anwendung, die meine Anwendung mit C# starten.Wie bekomme ich die PID des Elternprozesses meiner Anwendung
Antwort
WMI ist der einfachste Weg, dies in C# zu tun. Die Win32_Process-Klasse verfügt über die ParentProcessId-Eigenschaft. Hier ein Beispiel:
using System;
using System.Management; // <=== Add Reference required!!
using System.Diagnostics;
class Program {
public static void Main() {
var myId = Process.GetCurrentProcess().Id;
var query = string.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", myId);
var search = new ManagementObjectSearcher("root\\CIMV2", query);
var results = search.Get().GetEnumerator();
results.MoveNext();
var queryObj = results.Current;
var parentId = (uint)queryObj["ParentProcessId"];
var parent = Process.GetProcessById((int)parentId);
Console.WriteLine("I was started by {0}", parent.ProcessName);
Console.ReadLine();
}
}
Ausgabe, wenn von Visual Studio ausgeführt wird:
ich von devenv
Überprüfen Sie das Mitglied th32ParentProcessID einer CreateToolhelp32Snapshot-Enumeration.
Für ein Beispiel, wie dies zu tun ist see my post here.
Da Sie C# verwenden, müssen Sie DllImports verwenden. Im verlinkten Post gibt es MSDN-Seiten für jede für die Funktionen, die Sie benötigen. Am Ende jeder MSDN-Seite haben sie den Code für DllImport für C#.
Es gibt auch einen easier way using managed Code nur, aber es funktioniert nicht, wenn Sie mehr als einen Prozessnamen von verschiedenen Anwendungen gestartet haben.
Wenn Sie Kontrolle über die übergeordnete Anwendung haben, können Sie das übergeordnete Element ändern, um seine PID an das untergeordnete Element zu übergeben, wenn es den Prozess startet.
Einfachheit in seiner besten Form. Das ist die Antwort, nach der ich gesucht habe. – khargoosh
Mit Brian R. Bondy Antwort als Leitfaden gestartet wurde, als auch, was ist auf PInvoke.net, und einige Reflektor-Ausgang, habe ich dies erzeugt, für den Einsatz in LinqPad MyExtensions
:
public static int ParentProcessId(this Process process)
{
return ParentProcessId(process.Id);
}
public static int ParentProcessId(int Id)
{
PROCESSENTRY32 pe32 = new PROCESSENTRY32{};
pe32.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32));
using(var hSnapshot = CreateToolhelp32Snapshot(SnapshotFlags.Process, (uint)Id))
{
if(hSnapshot.IsInvalid)
throw new Win32Exception();
if(!Process32First(hSnapshot, ref pe32))
{
int errno = Marshal.GetLastWin32Error();
if(errno == ERROR_NO_MORE_FILES)
return -1;
throw new Win32Exception(errno);
}
do {
if(pe32.th32ProcessID == (uint)Id)
return (int)pe32.th32ParentProcessID;
} while(Process32Next(hSnapshot, ref pe32));
}
return -1;
}
private const int ERROR_NO_MORE_FILES = 0x12;
[DllImport("kernel32.dll", SetLastError=true)]
private static extern SafeSnapshotHandle CreateToolhelp32Snapshot(SnapshotFlags flags, uint id);
[DllImport("kernel32.dll", SetLastError=true)]
private static extern bool Process32First(SafeSnapshotHandle hSnapshot, ref PROCESSENTRY32 lppe);
[DllImport("kernel32.dll", SetLastError=true)]
private static extern bool Process32Next(SafeSnapshotHandle hSnapshot, ref PROCESSENTRY32 lppe);
[Flags]
private enum SnapshotFlags : uint
{
HeapList = 0x00000001,
Process = 0x00000002,
Thread = 0x00000004,
Module = 0x00000008,
Module32 = 0x00000010,
All = (HeapList | Process | Thread | Module),
Inherit = 0x80000000,
NoHeaps = 0x40000000
}
[StructLayout(LayoutKind.Sequential)]
private struct PROCESSENTRY32
{
public uint dwSize;
public uint cntUsage;
public uint th32ProcessID;
public IntPtr th32DefaultHeapID;
public uint th32ModuleID;
public uint cntThreads;
public uint th32ParentProcessID;
public int pcPriClassBase;
public uint dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)] public string szExeFile;
};
[SuppressUnmanagedCodeSecurity, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort=true)]
internal sealed class SafeSnapshotHandle : SafeHandleMinusOneIsInvalid
{
internal SafeSnapshotHandle() : base(true)
{
}
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode=true)]
internal SafeSnapshotHandle(IntPtr handle) : base(true)
{
base.SetHandle(handle);
}
protected override bool ReleaseHandle()
{
return CloseHandle(base.handle);
}
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)]
private static extern bool CloseHandle(IntPtr handle);
}
- 1. Wie bekomme ich die PID des Hintergrundprozesses?
- 2. Wie lege ich das Arbeitsverzeichnis des Elternprozesses fest?
- 3. LINUX Wie bekomme ich die nicht laufenden PID-s?
- 4. Wie finde ich die Arbeiter in meiner Elixir-Anwendung?
- 5. Wie bekomme ich meine Handynummer in meiner Anwendung?
- 6. Wie bekomme ich alle Routen in meiner Rails-Anwendung?
- 7. Wie bekomme ich den Haupt-Aktivitäts- oder Klassennamen meiner Anwendung?
- 8. Wie bekomme ich NMEA Satz von GPRMC in meiner Anwendung?
- 9. bekomme PID von paramiko
- 10. Wie öffne ich die Einstellungen-Anwendung von meiner Anwendung?
- 11. Wie bekomme ich die ID des Elements
- 12. Wie bekomme ich PID von gestarteter App in C#
- 13. Wie bekomme ich PID und Port # für einen Jenkins-Prozess
- 14. Wie erhalte ich die PID eines Knotennamens?
- 15. Wie kann ich die Größe meiner AngularDart-Anwendung optimieren?
- 16. Wie kann ich die Leistungsengpässe in meiner Ruby-Anwendung finden?
- 17. Wie bekomme ich die Mitgliedsserver-Liste des aktuellen Tierpfleger-Clusters
- 18. Wie finde ich Anwendung Name von PID (Prozess-ID)
- 19. Wie bekomme ich die Hintergrundfarbe des Kachelbereichs in Javafx?
- 20. ms C++ pid des aktuellen Prozesses
- 21. Wie bekomme ich die nutzbaren Koordinaten des Bildschirms in Delphi
- 22. Wie bekomme ich die Breite und Länge eines Bildes in SD-Karte zu meiner Anwendung?
- 23. Schienen - Wie bekomme ich die IP-Adresse meiner Besucher?
- 24. Wie bekomme ich die Anwendungsversion?
- 25. Facebook: Wie bekomme ich die kurze PID von einem FBID für ein Foto zurück?
- 26. Wie bekomme ich das Stammverzeichnis meiner ASP.NET-Serveranwendung?
- 27. Wie benutze ich lame.exe in meiner Anwendung?
- 28. Wie kann ich die Größe meiner Mono-Touch-Anwendung schrumpfen
- 29. Wie nutze ich die Unveränderlichkeit in meiner redux-react-Anwendung?
- 30. Wie kann ich die Fehler meiner Anwendung in JSF anzeigen?
Siehe auch http://stackoverflow.com/questions/394816/how-to-get-parent-process-in-net-in-managed-way – hortman