77341991 发表于 2014-4-28 10:53

根据进程id查找窗体句柄的方法 百度找到的不好用 自己写了个更简单的分享给大家

本帖最后由 77341991 于 2014-4-28 15:15 编辑

//方法一   SendMessage   WM_CLOSE无效
HWND GetProcessIdToHand(DWORD dwProcessID)
{
       HWND hWnd = FindWindowEx(HWND_MESSAGE,0,NULL,0); //HWND_MESSAGE 仅查找所有消息窗口
       int nCount = 0;
      while(hWnd)
      {
                DWORD pid = 0;
                DWORD dwTheardId = GetWindowThreadProcessId(hWnd,&pid);

                //OutputDebugString(sPath+"\r\n");
                if(dwProcessID == pid)
                        break;
                hWnd = GetNextWindow(hWnd,GW_HWNDNEXT);//同级别下一个
      }
      return hWnd;
}

//方法2    使用SendMessage有效   建议用这个
HWND GetProcessIdToHand(DWORD dwProcessId)
{
         HWND _hWnd = FindWindow(0,0);
         _hWnd = GetNextWindow(_hWnd,GW_HWNDLAST); //同级别最后一个
         while(_hWnd)
         {
                DWORD lpdwProcessId;//标识地址符
                DWORD tid=::GetWindowThreadProcessId(_hWnd,&lpdwProcessId);//取进程ID
   
                //CString strName = GetProcessExeName(lpdwProcessId);
                if(lpdwProcessId == dwProcessId)
                {
                           TCHAR lpClassName = {0};
                           GetClassName(_hWnd,lpClassName,MAX_PATH);
                           if(stricmp(lpClassName,"这里填写你要查找的主窗体类名") == 0)//
                           {
                                    return _hWnd;
                           }
                }
                _hWnd = GetNextWindow(_hWnd,GW_HWNDPREV);//同级别上一个
         }
         return 0;
}



mageciqing 发表于 2014-4-28 11:13

很专业    赞一个

lvhpxa 发表于 2014-4-28 11:38

太专业了,我看不懂。{:1_907:}

星期五 发表于 2014-4-28 11:38

天书一样····{:301_973:}

lt20148 发表于 2014-4-28 12:34

感谢楼主分享。

fly_xsh 发表于 2014-4-28 13:06

大神!真大神啊!

zeromaggot 发表于 2014-4-28 20:29

学习了,{:1_918:}
页: [1]
查看完整版本: 根据进程id查找窗体句柄的方法 百度找到的不好用 自己写了个更简单的分享给大家