note : 检测并激活已经运行的实例
来源:互联网 发布:matlab软件下载lvsexz 编辑:程序博客网 时间:2024/05/17 01:27
年前参加一个外包项目时, 也需要用到检测并激活已经运行的实例。
由于项目经理不是搞C的, 杂七杂八的事也挺多,从来没人看代码. 当时花了半小时,搞了一个特土鳖的方法实现。
也只能这样, 大家都在看结果. 不用土鳖的方法,用啥呢?
用INI文件的键值作为交互,新实例运行后,发现旧实例存在,向INI中写入标识,请激活~, 然后新实例退出.
旧实例开了一个线程,每隔一秒检测一下INI, 如果看到"请激活的标记", 显示到前台(假设是最小化或隐藏的情况), 然后清掉"请激活"标记.
今天我负责的项目被要求加上这个小功能,这次搞了一个 event + 线程检测的方法,看着文明多了~
程序入口检测和建立互斥量和事件.
int Entry_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ std::wstringstrSkinResourcePath; CMainDlg * pMainDlg = NULL; if (ns_base::IsAlreadyRunOnce(PE_INSTANCE_NAME_MAIN_PROG, g_hInstanceMutex)) { if (ns_base::fnOpenEvent(EVENT_NAME_INSTANCE_ACTIVE, g_hEventActive)) { ::SetEvent(g_hEventActive); } return 0; } ns_base::fnCreateEvent(EVENT_NAME_INSTANCE_ACTIVE, g_hEventActive);///...
后台线程检测
/// 一般性后台任务 while (!IsNeedQuitThreadBgTask()) { ::Sleep(1000); if (ns_base::IsMutextExist(PE_INSTANCE_NAME_CMD_LET_MAIN_PROG_QUIT)) { this->PostMessageW(WM_CLOSE, 0, 0); break; } if (WAIT_OBJECT_0 == ::WaitForSingleObject(g_hEventActive, 0)) { ::ResetEvent(g_hEventActive); ShowWindow(); }/// ...
工具函数
BOOL MutextRunOnce(const WCHAR * pcMutexName, HANDLE & hMutex) { hMutex = ::CreateMutexW(NULL, TRUE, pcMutexName); if (ERROR_ALREADY_EXISTS == GetLastError()) { return FALSE; } return TRUE; } BOOL IsAlreadyRunOnce(const WCHAR * pcMutexName, HANDLE & hMutex) { hMutex = ::CreateMutexW(NULL, TRUE, pcMutexName); if (ERROR_ALREADY_EXISTS == GetLastError()) { SAFE_CLOSE_HANDLE(hMutex); return TRUE; } return FALSE; } BOOL IsMutextExist(const WCHAR * pcMutexName) { BOOL bRc = FALSE; HANDLE hMutex = INVALID_HANDLE_VALUE; if (NULL == pcMutexName) return FALSE; bRc = IsAlreadyRunOnce(pcMutexName, hMutex); SAFE_CLOSE_HANDLE(hMutex); return bRc; } BOOL fnCreateEvent(const WCHAR * pcEventName, HANDLE & hEvent) { hEvent = ::CreateEventW(NULL, TRUE, FALSE, pcEventName); if (NULL == hEvent) return FALSE; return (ERROR_ALREADY_EXISTS == GetLastError()) ? FALSE : TRUE; } BOOL fnOpenEvent(const WCHAR * pcEventName, HANDLE & hEvent) { hEvent = ::OpenEventW(EVENT_ALL_ACCESS , FALSE, pcEventName); return (NULL != hEvent); }
0 0
- note : 检测并激活已经运行的实例
- 实验:检测并激活已经运行的程序实例
- 限制应用程序运行一次并激活已经运行的程序
- 程序只运行一个实例,并激活已运行的实例[12月15日更新]
- vc 只运行一个实例,并激活已运行实例
- VC 实现程序只运行一个实例,并激活已运行的程序
- 程序只运行一个实例,并激活已运行的程序
- 程序只运行一个实例,并激活前一个实例
- 只运行一个实例并激活以启动实例
- 程序只运行一个实例,并激活前一个实例
- c# wpf单实例运行并激活前实例
- 程序只运行一个实例,并激活前一个实例
- 程序只运行一个实例,并激活前一个实例
- Java Swing 每次打开只运行一个实例,并激活任务栏里的程序
- 可执行文件单实例运行且激活已运行的实例
- 如何检测系统是否已经运行了相同的程序。
- 检测系统是否已经运行了相同的程序
- 如何检测系统是否已经运行了相同的程序
- 计算机当中的进制转换
- ubuntu默认root密码
- HDU1231 最大连续子序列
- 用Intent发短信和彩信
- IOS单例模式及单例模式的优缺点
- note : 检测并激活已经运行的实例
- XTOJ 1168 Alice and Bob (记忆化搜索)
- Yii Framework-向Controller注册自定义的Action
- TCP协议中的三次握手和四次挥手(图解)
- Win7+Editplus配置Python的开发环境
- POJ3624 Charm Bracelet
- Linux--根文件系统的挂载过程分析
- 计算机是如何启动的(以Windows和linux为例)
- for和Iterator遍历速度比较