(一)单文档应用程序
 
1、在应用程序类C~~App::InitInstance()函数中判断是否已有一个应用程序实例正在运行
BOOL C~~App::InitInstance()
{
    ......
    // 用应用程序名创建信号量
    HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);
    // 信号量已存在?
    // 信号量存在,则程序已有一个实例运行
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
       // 关闭信号量句柄
       CloseHandle(hSem);
       // 寻找先前实例的主窗口
        HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
       while (::IsWindow(hWndPrevious))
        {
            // 检查窗口是否有预设的标记?
            // 有,则是我们寻找的主窗
            if (::GetProp(hWndPrevious, m_pszExeName))
            {
                // 如果窗口已经缩小在任务栏中,那么首先先打开
                if(!::IsWindowVisible(hWndPrevious))
                    ::PostMessage(hWndPrevious, WM_COMMAND, ID_TRAY_SHOW, 0);
                // 主窗口已最小化,则恢复其大小
                if (::IsIconic(hWndPrevious))
                    ::ShowWindow(hWndPrevious,SW_RESTORE);
                 // 将主窗激活
                 ::SetForegroundWindow(hWndPrevious);
                 // 将主窗的对话框激活
                 ::SetForegroundWindow(
                 ::GetLastActivePopup(hWndPrevious));
                 // 退出本实例
                 return FALSE;
             }
             // 继续寻找下一个窗口
             hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);
         }
         // 前一实例已存在,但找不到其主窗
         AfxMessageBox("已有一个实例在运行,但找不到它的主窗口!");
         // 可能出错了
         // 退出本实例
         return FALSE;
    }
 ......
}
 
2、在框架类的OnCreate()函数中设置查找标记
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    //......
    //设置查找标记。
    ::SetProp(m_hWnd,AfxGetApp()->m_pszExeName,(HANDLE)1);
    return 0;
}
 
3、在程序退出是删除设置的标记,在框架类中响应WM_DESTROY消息,进行处理
void CMainFrame::OnDestroy()
{
    CFrameWnd::OnDestroy();
    // TODO: 在此处添加消息处理程序代码
    //删除所设置的标记。
    ::RemoveProp(m_hWnd,AfxGetApp()->m_pszExeName);
}
 
(二)对话框应用程序
类似单文档应用程序,在对话框的InitInstance()、OnCreate()、OnDestroy()中添加以上代码

VC程序只运行一个实例,并在打开多个时激活原窗口的更多相关文章

  1. vc++高级班之窗口篇[4]---让程序只运行一个实例

      大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...

  2. VC 实现程序只运行一个实例,并激活已运行的程序

    转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...

  3. C#让应用程序只运行一个实例的几种方法

    一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...

  4. [VC]在VC++中实现让程序只运行一个实例的方法且实现该实例

    方法一: 有时候在开发应用程序时,希望控制程序运行唯一的实例.例如,最常用的mp3播放软 件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程.在Visual C+ ...

  5. Java程序只运行一个实例[转]

    如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...

  6. Winform(C#)限制程序只运行一个实例

    C#控制只运行开启一个程序 在这个例子中不需要调用ReleaseMutex,mutex会在程序结束时自动释放.为了防止mutex过早释放,在程序的最后调用下GC.KeepAlive (mutex). ...

  7. 让程序只运行一个实例(Delphi篇)(三种方法,其中使用全局原子的方法比较有意思)

    Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要 ...

  8. WPF程序只运行一个实例

    1.WPF程序在 启动窗口的构造函数执行InitializeComponent之前判断是否已经存在实例 不涉及服务器情况,可直接进行判断(不在mainwindow的构造函数中判断) // public ...

  9. 关于WPF程序只运行一个实例的方法

    找到的方法有两种: 1)http://www.cnblogs.com/liuyazhou/archive/2009/11/02/1594364.html 2)http://codereview.sta ...

随机推荐

  1. php实现IP地址和数字相互转换

    echo $a=ip2long ("202.97.224.68");//地址转换成数字 系统自带的函数 注:这里面有一个要注意的地方,大概由于PHP无法正确判断转换完的数字类型,出 ...

  2. poj1860--Currency Exchange

    Bellman-ford算法的反向应用--正循环检查 /** \brief poj 1860 Bellman-Ford * * \param date 2014/7/24 * \param state ...

  3. lantin1

    Latin1是ISO-8859-1的别名,有些环境下写作Latin-1. ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCI ...

  4. hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: ...

  5. Hello,Ajax

    学习了Ajax技术,写了一个最简单的Ajax应用 <%@page contentType="text/html; charset=utf-8" language=" ...

  6. 如何在uboot上实现从网络下载版本镜像并直接在内存中加载之?

    这是作者近期项目上遇到的一个需求,描述如下: 一块MT7620N的路由器单板,Flash中已存放一个版本并可以通过uboot正常加载并启动.现在需要:在uboot上电启动过程中,通过外部按键触发干涉, ...

  7. php调用C代码的方法详解和zend_parse_parameters函数详解

    php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能   针对第一种情况,最合适的方 ...

  8. spoj7001 Visible Lattice Points 莫比乌斯反演+三维空间互质对数

    /** 题目:Visible Lattice Points 链接:https://vjudge.net/contest/178455#problem/A 题意:一个n*n*n大小的三维空间.一侧为(0 ...

  9. [转]wordpress安装插件的3种方式

    WordPress插件安装方法有几种?WordPress是一种使用PHP语言开发的博客平台,有些用户不知道怎么安装WordPress插件和主题的,所以今天小编就为大家介绍几种WordPress插件安装 ...

  10. 大数据(9) - Flume的安装与使用

    Flume简介 --(实时抽取数据的工具) 1) Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集.聚集.移动的服务,Flume只能在Unix环境下运行. 2) Flume基于流式架构 ...