如何通过窗口句柄HWND获取对应进程的可执行文件路径?
修复方案
核心错误原因
GetModuleFileNameW只能获取当前进程内的模块路径,无法跨进程读取其他进程的可执行文件路径,这是你拿到空路径的核心原因,跨进程读进程路径需要使用QueryFullProcessImageNameWAPI。- 窗口标题的缓冲区长度申请错误,
GetWindowTextLength返回的字符数不包含末尾空终止符,少申请1个字符会导致内存越界。 OpenProcess申请的PROCESS_ALL_ACCESS权限过高,很容易被系统拒绝(比如访问高权限进程、系统进程时),仅需要PROCESS_QUERY_LIMITED_INFORMATION权限即可满足读取路径的需求。- 缺少API返回值判断,打开进程失败时没有做异常处理。
修改后的完整测试代码
#include "Windows.h" #include <iostream> #include <chrono> #include <thread> using namespace std; int main() { // 2秒延迟用于切换到目标窗口 std::this_thread::sleep_for(std::chrono::milliseconds(2000)); HWND hWnd = GetForegroundWindow(); // 修复缓冲区长度:+1 存储末尾空终止符 int titleLength = GetWindowTextLength(hWnd); wchar_t* title = new wchar_t[titleLength + 1]; GetWindowTextW(hWnd, title, titleLength + 1); DWORD pid = 0; GetWindowThreadProcessId(hWnd, &pid); wchar_t processPath[MAX_PATH] = {0}; DWORD pathSize = MAX_PATH; // 使用低权限打开进程,兼容性更高 HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); if (hProc != NULL) { // 调用正确的API获取进程路径 QueryFullProcessImageNameW(hProc, 0, processPath, &pathSize); CloseHandle(hProc); } wcout << "进程ID: " << pid << " | 窗口标题: " << title << " | 进程路径: " << processPath << endl << endl; // 释放动态申请的内存,避免泄漏 delete[] title; return 0; }
后续封装DLL函数注意事项
- 路径对比时注意Windows系统路径不区分大小写,建议将两个路径统一转为小写/大写后再对比,也可以调用
GetFullPathNameW预处理路径,避免长短路径、相对路径格式差异导致匹配失败。 - 可以将逻辑封装为
bool CheckForegroundProcessPath(LPCWSTR targetPath)形式的函数,匹配成功返回true,否则返回false。
内容的提问来源于stack exchange,提问作者Devorious
相关产品推荐
相关产品推荐

