如何使用winapi在windows中获取当前活动窗口的进程名称?

10

我正在尝试使用winapi在Windows中获取当前窗口或活动窗口及其进程名称。

因此,我使用GetForegroundWindow()获取了活动窗口,并使用OpenProcess()获取进程,但问题是OpenProcess需要进程ID,所以我认为可以使用GetProcessId(),但这个函数需要HANDLE类型的窗口,而不是HWND类型的当前窗口。

我尝试了一些方法,但无法使其工作。所以,有人能告诉我如何使用HWND获取进程ID?或如何获取当前窗口的HANDLE?

如果有人看到可以帮助我的解决方案,请在下面查看我的代码。我正在使用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);
}

GetProcessId() 不接受窗口句柄作为输入,而是接受进程句柄。它检索指定进程的 ID。 - Remy Lebeau
1个回答

10
你可以使用GetWindowThreadProcessId()方法,它接收一个HWND参数并输出窗口所属进程的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);
}

谢谢您的回答,但是这个解决方案并不适用于所有进程,它可以在Skype、Qt Creator、Firefox、Chrome等应用程序中正常工作,但是在桌面、Windows提示、Word、我的文档等应用程序中却没有显示任何内容。 - SujaM
哦,不,问题不在于获取ID时,那部分工作正常。我之前提到的所有进程的问题是当我尝试获取进程名称时,“GetModuleFileNameEx”并不能适用于所有进程。 - SujaM
1
我使用GetProcessImageFileName替换了GetModuleFileNameEx以解决进程名称更改的问题。感谢Remy Lebeau。 - SujaM
你不需要使用PROCESS_VM_READPROCESS_QUERY_INFORMATION应该足够了。请参考进程安全和访问权限 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接