15

How can I get the HWND of application, if I know the process ID? Anyone could post a sample please? I'm using MSV C++ 2010. I found Process::MainWindowHandle but I don't know how to use it.

Luke
  • 2,350
  • 6
  • 26
  • 41

4 Answers4

26
HWND g_HWND=NULL;
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam)
{
    DWORD lpdwProcessId;
    GetWindowThreadProcessId(hwnd,&lpdwProcessId);
    if(lpdwProcessId==lParam)
    {
        g_HWND=hwnd;
        return FALSE;
    }
    return TRUE;
}
EnumWindows(EnumWindowsProcMy,m_ProcessId);
Andre Kirpitch
  • 1,027
  • 11
  • 18
  • 5
    One needs to point out that `PID` must belong to the same desktop (or interactive user/logon session) as the process you call this method from. Otherwise `EnumWindows` will not enumerate its window handle. For instance, you cannot use this method from a service, or if the process in question runs under a different logged on user account, or to retrieve the HWND for a screensaver if the workstation is locked, etc. – c00000fd Jun 10 '15 at 20:40
  • Just converted this code in free pascal and works like cheese for me too:) – Jako Nov 10 '15 at 15:41
8

A single PID (Process ID) can be associated with more than one window (HWND). For example if the application is using several windows.
The following code locates the handles of all windows per a given PID.

void GetAllWindowsFromProcessID(DWORD dwProcessID, std::vector <HWND> &vhWnds)
{
    // find all hWnds (vhWnds) associated with a process id (dwProcessID)
    HWND hCurWnd = NULL;
    do
    {
        hCurWnd = FindWindowEx(NULL, hCurWnd, NULL, NULL);
        DWORD dwProcID = 0;
        GetWindowThreadProcessId(hCurWnd, &dwProcID);
        if (dwProcID == dwProcessID)
        {
            vhWnds.push_back(hCurWnd);  // add the found hCurWnd to the vector
            wprintf(L"Found hWnd %d\n", hCurWnd);
        }
    }
    while (hCurWnd != NULL);
}
Michael Haephrati
  • 3,660
  • 1
  • 33
  • 56
4

Thanks to Michael Haephrati, I slightly corrected your code for modern Qt C++ 11:

#include <iostream>
#include "windows.h"
#include "tlhelp32.h"
#include "tchar.h"
#include "vector"
#include "string"

using namespace std;

void GetAllWindowsFromProcessID(DWORD dwProcessID, std::vector <HWND> &vhWnds)
{
    // find all hWnds (vhWnds) associated with a process id (dwProcessID)
    HWND hCurWnd = nullptr;
    do
    {
        hCurWnd = FindWindowEx(nullptr, hCurWnd, nullptr, nullptr);
        DWORD checkProcessID = 0;
        GetWindowThreadProcessId(hCurWnd, &checkProcessID);
        if (checkProcessID == dwProcessID)
        {
            vhWnds.push_back(hCurWnd);  // add the found hCurWnd to the vector
            //wprintf(L"Found hWnd %d\n", hCurWnd);
        }
    }
    while (hCurWnd != nullptr);
}
Obsidian
  • 3,719
  • 8
  • 17
  • 30
rsarov
  • 81
  • 5
3

You can use EnumWindows and GetWindowThreadProcessId() functions as mentioned in this MSDN article.

PermanentGuest
  • 5,213
  • 2
  • 27
  • 36