我正在尝试获取位于我的 C# 2.0 应用程序之外的窗口的可执行文件的名称。我的应用程序当前使用来自“user32.dll”的 GetForegroundWindow() 调用获取窗口句柄 (hWnd)。
从我能够做的挖掘来看,我想我想使用 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());
}