GetModuleFileNameEx fails

GetModuleFileNameEx fails

本文关键字:fails GetModuleFileNameEx      更新时间:2023-10-16

我想制作一个程序,该程序获取创建打开窗口的程序的名称:

#include <iostream>
using namespace std;
#include <windows.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")

int main()
{
    system("color 1f");
    DWORD dwProcessId;
    DWORD dwThreadId ;
    while(1)
    {
        Sleep(2000);
        HWND hForg = GetForegroundWindow();
        dwThreadId = GetWindowThreadProcessId(hForg, &dwProcessId);
        //cout << "Thread Id: " << dwThreadId << endl;
        //cout << "Process Id: " << dwProcessId << endl;
        DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ;
        bool bInheritHandle = false;
        HANDLE hProcess = OpenProcess(dwDesiredAccess,
                                      bInheritHandle, dwProcessId);
        if(INVALID_HANDLE_VALUE == hProcess)
            cout << "Failed to open process!" << endl;
        HMODULE hMod = (HMODULE)GetWindowLongPtr(hForg, GWLP_HINSTANCE);
        if(!hMod)
            cout << "Null Module!" << endl;
        char szModFileName[MAX_PATH];
        GetModuleFileNameEx(hProcess, (HMODULE)hMod, szModFileName, MAX_PATH);
        char szWindowName[MAX_PATH];
        GetWindowText(hForg, szWindowName, MAX_PATH);
        cout << "Window Name: " << szWindowName << endl;
        cout << "Created by: " << szModFileName << endl << endl;
    }

        cout << endl << endl << endl;
        return 0;
}

当我运行程序时,它可以工作,但它从不检索程序的名称,而是检索可视化c++程序的名称???!!!任何人都可以编辑或帮助我的代码吗。thnx提前

INVALID_HANDLE_VALUE被定义为-1,而如果函数失败,OpenProcess将返回NULL。我不知道如果给定NULL进程句柄,GetModuleFileNameEx会做什么,但如果HMODULE为NULL,则会返回当前可执行文件的名称,因此它可能会对其他无效输入执行此操作。

根据MSDN的GetModuleFileNameEx文档,建议通过调用GetProcessImageFileName而不是GetModuleFileNameEx来获取进程的可执行文件的名称。您必须先用OpenProcess解决问题。