Я пытаюсь получить имя исполняемого файла окна, которое находится за пределами моего приложения C # 2.0. В настоящее время мое приложение получает дескриптор окна (hWnd) с помощью вызова GetForegroundWindow () из "user32.dll".
Из копания, которое я смог сделать, я думаю, что хочу использовать функцию GetModuleFileNameEx () (из PSAPI) для получения имени, но GetModuleFileNameEx () требует дескриптор для процесса, а не для окна.
Возможно ли получить дескриптор процесса из дескриптора окна? (Мне нужно сначала получить дескриптор окна?)
РЕДАКТИРОВАЛ первое предложение, чтобы прояснить, что я пытаюсь сделать.
ОБНОВЛЕНИЕ! Вот код C #, который я нашел, работал для меня. Единственное предупреждение: иногда возвращает файл / путь, где буква диска - "?" вместо фактической буквы диска (например, «C»). - Пока не понял, почему.
[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());
}