使程序只运行一份实例
如何让一个程序只启动一份,如果再运行则会激活当前已经运行的程序实例呢?非常简单,使用互斥元即可以实现。下面代码是截取至魅族SDK例子里的一段代码:
- //检测是否已经有另外的实例在运行中:
- BOOL bFound = FALSE;
- HANDLE hMutexOneInstantance = CreateMutex(NULL, TRUE, _T("MzMusicPlayMutex"));
- if (GetLastError() == ERROR_ALREADY_EXISTS)
- {
- bFound=TRUE;
- }
- if(hMutexOneInstantance)
- {
- ReleaseMutex(hMutexOneInstantance);
- }
- if (bFound == TRUE)
- {
- //激活已经在运行的实例的窗口
- HWND pwndFirst = FindWindow((LPCTSTR)MzMusicPlayWnd::m_pwszMzMusicPlayWndClassName, (LPCTSTR)NULL);
- if(pwndFirst)
- {
- if(!IsWindowVisible(pwndFirst))
- {
- ShowWindow(pwndFirst, SW_SHOW);
- }
- SetForegroundWindow(pwndFirst);
- }
- return FALSE;
- }
复制代码简单的分析一下代码:
- BOOL bFound = FALSE;
- HANDLE hMutexOneInstantance = CreateMutex(NULL, TRUE, _T("MzMusicPlayMutex"));
复制代码这句代码是创建互斥元,并返回一个句柄,注意CreateMutex最重要的是第三个参数_T("MzMusicPlayMutex"),这个参数相当于互斥元的唯一值,就如同某人的身体证一样。
- if (GetLastError() == ERROR_ALREADY_EXISTS)
- {
- bFound=TRUE;
- }
复制代码创建好了后马上获取一次系统错误,如果返回的值为:ERROR_ALREADY_EXISTS,则表明已经有相同的实体在远行了。于是将bFound设置为TRUE,表示已经找到一个运行的实例。
- if(hMutexOneInstantance)
- {
- ReleaseMutex(hMutexOneInstantance);
- }
复制代码这个就很明显了,使用完后要释放掉互斥资源
- if (bFound == TRUE)
- {
- //激活已经在运行的实例的窗口
- HWND pwndFirst = FindWindow((LPCTSTR)MzMusicPlayWnd::m_pwszMzMusicPlayWndClassName, (LPCTSTR)NULL);//查找窗口句柄
- if(pwndFirst)//是否找到
- {
- if(!IsWindowVisible(pwndFirst))//窗口状态是否为Visible
- {
- ShowWindow(pwndFirst, SW_SHOW);//如果Visible==false 那么就Show出来
- }
- SetForegroundWindow(pwndFirst);//这句是将窗口强制置前
- }
- return FALSE;//注意,恢复了窗口,直接退出代码。否则继续后面的代码
- }
复制代码如果bFound==TRUE则表明内存中已经有有一份实例在运行了,需要做的就是将实例重新弹出到屏幕最前面来。这是由于一些程序会最小化至任务栏,像M8里有些程序会驻留在内存里,只能在任务管理器里找到,这种情况使用上面的代码就能将程序重新恢复到屏幕前。具体的代码我在上面的代码里做了简单的注释。