迷你5207专属论坛

注册

 

发新话题 回复该主题

[魅族M8] 魅族M8SDK学习系例之使程序只运行一份实例 [复制链接]

发表者
使程序只运行一份实例

如何让一个程序只启动一份,如果再运行则会激活当前已经运行的程序实例呢?非常简单,使用互斥元即可以实现。下面代码是截取至魅族SDK例子里的一段代码:
  1.     //检测是否已经有另外的实例在运行中:
  2.     BOOL bFound = FALSE;
  3.     HANDLE hMutexOneInstantance = CreateMutex(NULL, TRUE, _T("MzMusicPlayMutex"));
  4.     if (GetLastError() == ERROR_ALREADY_EXISTS)
  5.     {
  6.         bFound=TRUE;
  7.     }
  8.     if(hMutexOneInstantance)
  9.     {
  10.         ReleaseMutex(hMutexOneInstantance);
  11.     }

  12.     if (bFound == TRUE)
  13.     {
  14.         //激活已经在运行的实例的窗口  
  15.         HWND pwndFirst = FindWindow((LPCTSTR)MzMusicPlayWnd::m_pwszMzMusicPlayWndClassName, (LPCTSTR)NULL);
  16.         if(pwndFirst)
  17.         {
  18.             if(!IsWindowVisible(pwndFirst))
  19.             {
  20.                 ShowWindow(pwndFirst, SW_SHOW);
  21.             }
  22.             SetForegroundWindow(pwndFirst);
  23.         }
  24.         return FALSE;
  25.     }
复制代码
简单的分析一下代码:
  1. BOOL bFound = FALSE;
  2. HANDLE hMutexOneInstantance = CreateMutex(NULL, TRUE, _T("MzMusicPlayMutex"));
复制代码
这句代码是创建互斥元,并返回一个句柄,注意CreateMutex最重要的是第三个参数_T("MzMusicPlayMutex"),这个参数相当于互斥元的唯一值,就如同某人的身体证一样。
  1. if (GetLastError() == ERROR_ALREADY_EXISTS)
  2. {
  3.   bFound=TRUE;
  4. }
复制代码
创建好了后马上获取一次系统错误,如果返回的值为:ERROR_ALREADY_EXISTS,则表明已经有相同的实体在远行了。于是将bFound设置为TRUE,表示已经找到一个运行的实例。
  1. if(hMutexOneInstantance)
  2. {
  3.     ReleaseMutex(hMutexOneInstantance);
  4. }
复制代码
这个就很明显了,使用完后要释放掉互斥资源
  1. if (bFound == TRUE)
  2. {
  3.     //激活已经在运行的实例的窗口  
  4.     HWND pwndFirst = FindWindow((LPCTSTR)MzMusicPlayWnd::m_pwszMzMusicPlayWndClassName, (LPCTSTR)NULL);//查找窗口句柄
  5.     if(pwndFirst)//是否找到
  6.     {
  7.         if(!IsWindowVisible(pwndFirst))//窗口状态是否为Visible
  8.         {
  9.             ShowWindow(pwndFirst, SW_SHOW);//如果Visible==false 那么就Show出来
  10.         }
  11.         SetForegroundWindow(pwndFirst);//这句是将窗口强制置前
  12.     }
  13.     return FALSE;//注意,恢复了窗口,直接退出代码。否则继续后面的代码
  14. }
复制代码
如果bFound==TRUE则表明内存中已经有有一份实例在运行了,需要做的就是将实例重新弹出到屏幕最前面来。这是由于一些程序会最小化至任务栏,像M8里有些程序会驻留在内存里,只能在任务管理器里找到,这种情况使用上面的代码就能将程序重新恢复到屏幕前。具体的代码我在上面的代码里做了简单的注释。
本主题由 皇帝 5207 于 2010-12-27 22:53:31 执行 设置高亮 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
沙发

试了 不成功 有几处地方不明白
HANDLE hMutexOneInstantance = CreateMutex(NULL, TRUE, _T("MzMusicPlayMutex"));
MzMusicPlayMutex是随便起的名字还是这个窗体的类名?

HWND pwndFirst = FindWindow((LPCTSTR)MzMusicPlayWnd::m_pwszMzMusicPlayWndClassName, (LPCTSTR)NULL);
MzMusicPlayWnd::m_pwszMzMusicPlayWndClassName这里不明白什么意思
最后编辑zouhu 最后编辑于 2010-11-29 22:28:16
TOP
凳子

回复 2# zouhu 的帖子

1、MzMusicPlayMutex 随便起的
2、这个是宏,看看窗口的定义
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
发新话题 回复该主题