vc 程序单例

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

 
 

你可能感兴趣的:(VC,程序单实例)