You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过窗口句柄HWND获取对应进程的可执行文件路径?

修复方案

核心错误原因

  • GetModuleFileNameW 只能获取当前进程内的模块路径,无法跨进程读取其他进程的可执行文件路径,这是你拿到空路径的核心原因,跨进程读进程路径需要使用 QueryFullProcessImageNameW API。
  • 窗口标题的缓冲区长度申请错误,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:45:03