Próbuję uzyskać nazwę pliku wykonywalnego okna, które znajduje się poza moją aplikacją C# 2.0. Moja aplikacja aktualnie pobiera uchwyt okna (hWnd) za pomocą wywołania GetForegroundWindow() z "user32.dll".Jak mogę GetModuleFileName(), jeśli mam tylko uchwyt okna (hWnd)?
Z kopania, które udało mi się zrobić, myślę, że chcę użyć funkcji GetModuleFileNameEx() (z PSAPI), aby uzyskać nazwę, ale GetModuleFileNameEx() wymaga uchwytu do procesu, a nie do okna .
Czy można uzyskać uchwyt procesu z uchwytu okna? (Czy najpierw muszę pobrać uchwyt nici okna?)
EDYTUJ Pierwsze zdanie, aby było jaśniejsze, co próbuję zrobić.
AKTUALIZACJA! Oto kod C#, który znalazłem dla mnie. Jedynym zastrzeżeniem jest okazjonalnie zwraca plik/ścieżkę, gdzie literą dysku jest "?" zamiast rzeczywistej litery dysku (np. "C"). - Nie zrozumiałem jeszcze dlaczego.
[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());
}
Hej witamy na przepełnienie stosu - Byłem czytelnik długi czas Twój –