获取已知 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
我正在尝试制作一个应用程序,只有在调用 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