如何使用 winapi 获取 windows 中当前活动的 window 的进程名称?
How can I get the process name of the current active window in windows with winapi?
我正在尝试使用 winapi 在 Windows 中获取当前 window 或活动 window 以及那个 window 的进程名称。
所以,我能够使用 GetForegroundWindow()
获得活动的 window 并且我正在使用 OpenProcess()
来获得进程,问题是 OpenProcess 需要进程 ID,所以我虽然可以使用 GetProcessId()
但这个接收到的是 HANDLE 类型的 window 而我当前的 window 是 HWND 类型。
我已经尝试了一些方法,但没能成功。那么谁能告诉我如何使用 HWND 中的 window 获取进程 ID?或获取当前 window 的句柄 ??
我将我的代码留在此处,以防有人看到可能对我有帮助的解决方案。我正在使用 Qt 和 C++
char wnd_title[256];
HWND hwnd=GetForegroundWindow(); // get handle of currently active window
GetWindowText(hwnd,wnd_title,sizeof(wnd_title));
HANDLE Handle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
GetProcessId(hwnd) // GetProcessId is returning 0
);
if (Handle)
{
TCHAR Buffer[MAX_PATH];
if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH))
{
printf("Paht: %s", Buffer);
// At this point, buffer contains the full path to the executable
}
CloseHandle(Handle);
}
您可以使用 GetWindowThreadProcessId()
,它接收 HWND
并输出 window 所属进程的 ID。
例如:
#include <tchar.h>
TCHAR wnd_title[256];
HWND hwnd = GetForegroundWindow(); // get handle of currently active window
GetWindowTextA(hwnd, wnd_title, 256);
DWORD dwPID;
GetWindowThreadProcessId(hwnd, &dwPID);
HANDLE Handle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
dwPID
);
if (Handle)
{
TCHAR Buffer[MAX_PATH];
if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH))
{
_tprintf(_T("Path: %s"), Buffer);
// At this point, buffer contains the full path to the executable
}
CloseHandle(Handle);
}
我正在尝试使用 winapi 在 Windows 中获取当前 window 或活动 window 以及那个 window 的进程名称。
所以,我能够使用 GetForegroundWindow()
获得活动的 window 并且我正在使用 OpenProcess()
来获得进程,问题是 OpenProcess 需要进程 ID,所以我虽然可以使用 GetProcessId()
但这个接收到的是 HANDLE 类型的 window 而我当前的 window 是 HWND 类型。
我已经尝试了一些方法,但没能成功。那么谁能告诉我如何使用 HWND 中的 window 获取进程 ID?或获取当前 window 的句柄 ??
我将我的代码留在此处,以防有人看到可能对我有帮助的解决方案。我正在使用 Qt 和 C++
char wnd_title[256];
HWND hwnd=GetForegroundWindow(); // get handle of currently active window
GetWindowText(hwnd,wnd_title,sizeof(wnd_title));
HANDLE Handle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
GetProcessId(hwnd) // GetProcessId is returning 0
);
if (Handle)
{
TCHAR Buffer[MAX_PATH];
if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH))
{
printf("Paht: %s", Buffer);
// At this point, buffer contains the full path to the executable
}
CloseHandle(Handle);
}
您可以使用 GetWindowThreadProcessId()
,它接收 HWND
并输出 window 所属进程的 ID。
例如:
#include <tchar.h>
TCHAR wnd_title[256];
HWND hwnd = GetForegroundWindow(); // get handle of currently active window
GetWindowTextA(hwnd, wnd_title, 256);
DWORD dwPID;
GetWindowThreadProcessId(hwnd, &dwPID);
HANDLE Handle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
dwPID
);
if (Handle)
{
TCHAR Buffer[MAX_PATH];
if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH))
{
_tprintf(_T("Path: %s"), Buffer);
// At this point, buffer contains the full path to the executable
}
CloseHandle(Handle);
}