Jone Lee
Jone Lee

Reputation: 27

Convert PID to HWND

Basically, I want to convert a process ID to a HWND. I am using this code:

   DWORD   dwWindowId;
   CHAR       pszClassName[200];
   HWND     hWnd;

   hWnd = GetTopWindow (NULL);

   while ( hWnd != NULL )
   {
      if ( GetClassName (hWnd, pszClassName, 200) > 0)
         if ( lstrcmpiA (lpcszWindowClass, pszClassName) == 0)
            if ( GetWindowThreadProcessId (hWnd, &dwWindowId) )
               if ( dwWindowId == dwProcessId )
                  return hWnd;

      hWnd = GetNextWindow ( hWnd, GW_HWNDNEXT );
   }
   return NULL;

This worked fine until I tried with a process was created by CreateProcess. What should I do in this case? I have the process info, such as its ID and thread ID from CreateProcess, but I still do not know how to get its hwnd. I did read this:

After you call CreateProcess(), examine the PROCESS_INFORMATION struct pointed to by lpProcessInformation argument. PROCESS_INFORMATION contains a handle to the Process you just started and a Thread ID. With this information call the GetGUIThreadInfo()function and then examine the GUITHREADINFO struct pointed to by lpgui. GUITHREADINFO has several HWNDs. Start with hwndActive, and call GetParent() or GetAncestor() untill the Main window is found.

By bug_crusher

I have tried EnumChildWindows() and EnumWindows(), and they did not work.

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    DWORD PID =0;
    GetWindowThreadProcessId(hwnd,&PID);
    if(PID == 1)
    {
        //,,,,,,,,
    }
    return TRUE;
}

But I don’t get it, can anyone explain that?

Upvotes: 1

Views: 2955

Answers (1)

Jonathan Potter
Jonathan Potter

Reputation: 37132

I'm a bit confused by what you're actually trying to do, but this function will build a vector of all the top-level windows belonging to the specified process.

void GetWindowsOfProcess(DWORD dwId, std::vector<HWND>& vecWindows)
{
    struct WindowsOfProcess
    {
        std::vector<HWND>*  pvecWindows;
        DWORD               dwProcId;

        static BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam)
        {
            DWORD dwProcId;
            GetWindowThreadProcessId(hWnd, &dwProcId);
            if (dwProcId == reinterpret_cast<WindowsOfProcess*>(lParam)->dwProcId)
                reinterpret_cast<WindowsOfProcess*>(lParam)->pvecWindows->push_back(hWnd);
            return TRUE;
        }

        WindowsOfProcess(DWORD dwId, std::vector<HWND>* pvec)
            :   dwProcId(dwId)
            ,   pvecWindows(pvec)
        {
            EnumWindows(EnumProc, reinterpret_cast<LPARAM>(this));
        }
    };
    WindowsOfProcess wop(dwId, &vecWindows);
}

Upvotes: 4

Related Questions