只运行一个实例的方法
在VC++ 中编程中,只运行一个实例的方法主要有两类:
1 遍历当前的所有窗口,查相同的实例。为了便于查,一般要事先设一个查标志。
2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例。
在发现重复运行时,一般还有一个任务,就是激活已经存在的窗口。
一、 第一类方法的实现
下面是一个具体的例子,下图是示例代码运行的情况。
部分关键代码
enum函数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);
二、 第二类方法
利用互斥对象的例子
//首先在InitInstance() 函数中创建一个同步对象
//如果 GetLastError() 返回ERROR_ALREADY_EXISTS就表明存在一个应用实例了
//返回false取消
// 创建同步对象
hMutexOneInstantance=CreateMutex(NULL,TRUE,_T("PreventSecondInstance"));
if(GetLastError()==ERROR_ALREADY_EXISTS) bFound=TRUE;
if(hMutexOneInstantance) ReleaseMutex(hMutexOneInstantance);
if (bFound==TRUE)
{ ::AfxMessageBox("You have Run one");
return false;
}
这里没有进行激活已有实例的操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论