web-dev-qa-db-ja.com

プロセスIDc ++でhwndを取得します

プロセスIDがわかっている場合、アプリケーションのHWNDを取得するにはどうすればよいですか?誰でもサンプルを投稿できますか? MSV C++ 2010を使用しています。Process:: MainWindowHandleを見つけましたが、使用方法がわかりません。

9
Luke
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);
21
Andre Kirpitch

この MSDNの記事 で説明されているように、EnumWindows関数とGetWindowThreadProcessId()関数を使用できます。

3
PermanentGuest

単一のPID(プロセスID)を複数のウィンドウ(HWND)に関連付けることができます。たとえば、アプリケーションが複数のウィンドウを使用している場合です。
次のコードは、特定の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 dwProcessID = 0;
        GetWindowThreadProcessId(hCurWnd, &dwProcessID);
        if (dwProcessID == dwProcessID)
        {
            vhWnds.Push_back(hCurWnd);  // add the found hCurWnd to the vector
            wprintf(L"Found hWnd %d\n", hCurWnd);
        }
    }
    while (hCurWnd != NULL);
}
1

Michael Haephrati のおかげで、最新の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);
}
0
rsarov