我有编译为 x86 的 ac# 应用程序,因此它在 Windows 7 x64 上作为 32 位应用程序运行。在应用程序运行时,我需要检测活动窗口的可执行文件名。在 Winodws XP 上,以下代码运行良好(从活动窗口句柄获取进程文件名)。在 x64 上,它只报告 32 位进程的名称(为其他进程返回垃圾,可能是因为我没有检查返回的数据)。我正在传递使用 GetForegroundWindow API 获得的活动窗口的句柄。
public static string GetProcessPathFromWindowHandle(IntPtr hWnd) {
string filename = string.Empty;
uint pid=0;
Unmanaged.GetWindowThreadProcessId(hWnd, out pid);
//error in Win64: returns strange characters for Win64 files
const int nChars = 1024;
StringBuilder filenameBuffer = new StringBuilder(nChars);
IntPtr hProcess = Unmanaged.OpenProcess(1040, 0, pid);
Unmanaged.GetModuleFileNameEx(hProcess, IntPtr.Zero, filenameBuffer, nChars);
Unmanaged.CloseHandle(hProcess);
filename = filenameBuffer.ToString();
//Get the name of the Windows
int length = Unmanaged.GetWindowTextLength(hWnd);
StringBuilder sb = new StringBuilder(length + 1);
Unmanaged.GetWindowText(hWnd, sb, sb.Capacity);
Logger.Main.LogMessage("Window Title is: " + sb);
Logger.Main.LogMessage("Process filename is: " + filename);
return filename;
}
我可以在 64 位环境中从 32 位进程中获取该信息吗?谢谢。安德烈亚