Wie kann ich die GetModuleFileName (), wenn ich nur ein Fenster-handle (hWnd)?

Ich versuche, den Namen der ausführbaren Datei ein Fenster, das außerhalb meines C# - 2.0-Anwendung. Meine app derzeit wird ein Fenster-handle (hWnd) verwenden Sie die GetForegroundWindow () - Aufruf von "user32.dll".

Vom Graben, dass ich in der Lage gewesen, zu tun, ich denke, dass ich verwenden möchten, die GetModuleFileNameEx () - Funktion (aus PSAPI), um den Namen, aber GetModuleFileNameEx() erfordert ein handle auf einen Prozess, nicht ein Fenster.

Ist es möglich, dass ein Prozess-handle von einem Fenster-handle? (Brauche ich für das thread-handle des Fensters zunächst?)

BEARBEITET Sie den ersten Satz deutlicher machen, was ich zu tun versuche.

UPDATE! Hier der C# code, den ich gefunden, die für mich gearbeitet. Die einzige Einschränkung ist gelegentlich es gibt eine Datei/Pfad, wo der Laufwerksbuchstabe wird ein "?" anstelle der tatsächlichen Laufwerksbuchstaben (z.B. "C"). -- Habe nicht herausgefunden, warum noch.

[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());
}

InformationsquelleAutor Pretzel | 2008-11-10

Schreibe einen Kommentar