本帖最后由 fjchenqian 于 2010-10-09 22:13:23 编辑

解决方案 »

  1.   

    调用CreateProcess完毕后,使用
    AfxGetMainWnd-> SetFocus()
      

  2.   

    to tiger991:
    调用完AfxGetMainWnd()->SetFocus() 以后,还是不行。焦点还是会丢失掉。
      

  3.   

    我在主程序中调用了::GetActiveWindow,的到的句柄还是主程序的句柄(this->m_hWnd),我在调用一下这下方法,都没有什么作用。。
    ::SetWindowPos(this->m_hWnd,NULL,0,0,Rect.Width(),Rect.Height(),SWP_NOMOVE );
    ::SetActiveWindow(this->m_hWnd);
    ::SetFocus(this->m_hWnd);
      

  4.   

    这里有个帖子,跟楼主问题一样:http://book.21www.cn/info/vc_mfc/dll/1455.html里面竟然说用Sleep解决了,我很汗啊
      

  5.   

    我按照上面说的用sleep(100)。也是不行汗。
      

  6.   

    试试BOOL SetForegroundWindow(HWND hWnd ); // handle to window to bring to foreground
      

  7.   

    也遇到此问题,SetFocus和SetActiveWindow都无用.
    分析原因,是当前程序被暂停执行等待进程结束.当调用的进程结束时,其发送的转移焦点的消息送来时,自然收不到.解决的方法,是使用CreateThread建立一个线程,线程中调用进程.这样,程序可以正常处理消息,进程结束自动获得焦点.//线程
    HWND hMainWnd;
    LRESULT CALLBACK MyThreadCallGame(LPSTR data)   
    {
                    STARTUPINFO StartupInfo={0};
    PROCESS_INFORMATION ProcessInfo;
    StartupInfo.cb=sizeof(STARTUPINFO); KillTimer(hMainWnd,0); if(!CreateProcess(NULL,"mygame.exe",NULL,NULL,TRUE,
    0,NULL,NULL,&StartupInfo,&ProcessInfo)){
    MessageBox(NULL,"mygame.exe","游戏程序未找   到!",MB_OK);
    return false;
    } WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
    SetTimer(hMainWnd,0,50,NULL);
    }//主程序
    case WM_LBUTTONDOWN:

    /*//原来直接调用的办法无法获得焦点
    STARTUPINFO StartupInfo={0};
    PROCESS_INFORMATION ProcessInfo;
            StartupInfo.cb=sizeof(STARTUPINFO);
    KillTimer(hWnd,0); if(!CreateProcess(NULL,"mygame.exe",NULL,NULL,TRUE,
    0,NULL,NULL,&StartupInfo,&ProcessInfo)){
    MessageBox(NULL,"mygame.exe","游戏程序未找到!",MB_OK);
    return false;} WaitForSingleObject(ProcessInfo.hProcess,INFINITE); SetTimer(hWnd,0,50,NULL);*///该用线程方法,不堵塞消息循环,进程结束自动获得焦点
    hMainWnd=hWnd;
    DWORD threadid=0;
    HANDLE hThread=CreateThread(
    (LPSECURITY_ATTRIBUTES)NULL,
    (LPTHREAD_START_ROUTINE) MyThreadCallGame,
    (LPDWORD)&threadid);
            break;