c++ - 取得 - プロセスハンドル プロセスid




プロセスIDからメインウィンドウのハンドルを取得するには? (5)

Hialeのソリューションの拡張として、複数のメインウィンドウを持つプロセスをサポートする異なるバージョンまたは変更されたバージョンを提供することができます。

まず、複数のハンドルを格納できるように構造を修正します。

struct handle_data {
    unsigned long process_id;
    std::vector<HWND> handles;
};

次に、コールバック関数を修正します。

BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam)
{
    handle_data& data = *(handle_data*)lParam;
    unsigned long process_id = 0;
    GetWindowThreadProcessId(handle, &process_id);
    if (data.process_id != process_id || !is_main_window(handle)) {
        return TRUE;
    }
    // change these 2 lines to allow storing of handle and loop again
    data.handles.push_back(handle);
    return TRUE;   
 }

最後に、main関数の戻り値を修正します。

std::vector<HWD> find_main_window(unsigned long process_id)
{
    handle_data data;
    data.process_id = process_id;
    EnumWindows(enum_windows_callback, (LPARAM)&data);
    return data.handles;
}

プロセスIDからメインウィンドウのハンドルを取得するには?

この窓を前面に持っていきたい。

これは "Process Explorer"でうまくいきます。



これは、私の解決策は、トップの答えに基づいて純粋なWin32 / C + +を使用しています。 この考え方は、外部コールバック関数や構造を必要とせずに、必要なものすべてを1つの関数にまとめることです。

HWND FindTopWindow(DWORD pid)
{
    std::pair<HWND, DWORD> params = { 0, pid };

    // Enumerate the windows using a lambda to process each window
    BOOL bResult = EnumWindows([](HWND hwnd, LPARAM lParam) -> BOOL 
    {
        auto pParams = (std::pair<HWND, DWORD>*)(lParam);

        DWORD processId;
        if (GetWindowThreadProcessId(hwnd, &processId) && processId == pParams->second)
        {
            // Stop enumerating
            SetLastError(-1);
            pParams->first = hwnd;
            return FALSE;
        }

        // Continue enumerating
        return TRUE;
    }, (LPARAM)&params);

    if (!bResult && GetLastError() == -1 && params.first)
    {
        return params.first;
    }

    return 0;
}

ちょうどtid(スレッドID)とPID(プロセスID)を混同しないようにしてください:

DWORD pid;
DWORD tid = GetWindowThreadProcessId( this->m_hWnd, &pid);

私はWindows(.NETとは対照的に)がそれを得るための直接的な方法を提供しているとは思わない。

私が知っている唯一の方法は、 EnumWindows()ですべてのトップレベルウィンドウを列挙し、各プロセスがGetWindowThreadProcessID()属するプロセスを見つけることです。 これは間接的で非効率的に聞こえるかもしれませんが、あなたが期待するほど悪くはありません。典型的なケースでは、十数個のトップレベルウィンドウがあります。





windows-7