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
{
///《 创建程序标志失败;
}