【MFC】单实例运行环境中,如何激活已经运行的实例并在顶层窗口全屏显示?两种方法,全网首发!
方法一:(独创方法,全网首发)使用ShowWindow
1 BOOL CMyApp::InitInstance() 2 { 3 // One instance 4 HANDLE hMutex = CreateMutex(NULL, TRUE, _T("MyApp")); //Exe文件名字MyApp.exe 5 if (NULL == hMutex) 6 { 7 return FALSE; 8 } 9 10 //如果程序已经存在并且正在运行, 激活已经运行的实例 11 if( GetLastError() == ERROR_ALREADY_EXISTS ) 12 { 13 //系统根据窗口标题找到窗口 14 HWND hProgramWnd = ::FindWindow(NULL, _T("此处填写待激活窗口的标题")); 15 16 if (NULL != hProgramWnd) 17 { 18 ::ShowWindow(hProgramWnd, SW_SHOWMAXIMIZED); //将运行的程序窗口还原成最大窗口状态 19 ::SetForegroundWindow(hProgramWnd); //使得被激活窗口出现在顶层窗口 20 } 21 22 //关闭进程互斥体 23 CloseHandle(hMutex); 24 return FALSE; 25 } 26 27 ... //其他代码 28 }
方法二:(网上通用方法)使用SetWindowPos
1 BOOL CMyApp::InitInstance() 2 { 3 // One instance 4 HANDLE hMutex = CreateMutex(NULL, TRUE, _T("MyApp")); //Exe文件名字MyApp.exe 5 if (NULL == hMutex) 6 { 7 return FALSE; 8 } 9 10 //如果程序已经存在并且正在运行, 激活已经运行的实例 11 if( GetLastError() == ERROR_ALREADY_EXISTS ) 12 { 13 //系统根据窗口标题找到窗口 14 HWND hProgramWnd = ::FindWindow(NULL, _T("此处填写待激活窗口的标题")); 15 16 if (NULL != hProgramWnd) 17 { 18 WINDOWPLACEMENT *pWndpl = NULL; 19 WINDOWPLACEMENT wpm; 20 pWndpl = &wpm; 21 GetWindowPlacement(hProgramWnd, &wpm); 22 if (NULL != pWndpl) 23 { 24 pWndpl->showCmd = SW_SHOWMAXIMIZED; //将运行的程序窗口还原成最大窗口状态 25 ::SetWindowPlacement(hProgramWnd, pWndpl); 26 SetWindowPos(hProgramWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 27 ::SetForegroundWindow(hProgramWnd); //使得被激活窗口出现在顶层窗口 28 } 29 } 30 31 //关闭进程互斥体 32 CloseHandle(hMutex); 33 return FALSE; 34 } 35 36 ... //其他代码 37 }

浙公网安备 33010602011771号