获取已知 HWND 的路径

Get path of a known HWND

我正在尝试制作一个应用程序,只有在调用 dll 的那一刻才会 运行 某些东西,那一刻聚焦的 window 与给出的值。话虽如此,以下代码将添加到一个 dll 中,该 dll 将具有一个函数,该函数的路径值作为参数,如果满足条件,则 return 为真,否则为假。我遇到的问题是我似乎无法找到一种方法来获取焦点 window 的路径,下面的代码总是 returns 一个空字符串。而且我不能简单地使用 windows 的标题,因为有些应用程序是的,标题是静态的,如 Task Manager,但还有其他应用程序的标题已更改,如 Windows Explorer根据用户所在的位置更改标题。我必须更改什么?

以下代码仅作为测试使用,因为后面是我需要的基础,我只需要在 path 变量上添加一个比较,并在此基础上 return 对或错:

#include "Windows.h";
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;

int main() {
    // 2 seconds delay to have time to switch windows
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));

    HWND hWnd = GetForegroundWindow(); 
    int length = GetWindowTextLength(hWnd);
    wchar_t* title = new wchar_t[length];
    GetWindowTextW(hWnd, title, length);

    DWORD id;
    GetWindowThreadProcessId(hWnd, &id); 

    wchar_t* path = new wchar_t[MAX_PATH];
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, id);
    GetModuleFileNameW((HMODULE)hProc, path, MAX_PATH);
    CloseHandle(hProc);

    wcout << "ID: " << id << " | Title: " << title << " | Path: " << path << endl << endl;
    return 1;
} 

输出示例:ID: 2536 | Title: Task Manage | Path:

为了得到我想要的结果,我改成了QueryFullProcessImageName(像CherryDT建议看看),但是你要小心,你需要运行它与Admin 有权获取某些应用程序的路径,例如我遇到的 Task Manager,可能是因为它是一个 Windows 应用程序,不确定,如果您需要更多,则必须对此进行一些研究细节。这是一个小例子:

#include "Windows.h";
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;

int main() {
    // 2 seconds delay to have time to switch windows
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));

    HWND hWnd = GetForegroundWindow(); 
    int lgth = GetWindowTextLength(hWnd) + 1;
    wchar_t* title = new wchar_t[lgth];
    GetWindowTextW(hWnd, title, lgth);

    DWORD id;
    GetWindowThreadProcessId(hWnd, &id); 

    wchar_t* path = new wchar_t[MAX_PATH];
    DWORD size = MAX_PATH;
    HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);
    QueryFullProcessImageNameW(hProc, 0, path, &size);
    CloseHandle(hProc);

    wcout << "ID: " << id << " | Title: " << title << " | Path: " << path << endl << endl;
    return 1;
} 

输出示例:ID: 12580 | Title: Task Manage | Path: C:\Windows\System32\Taskmgr.exe