(一)单文档应用程序
 
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. Kafka 快速起步

    Kafka 快速起步 原创 2017-01-05 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 主要内容:1. kafka 安装.启动2. 消息的 ...

  2. php容易忽视的地方

    一:bool in_array ( mixed $needle , array $haystack [, bool $strict ] ) 用的时候加最后一个参数,判断类型 <?php $a = ...

  3. Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本

    Atitit. 图像处理jpg图片的压缩  清理垃圾图片 java版本 1. 清理图片压缩图片尺寸 1 2. 所以要使用ImageWriter 1 3. Thumbnails质量压缩builder.o ...

  4. vivado error [Labtools 27-2149]

    使用vivado2014.3时遇到了这种错误 ERROR: [Labtools 27-2149] File E:/project/V7_PCIE/prj/PhasedProject/M_PcieGen ...

  5. Java Servlet/JSP容器配置 session id

    http://www.eclipse.org/jetty/documentation/current/session-management.html#setting-session-character ...

  6. JAVA设计模式之 命令模式【Command Pattern】

    一.概述 命令模式能够将请求发送者和接收者全然解耦.发送者与接收者之间没有直接引用关系,发送请求的对象仅仅须要知道怎样发送请求,而不必知道怎样完毕请求.核心在于引入了命令类,通过命令类来减少发送者和接 ...

  7. python之读取Excel 文件

    # -*- coding: utf-8 -*- """ Created on Thu May 24 13:53:10 2018 @author: Frank " ...

  8. iOS开发 -李洪强-清除缓存

    // //  SetViewController.m //  dfhx // //  Created by dfhx_iMac_001 on 16/4/5. //  Copyright © 2016年 ...

  9. CCNA2.0笔记_子网划分

    http://files.cnblogs.com/files/airoot/%E5%AD%90%E7%BD%91%E5%88%92%E5%88%86.zip 网络 默认子网掩码 A类 255.0.0. ...

  10. Compiler Error C2872: ambiguous symbol

    参考资料:http://blog.csdn.net/greytree/article/details/354530 刚才写的程序报错ERROR C2872(CL.exe)原因很简单 ZThread有定 ...