1

基本的に、プロセス ID を HWND に変換したいと考えています。私はこのコードを使用しています:

   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;

によって作成されたプロセスを試すまで、これはうまくいきましたCreateProcess。この場合、どうすればよいですか?から ID やスレッド ID などのプロセス情報CreateProcessを取得しましたが、その hwnd を取得する方法はまだわかりません。私はこれを読みました:

を呼び出した後 、lpProcessInformation 引数が指す構造体を CreateProcess()調べます。開始したばかりのプロセスへのハンドルとスレッド ID が含まれています。この情報を使用して 関数を呼び出し、 lpgui が指す構造体を調べます。にはいくつかの HWND があります。hwndActive から開始し、メイン ウィンドウが見つかるまでorを呼び出します。PROCESS_INFORMATIONPROCESS_INFORMATIONGetGUIThreadInfo()GUITHREADINFOGUITHREADINFOGetParent()GetAncestor()

作者: bug_crusher

EnumChildWindows()とを試しEnumWindows()ましたが、うまくいきませんでした。

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

よく分からないのですが、誰か説明してくれませんか?

4

1 に答える 1

4

あなたが実際に何をしようとしているのか少し混乱していますが、この関数は、指定されたプロセスに属するすべてのトップレベル ウィンドウのベクトルを構築します。

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);
}
于 2013-06-30T04:07:36.470 に答える