程序只运行一个实例,并激活前一个实例

示例代码运行效果图如下:

实现程序只运行一次的方法很多,但是原理都是一样的,就是运行第一次的时候设置一个标记,每次运行的时候检查该标记,如果有就说明已经运行了。

具体实现:

1、在程序初始化的时候 (InitInstance()) 枚举所有的窗口,查找本程序的实例是否存在

2、在主窗口初始化的时候在本窗口的属性列表中添加一个标记,以便程序查找.

部分关键代码

1、在App的InitInstance()中枚举所有窗口,查找本程序实例

HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);  //枚举所有运行的窗口
if(oldHWnd != NULL)
{
  AfxMessageBox("本程序已经在运行了");
  ::ShowWindow(oldHWnd,SW_SHOWNORMAL);  //激活找到的前一个程序
  ::SetForegroundWindow(oldHWnd);  //把它设为前景窗口
  return false;  //退出本次运行
}

2、添加EnumWndProc窗口过程函数:

//添加的标识只运行一次的属性名
CString g_szPropName = "Your Prop Name";  //自己定义一个属性名
HANDLE  g_hValue = (HANDLE)1;  //自己定义一个属性值
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
  HANDLE h = GetProp(hwnd,g_szPropName);
  if( h == g_hValue)
  {
    *(HWND*)lParam = hwnd;
    return false;
  }
  return true;
}

3、在主窗口的 OnInitDialog()中添加属性

//设置窗口属性
SetProp(m_hWnd,g_szPropName,g_hValue);

本文配套源码

时间: 2024-09-17 03:42:05

程序只运行一个实例,并激活前一个实例的相关文章

如何让VC和Delphi程序只运行一个实例

有些时候,我们需要我们的程序只运行一个实例,笔者自己作程序也有这样的情况,于是自已探究一番.忙活一阵后,总算小有收获,不敢独享,在天极发表出来,供大家参考. 既然是从根本上解决问题,对于Windows程序而言,就从WinMain函数入口,这是因为在VC中使用SDK的方式编写程序最透明,并且WinMain是作为VC编译器生成EXE文件的默认入口函数. WinMain的函数原型: int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, L

如何使应用程序只运行一个实例

要使应用程序只运行一个实例,一个简单的方法是在应用程序类中使用互斥量,这可以用VC下的GUIDGEN.EXE程序产生.GUIDGEN.EXE位于VC安装目录CommonTools目录下 实例 1: 新建一基于对话框的工程ex1,采用默认设置 2: 用GUIDGEN.EXE产生一个全局标志,#define one "产生的全局标志" 本例中产生的语句如下:#define one "0xbe8e2ce1, 0xdab6, 0x11d6, 0xad, 0xd0, 0x0, 0xe0

让C#程序只运行一个实例,显示已经运行的界面

让程序只运行一个实例的方法一: static void Main()         {             System.Threading.Mutex mutex;             bool isNew;             mutex = new System.Threading.Mutex(true, "myproject", out isNew);             if (isNew)             {                 App

QT中实现程序只运行一个实例--应用程序的单例化

起因 最近想实现一个应用程序单例化的程序, 目前使QT运行一个实例有如下几种方式 1.QSharedMemory 使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出; 这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动. 2.文件锁 在程序运行的时候就在目录下创建一个文件,当程序运行时就判断这个文件是否存在,如果存在说明程序已经在运行.其本质与QSharedMemory相同 3.利用QLocalServer 参照 Qt实现应用程序单实例运行–Loca

wpf只运行一个实例

原文:wpf只运行一个实例在winform下,只运行一个实例只需这样就可以: 1. 首先要添加如下的namespace: using System.Threading; 2. 修改系统Main函数,大致如下:         bool bCreatedNew;               //Create a new mutex using specific mutex name         Mutex m =new Mutex( false, "myUniqueName", ou

WinForm限制客户程序只能运行一个实例

WinForm限制客户程序只能运行一个实例: using System; using System.Threading; static void Main() { bool create = false; using (Mutex mu = new Mutex(true, Application.ProductName, out create)) { if (create) { Application.Run( new MainForm() ); } else { MessageBox.Show

补丁程序提示有一个挂起的安装实例,请重起机器

在安装SQL Server 2000或SP3补丁的时候,安装程序提示有一个挂起的安装实例,要求重起机器. 例如:"以前的某个程序安装已在安装计算机上创建挂起的文件操作. 运行安装程序之前必须重新启动计算机." 但实际情况是:重起多次操作系统都不起作用,把操作系统的Temp临时目录都清除,也不起作用. 此问题的解决方法如下:运行regedit打开注册表编辑器,HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession Manager中找到Pen

只运行一个实例,单击程序快捷方式让程序激活到前台

程序|快捷方式 涉及类: 1. 启动画面类: public class SplashForm : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label lbl_version; /// /// 必需的设计器变量. /// private

只运行一个实例且试图运行第二个实例时自动激活第一个实例

本文配套源码 很多程序象winamp,TTplayer,RealPlayer等都有自动激活前一个实例的功能,其实这玩意也很简单的 ,在VB中可以用App.hInstance 来判断是否运行了程序的一个实例,用API函数FindWindow来找到前一个 实例的句柄,从而为激活她做好了准备.但是App.hInstance 有很大的局限性,一个不需要其他资源支 持的EXE文件,如果你复制到其他目录,这个复制品就可以畅通无阻的运行而不管他的前辈是否已运行, 如果这个程序需要独占某个硬件或其他资源,这样就