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

原创 2005年03月03日 09:26:00

程序只运行一个实例,并激活前一个实例
作者:耿海增

下载本文示例工程(下载为VC知识库链接)


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

具体实现:

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);
版权声明:本文为博主原创文章,欢迎转载 https://blog.csdn.net/ghz/article/details/308793

C#应用程序只允许运行一个实例,多次运行的时候激活当前实例,显示其界面

很多时候,我们开发的程序,需要单例运行的的功能,即整个应用程序只允许同时运行最多一个实例,重复运行的时候,激活当前实力,显示其界面。   在C#程序中,其解决方案有多重,可以参照Charles Ch...
  • honantic
  • honantic
  • 2015-08-17 15:04:36
  • 21532

让MFC程序只运行一个实例

以对话框程序Demo为例:1、在CDemoApp类中添加成员变量: HANDLE m_hMutex;2、重载CWinApp::InitInstance 和 CWinApp::ExitInstance...
  • hxmcnu
  • hxmcnu
  • 2014-03-17 18:31:03
  • 1341

VC++实现程序只运行一个实例

原文地址:http://www.cctry.com/thread-8229-1-1.html                   http://www.vckbase.com/index.php...
  • WUYUAN2011WOAINI
  • WUYUAN2011WOAINI
  • 2012-10-18 23:09:40
  • 5787

Java Swing 每次打开只运行一个实例,并激活任务栏里的程序

import java.awt.AWTException; import java.awt.Dimension; import java.awt.Image; import java.awt.Menu...
  • lovoo
  • lovoo
  • 2016-09-14 21:40:12
  • 2337

在mfc程序中激活另一个已存在的程序

在主程序上添加了调用另一个辅助工具程序的按钮,每按一次都会打开一个新的辅助工具程序实例,这样看起立很别扭。舒服一些的作法应该是:在已经打开一个程序实例的情况下,激活这个实例;在没有已打开实例的情况下,...
  • godofdsp
  • godofdsp
  • 2013-06-28 10:07:05
  • 1179

Qt程序只运行一个实例

#include QSharedMemory shared("name");//随便填个名字就行 if (shared.attach()) {         return 0; } shared....
  • caoshangpa
  • caoshangpa
  • 2016-04-01 15:03:54
  • 2353

Qt只能运行一个实例的3种方法

转自 http://blog.csdn.net/robertkun/article/details/8518576 1. 共享内存的方法 Unix: QSharedMemory "owns" the ...
  • u010855021
  • u010855021
  • 2016-07-19 23:37:20
  • 3234

如何让Java程序只运行一个实例

Java没有提供这样的机制。从操作系统的观点来看,一个启动的Java Application仅仅是一 个JVM的运行实例。运行相同Application的两个实例,仅仅是运行两个无关的JVM。 只...
  • yaerfeng
  • yaerfeng
  • 2012-02-16 15:20:04
  • 6903

程序只启动一个实例的几种方法

    有些时候,我们要求一个程序在系统中只能启动一个实例。比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例。原因很简单,如果同时启动几个...
  • starlee
  • starlee
  • 2007-03-20 09:26:00
  • 11790

linux程序只运行一个实例

法1.使用文件的排他锁,排他锁(Exclusive Locks,简称X锁),又称为写锁、独占锁,是一种基本的锁类型。 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加...
  • mct123
  • mct123
  • 2017-01-13 11:38:16
  • 1084
收藏助手
不良信息举报
您举报文章:程序只运行一个实例,并激活前一个实例
举报原因:
原因补充:

(最多只允许输入30个字)