1、首先需要设置一个窗体的属性标志,例如设置一个全局的字符串 cosnt CString g_wndPropName = L"MyProp";
为主窗体加上属性标志 ;
I、在主窗体的OnInitDialog();中添加 ::SetProp(m_hWnd, g_wndPropName , (HANDLE)1); ///< param3中PData用于。。
II、需要注意的是对应的需要在窗体销毁之前将窗体属性移除 ::RemoveProp(m_hWnd, g_wndPropName );
2、在主程序的Instance()中添加 实例验证;
思路是当程序启动的时候 创建一个全局的(跨进程的)标志,例如 Mutex ,Semaphore、Enent都是可以的;
然后去检测是否创建已经存在,在已经存在的情况下去搜索之前的那个窗体和窗体标志,得到后前置;
HANDLE sem = CreateSemaphore(NULL, 1, 1, L"semName"); if (sem) { if (ERROR_ALREADY_EXISTS == GetLastErrror) { CloseHandle(sem); HANDLE hWndpre = ::GetWindow(::GetDesktopWindow(), GW_CHILD); while (::IsWindow(hWndpre)) { if (::GetProp(hWndPre,g_wndPropName ) ) //< 获取窗体属性 { if (::IsIconic(hWndpre)) { ::ShowWindow(hWndpre, SW_RESTORE); } SetFogegroundWindow(hWndpre); ///< 窗体提到最前面 return false; ///< 返回 } hWndpre = ::GetWindow(hWndpre, GW_HWNDNEXT); } ////< 如果到这里 ,则 已经运行一个实例但是找不到主窗体,可能是没有设置窗体属性(SetProp) } } else { ///《 创建程序标志失败; }