Get hwnd by process id c++
Asked Answered
V

4

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.

Vallery answered 29/7, 2012 at 17:35 Comment(8)
A process isn't limited to 1 window.Bodnar
A process can have several windows, and this have several hwnds.Panhellenism
so, maby is it possible to get all HWNDs and select these, wich have this process ID?Vallery
What's wrong with Process::MainWindowHandle? isn't it what you're looking for?Ube
Possible duplicate of How to get main window handle from process id?Cary
I don't understand how to do that in .net c++Vallery
#3269890 has some very good code doing exactly thisFledge
A process can have also zero windows.Palmitin
A
27
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);
Adalbert answered 22/12, 2013 at 15:32 Comment(3)
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.Selenodont
Just converted this code in free pascal and works like cheese for me too:)Invoke
Care to explain your code for us less-knowledgeable programmers?Chock
L
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);
}
Longley answered 11/1, 2018 at 12:56 Comment(1)
this fails on premium WUP apps as you are not the owner of the packageTergal
C
3

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

Chiaroscuro answered 29/7, 2012 at 18:18 Comment(0)
S
3

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);
}
Stocker answered 13/7, 2019 at 9:43 Comment(1)
Thanks. Not everyone uses Qt but for the ones that do…Longley

© 2022 - 2024 — McMap. All rights reserved.