vc 程序单例

来源:互联网 发布:centos 个人 编辑:程序博客网 时间:2024/06/02 00:05

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


0 0