Я пытаюсь получить имя исполняемого файла окна, находящегося вне моего приложения С# 2.0. Мое приложение в настоящее время получает дескриптор окна (hWnd), используя вызов GetForegroundWindow() из "user32.dll".
Из копания, которое я смог сделать, я думаю, что хочу использовать функцию GetModuleFileNameEx() (из PSAPI) для получения имени, но GetModuleFileNameEx() требует дескриптора процесса, а не окна.
Можно ли получить дескриптор процесса из дескриптора окна? (Мне нужно сначала получить ручку потока окна?)
ИЗМЕНИТЬ первое предложение, чтобы уточнить, что я пытаюсь сделать.
UPDATE! Здесь код С#, который я нашел, работал у меня. Единственное предупреждение - иногда он возвращает файл/путь, где буква диска является "?" вместо фактической буквы диска (например, "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());
}