注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

回首望星辰

See you in the next world

 
 
 

日志

 
 

控制程序运行唯一  

2009-03-09 17:34:14|  分类: 软件开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
实现方法一

  对于具有窗口的应用程序,可以用静态函数CWnd::FindWindow()查找固定窗口,来判断程序是否已经运行。函数原型为:

CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName );

  这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的指针,否则返回值为NULL。

  考虑到程序的健壮性,我们还需要判断窗口是否处于最小化状态、是否有弹出式子窗口,这就需要使用CWnd:: GetLastActivePopup()、CWnd::IsIconic()函数,它们的原型分别为:

CWnd* GetLastActivePopup( )

  该函数返回一个指定父窗口中最近激活过的弹出式窗口的指针。如果窗口本身是刚刚激活的,或窗口不包含任何弹出窗口,那么该函数返回指向父窗口自身的指针。

BOOL IsIconic( )

  该函数用来判断当前窗口是否处于最小化状态,如果窗口处于最小化状态,函数返回值为True,否则返回Flase。

  对于处于最小化状态的窗口,可以调用CWnd::ShowWindow( int nCmdShow )恢复窗口的正常状态,该函数的原型为:

BOOL ShowWindow( int nCmdShow )


  如窗口之前是可见的,函数调用后返回True,否则返回False。参数nCmdShow的值可以为以下任意个常数:

   SW_HIDE:隐藏窗口,活动状态给令一个窗口;

   SW_MINIMIZE:最小化窗口,活动状态给另一个窗口;

   SW_RESTORE:用原来的大小和位置显示一个窗口,同时令其进入活动状态;

   SW_SHOW:用当前的大小和位置显示一个窗口,同时令其进入活动状态;

   SW_SHOWMAXIMIZED:最大化窗口,并将其激活;

   SW_SHOWMINIMIZED:最小化窗口,并将其激活;

   SW_SHOWMINNOACTIVE:最小化一个窗口,同时不改变活动窗口;

   SW_SHOWNA:用当前的大小和位置显示一个窗口,不改变活动窗口;

   SW_SHOWNOACTIVATE:用最近的大小和位置显示一个窗口,不改变活动窗口;

   SW_SHOWNORMAL:与SW_RESTORE相同;

  最后不要忘记了用CWnd:: SetForegroundWindow()函数将弹出窗口设置为桌面的最前端。

  有了上面的知识,我们就可以修改程序中应用程序类的InitInstance()函数,如果程序已经运行,也即是可以发现相应的程序窗口,那么就显示该窗口,InitInstance()函数就返回False,程序提前退出,否则就正常运行。

 

实现方法二

        利用互斥体Mutex

下面的例子用来通过Mutex对象控制某一应用程序只运行一次

    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        HANDLE hMutex = CreateMutex(NULL, FALSE, "Mutex_Only_One_Instance_Allowed");
        if (NULL == hMutex)
        {
            Error("Create mutex error.");
            return -1;
        }
        DWORD dw = WaitForSingleObject(hMutex, 0);
        if (WAIT_FAILED == dw)
        {
            Error("Wait for mutex error.");
            CloseHandle(hMutex); // 释放句柄,当指向同一系统对象的所有句柄释放后,该对象将被删除。
            return -1;
        }
        else if (WAIT_TIMEOUT == dw)
        {
            // 另外一个实例正在运行
            CloseHandle(hMutex);
            return 1;
        }

        // 没有其它实例在运行,本实例将继续运行
        // 在此实现必要的功能性代码,如创建窗口,进入消息循环
        // ...............

        ReleaseMutex(hMutex); // 释放hMutex的持有权,注意这并不等同于删除Mutex对象
        CloseHandle(hMutex);

        return 0;
    }

其中WaitForSingleObject是等待特定对象发出信号(signaled),而Mutex对象在没有任何线程持有时会发出信号。


 

  评论这张
 
阅读(300)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017