Ich versuche, den Namen der ausführbaren Datei eines Fensters, das außerhalb meiner C# 2.0-Anwendung ist, zu erhalten. Meine App erhält derzeit ein Fenster-Handle (hWnd) mit dem GetForegroundWindow() - Aufruf von "user32.dll".Wie bekomme ich GetModuleFileName(), wenn ich nur ein Fenster-Handle (hWnd) habe?
Von der Grabung, die ich tun konnte, denke ich, ich möchte die GetModuleFileNameEx() -Funktion (von PSAPI) verwenden, um den Namen zu erhalten, aber GetModuleFileNameEx() erfordert ein Handle zu einem Prozess, kein Fenster .
Ist es möglich, ein Prozesshandle von einem Fensterhandle zu erhalten? (Muss ich zuerst den Thread-Handle des Fensters bekommen?)
EDITED der erste Satz, um es klarer zu machen, was ich versuche zu tun.
UPDATE! Hier ist der C# -Code, den ich gefunden habe, für mich gearbeitet. Die einzige Einschränkung ist gelegentlich es gibt eine Datei/einen Pfad zurück, wo der Laufwerksbuchstabe ein "?" anstelle des tatsächlichen Laufwerksbuchstaben (wie "C"). - Ich habe noch nicht herausgefunden warum.
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);
[DllImport("psapi.dll")]
static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, [In] [MarshalAs(UnmanagedType.U4)] int nSize);
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
private string GetWindowModuleFileName(IntPtr hWnd)
{
uint processId = 0;
const int nChars = 1024;
StringBuilder filename = new StringBuilder(nChars);
GetWindowThreadProcessId(hWnd, out processId);
IntPtr hProcess = OpenProcess(1040, 0, processId);
GetModuleFileNameEx(hProcess,IntPtr.Zero,filename,nChars);
CloseHandle(hProcess);
return (filename.ToString());
}
Hey willkommen Überlauf zu stapeln - Ich habe eine lange Zeit Leser gewesen deins –