GetModuleFileNameEx失败

时间:2015-11-03 22:47:38

标签: c++

我想创建一个程序来获取创建一个打开窗口的程序的名称:

#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提前

1 个答案:

答案 0 :(得分:0)

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

根据GetModuleFileNameEx的MSDN文档,获取进程可执行文件名称的推荐方法是调用GetProcessImageFileName而不是GetModuleFileNameEx。您必须先使用OpenProcess解决问题。