typedef struct tagWNDINFO
{
DWORD dwProcessId;
HWND hWnd;
} WNDINFO, *LPWNDINFO;BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam);
void xxxx::run_proc(void)
{
CString szFilePath;
szFilePath.Format(_T("C:\\windows\\notepad.exe")); STARTUPINFO strinfo; 
memset(&strinfo,0,sizeof(STARTUPINFO));//这句不可少
strinfo.cb=sizeof(STARTUPINFO);
::GetStartupInfo(&strinfo);
strinfo.wShowWindow=SW_SHOWNORMAL;
strinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; PROCESS_INFORMATION Process_Info;
CreateProcessW(szFilePath,NULL,NULL,NULL,true,NULL,NULL,NULL,&strinfo,&Process_Info); WNDINFO wndf;
wndf.dwProcessId=Process_Info.dwProcessId;
wndf.hWnd=NULL;
EnumWindows(EnumWndProc,(LPARAM)&wndf); TRACE("handle ==>%x id ==>%x ==>%x\r\n",Process_Info.hProcess,Process_Info.dwProcessId,wndf.hWnd);
}BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
DWORD dwProcessId;
GetWindowThreadProcessId(hwnd, &dwProcessId);
TRACE("Process id==>%x \r\n",dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if(pInfo->dwProcessId==dwProcessId)
{
TRACE("<===========================>");
pInfo->hWnd=hwnd;
return false;
}
else
return true;}
为什么这样,不能正确得到窗口的HWND,网上说了 GetWindowThreadProcessId这个得到的是线程ID,那怎么得到进程ID呢?

解决方案 »

  1.   

    又看了这个帖子 http://w370063119.blog.163.com/blog/static/114100174201032604711489/
    那我的是正确的吧郁闷中啊
      

  2.   

    肯定要通过HWND 去得到啊,记事本可以得到了,得Sleep();然后别的复杂的UI界面的得到的是错误的
      郁闷的 
    if(pInfo->dwProcessId==dwProcessId)
    {
    HWND pHwnd=::GetParent(hwnd);
    HWND oldhwnd=hwnd;
    while(pHwnd)
    {
    oldhwnd=pHwnd;
    pHwnd=::GetParent(oldhwnd);
    }
    pInfo->hWnd=oldhwnd;
    return false;
    }
      

  3.   

    //获取对应进程名的ID 
    DWORD GetSpecifiedProcessId(const char *pszProcessName) 

    DWORD id; 
    //获得系统快照句柄 (通俗的讲, 就是得到当前的所有进程) 
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ; 
    PROCESSENTRY32 pInfo; //用于保存进程信息的一个数据结构 
    pInfo.dwSize = sizeof(pInfo); 
    //从快照中获取进程列表 
    Process32First(hSnapShot, &pInfo) ; //从第一个进程开始循环 
    do 

    //这里的 pszProcessName 为你的进程名称 
    if(strcmp(strlwr(_strdup(pInfo.szExeFile)), pszProcessName) == 0) 

    id = pInfo.th32ProcessID ; 
    break ; 

    }while(Process32Next(hSnapShot, &pInfo) != FALSE); 
    return id; //id 就是你要的进程PID 了.. 
    }
      

  4.   

    CreateProcess后调用WaitForInputIdle(Process_Info.hProcess, INFINITE);等待进程窗口初始化完成
      

  5.   


    自己实现了
    不知道这个代码有什么错误,暂时没过多的测试
    void CdemoDlg::run_proc(void)
    {
    CString szFilePath;
    szFilePath.Format(_T("C:\\windows\\notepad.exe")); STARTUPINFO strinfo; 
    memset(&strinfo,0,sizeof(STARTUPINFO));//这句不可少
    strinfo.cb=sizeof(STARTUPINFO);
    ::GetStartupInfo(&strinfo);
    strinfo.wShowWindow=SW_SHOWNORMAL;
    strinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; PROCESS_INFORMATION Process_Info;
    CreateProcessW(szFilePath,NULL,NULL,NULL,false,NULL,NULL,NULL,&strinfo,&Process_Info); WNDINFO wndf;
    wndf.dwProcessId=Process_Info.dwProcessId;
    wndf.hWnd=NULL;
    int x=0;
    while(!wndf.hWnd&&x<1000)
    {
    EnumWindows(EnumWndProc,(LPARAM)&wndf);
    Sleep(10);
    x++;
    }
    TRACE("x=> %d",x);
    //WaitForInputIdle(Process_Info.hProcess, INFINITE); WINDOWPLACEMENT wpment;
    wpment.length=sizeof(wpment);
    ::GetWindowPlacement(wndf.hWnd,&wpment);
    wpment.showCmd=SW_SHOWMAXIMIZED;
    ::SetWindowPlacement(wndf.hWnd,&wpment);
    TRACE("handle ==>%x id ==>%x ==>%x\r\n",Process_Info.hProcess,Process_Info.dwProcessId,wndf.hWnd);
    }BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
    {
    if(!::IsWindow(hwnd))
    return true; //不是窗口,直接返回,查找下一个
    if(!::IsWindowVisible(hwnd))
    return true;//不是可见窗口,直接返回,查找下一个 DWORD dwProcessId;
    GetWindowThreadProcessId(hwnd, &dwProcessId); LPWNDINFO pInfo = (LPWNDINFO)lParam;
    if(pInfo->dwProcessId==dwProcessId)
    {
    HWND pHwnd=::GetParent(hwnd);
    HWND oldhwnd=hwnd;
    while(pHwnd)
    {
    oldhwnd=pHwnd;
    pHwnd=::GetParent(oldhwnd);
    }
    pInfo->hWnd=oldhwnd;
    return false;
    }
    else
    return true;}