窗口句柄已經通過EnumWindows得到,如何得到窗口所属进程的ID,名字?
請各位大俠幫忙,謝謝!

解决方案 »

  1.   

    http://www.china-askpro.com/msg8/qa70.shtml
      

  2.   

    通过进程句柄获得exe文件名
    char szProcessName[MAX_PATH] = "unknown";if ( hProcess )
    {
           HMODULE hMod;
           DWORD cbNeeded;       if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
                 &cbNeeded) )
           {
               GetModuleBaseName( hProcess, hMod, szProcessName, 
                                   sizeof(szProcessName) );          //GetModuleFileNameEx( hProcess, hMod, szProcessName, 
               //                    sizeof(szProcessName) );
           }
    }
    具体用GetModuleBaseName还是GetModuleFileNameEx,我忘记了,反正应该一个是获得exe名,一个获得全路径不过这两个函数需要
     Header: Declared in Psapi.h.
      Library: Use Psapi.lib.需要安装sdk
      

  3.   

    handsomerun(毛毛) 我是已知窗口句柄,不知道進程IDlixiaosan(小三) GetWindowThreadProcessId 我把它放在EnumProc函數里了,可是只能取得第一個窗口的ProcessID,然後就報錯了,似乎把回調函數破壞了,怎麼解決呢?
      

  4.   

    "我是已知窗口句柄,不知道進程ID"

    GetWindowThreadProcessId
    获得进程id
    然后由这个进程ID
    调用OpenProcess
    可以获得进程的HANDLE就是这个hProcess 
    所以上面的代码你还是可以用的
      

  5.   

    “GetWindowThreadProcessId 我把它放在EnumProc函數里了,可是只能取得第一個窗口的ProcessID,然後就報錯了,似乎把回調函數破壞了,”应该是不会把回调函数给破坏的你对窗口句柄做判断了吗
    比如句柄的有效性::IsWindow(hwnd)什么的
      

  6.   

    if (hwnd == NULL)
    {
    return FALSE;
    }
    LPDWORD lpdwProcessId;
    GetWindowThreadProcessId(hwnd,lpdwProcessId);if (::IsWindow(hwnd) && ::IsWindowVisible(hwnd) && ((GetWindowLong(hwnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW)!=WS_EX_TOOLWINDOW) )
    //(GetWindowLong(hwnd, GWL_HWNDPARENT)==0))
    {
           TCHAR szCap[255] = {0}; ::GetWindowText(hwnd, szCap, 255); if (strlen(szCap) == 0)
    {
    return TRUE;
    }
    if (lstrcmp(_T("Program Manager"),szCap) == 0)
    {
    return TRUE;
    }
    CString str;
    str = szCap;
    AfxMessageBox(str);
    //TRACE( " name = %s\n",  szCap );
    }
    return TRUE;
    我的enumproc如上, 為甚麼跟蹤執行一次就報錯了呢,0xcccc,似乎句柄被破壞了
      

  7.   

    哎,应该是个低级错误
    DWORD dwProcessId;
    GetWindowThreadProcessId(hwnd,&dwProcessId);这样应该ok了