gpt4 book ai didi

c# - 如果我只有一个窗口句柄 (hWnd),我该如何 GetModuleFileName()?

转载 作者:可可西里 更新时间:2023-11-01 09:01:43 28 4
gpt4 key购买 nike

我正在尝试获取位于我的 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());
}

最佳答案

现在已经为同样的问题苦苦挣扎了一个小时,还通过使用 GetModuleFileNameEx 将第一个字母替换为 ?。Finaly 使用 System.Diagnostics.Process 类提出了这个解决方案。

[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

void GetProcessPathFromWindowHandle(IntPtr hwnd)
{
uint pid = 0;
Win32.GetWindowThreadProcessId(hwnd, out pid);
Process p = Process.GetProcessById((int)pid);
return p.MainModule.FileName;
}

关于c# - 如果我只有一个窗口句柄 (hWnd),我该如何 GetModuleFileName()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/277085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com