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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie anrufen GetWindowThreadProcessId und kehren Sie den Prozess im Zusammenhang mit der Fenster.
Aus, die Sie anrufen können, OpenProcess zu öffnen, den Prozess und rufen Sie das handle für den Prozess.
InformationsquelleAutor
Kämpfen mit dem gleichen problem, für eine Stunde jetzt, habe auch den ersten Buchstaben ersetzt durch eine ? durch die Verwendung GetModuleFileNameEx.
Schließlich kam mit dieser Lösung, die mit der System.Diagnostik.Prozess Klasse.
Ich merke, dieser thread ist veraltet, aber eine kleine Bemerkung zu diesem Lösungsvorschlag. Das wird nicht funktionieren, wenn Sie versuchen, zu erhalten, die mit dem Namen eines 64-bit-Prozess aus einem 32-bit-Prozess (oder Umgekehrt).
InformationsquelleAutor
Wenn Sie auf einem windows-64-bit-Plattform, die Sie verwenden müssen, um QueryFullProcessImageName statt. Dies gibt eine user-style-Pfad, im Vergleich zu GetProcessImageFileName das gibt einen system-style-Pfad, der würde Umgerechnet werden müssen, werden mit NtQuerySymbolicLinkObject oder ZwQuerySymbolicLinkObject.
Einer Mammut-Beispiel-Funktion - empfehlen Aufbrechen in wieder verwendbaren bits.
InformationsquelleAutor
Was genau ist es, was du versuchst zu tun? Sie können die Prozess-ID des Prozesses, die ein Fenster erstellt mit GetWindowThreadProcessId(), gefolgt von OpenProcess() um den Prozess zu behandeln. Aber das scheint mir sehr notdürftigem, und ich fühle mich wie es gibt eine elegantere Möglichkeit das zu tun, was Sie tun möchten.
Ja, es fühlt sich notdürftigem mir auch. Ich versuche zu verfolgen, welches Fenster den Fokus hat. Natürlich, die Fenstergriffe und die Titelleiste Namen ändern, aber die Programm-exe-name nicht.
OK, aber trotzdem Larry Osterman gab die gleiche Antwort also ist es wohl weniger klugy als alle alternativen. Und sein Ruf ist nicht 1 mehr.
Larry Osterman ' s Lebenszeit Ruf in der windows-Programmierung ist bis es mit Raymond Chen
Larry Osterman ' s Antwort ist einfach angenommen worden, so dass jetzt sein Ruf ist 46. Seine Lebenszeit vor, SO zählt nicht.
InformationsquelleAutor Adam Rosenfield
versuchen, diese Datei zu erhalten ist name der ausführbaren Datei :
C#:
mfg
InformationsquelleAutor muh