CreateProcess如何保存焦点 本帖最后由 fjchenqian 于 2010-10-09 22:13:23 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 调用CreateProcess完毕后,使用AfxGetMainWnd-> SetFocus() to tiger991:调用完AfxGetMainWnd()->SetFocus() 以后,还是不行。焦点还是会丢失掉。 我在主程序中调用了::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); 这里有个帖子,跟楼主问题一样:http://book.21www.cn/info/vc_mfc/dll/1455.html里面竟然说用Sleep解决了,我很汗啊 我按照上面说的用sleep(100)。也是不行汗。 试试BOOL SetForegroundWindow(HWND hWnd ); // handle to window to bring to foreground 也遇到此问题,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; View中调用Frame函数 VC中输出某个变量为二进制形式的方法是什么啊? 消息处理函数怎么从vc6转到vc2005? 关于动态数据库中,调用同一个函数是出现错误,谁能知道原因? 关于ActiveX的使用求助!! 为什么我的SDK里面的wingdi.h中没有EnumDisplaySettingsEx函数 求编写收发E_Mail的资料 如何创建类似VC的编译信息窗口的多选项卡的窗口? 怎样得到radio状态 100分望高手指点! 如何隐藏系统托盘栏图标! 向线程发消息,LPARAM传递字符串接收不到 win 32application 创建线程 传一个socket 作为参数 求解惑
AfxGetMainWnd-> SetFocus()
调用完AfxGetMainWnd()->SetFocus() 以后,还是不行。焦点还是会丢失掉。
::SetWindowPos(this->m_hWnd,NULL,0,0,Rect.Width(),Rect.Height(),SWP_NOMOVE );
::SetActiveWindow(this->m_hWnd);
::SetFocus(this->m_hWnd);
分析原因,是当前程序被暂停执行等待进程结束.当调用的进程结束时,其发送的转移焦点的消息送来时,自然收不到.解决的方法,是使用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;