用VC++实现程序运行唯一实例
2006-07-10 11:26
453 查看
用VC++实现程序运行唯一实例
方法一:
一、 实现方法
对于具有窗口的应用程序,可以用静态函数CWnd::FindWindow()查找固定窗口,来判断程序是否已经运行。函数原型为:
这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的指针,否则返回值为NULL。
考虑到程序的健壮性,我们还需要判断窗口是否处于最小化状态、是否有弹出式子窗口,这就需要使用CWnd:: GetLastActivePopup()、CWnd::IsIconic()函数,它们的原型分别为:
该函数返回一个指定父窗口中最近激活过的弹出式窗口的指针。如果窗口本身是刚刚激活的,或窗口不包含任何弹出窗口,那么该函数返回指向父窗口自身的指针。
该函数用来判断当前窗口是否处于最小化状态,如果窗口处于最小化状态,函数返回值为True,否则返回Flase。
对于处于最小化状态的窗口,可以调用CWnd::ShowWindow( int nCmdShow )恢复窗口的正常状态,该函数的原型为:
如窗口之前是可见的,函数调用后返回True,否则返回False。参数nCmdShow的值可以为以下任意个常数:
SW_HIDE:隐藏窗口,活动状态给令一个窗口;
SW_MINIMIZE:最小化窗口,活动状态给另一个窗口;
SW_RESTORE:用原来的大小和位置显示一个窗口,同时令其进入活动状态;
SW_SHOW:用当前的大小和位置显示一个窗口,同时令其进入活动状态;
SW_SHOWMAXIMIZED:最大化窗口,并将其激活;
SW_SHOWMINIMIZED:最小化窗口,并将其激活;
SW_SHOWMINNOACTIVE:最小化一个窗口,同时不改变活动窗口;
SW_SHOWNA:用当前的大小和位置显示一个窗口,不改变活动窗口;
SW_SHOWNOACTIVATE:用最近的大小和位置显示一个窗口,不改变活动窗口;
SW_SHOWNORMAL:与SW_RESTORE相同;
最后不要忘记了用CWnd:: SetForegroundWindow()函数将弹出窗口设置为桌面的最前端。
有了上面的知识,我们就可以修改程序中应用程序类的InitInstance()函数,如果程序已经运行,也即是可以发现相应的程序窗口,那么就显示该窗口,InitInstance()函数就返回False,程序提前退出,否则就正常运行。
上述方法虽然实现起来很简单,但是他对于无窗口的应用程式却无能为力。
二、 编程步骤
1、 启动Visual C++6.0,生成一个基于对话框的应用程序,程序命名为"Instance";
2、 修改程序的InitInstance()函数;
3、 添加代码,编译运行程序;
代码如下:
BOOL CTestApp::InitInstance()
{//------------添加--------------
if (!FirstInitInstance())
return false;
//--------------end--------------
AfxEnableControlContainer();
//SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));//设置背景颜色
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
CTestrDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
return FALSE;
}
//-----------添加的成员函数FirstInitInstance()---------------
BOOL CTestApp::FirstInitInstance()
{
CWnd *p;
if(p = CWnd::FindWindow(NULL, "ocr"))
{
p->GetLastActivePopup();
if (p->IsIconic())
{
p->ShowWindow(SW_RESTORE);
}
p->SetForegroundWindow();
return false;
}
else
return true;
}
//成员函数的类型声明是:
public:
CTestApp();
//{{AFX_VIRTUAL(COcrApp)
public:
virtual BOOL InitInstance();
virtual BOOL FirstInitInstance();
//}}AFX_VIRTUAL
方法二:
1.声明句柄HANDLE hApp
2.在InitInstance()函数中写入以下代码:
//只运行一个实例
hApp = CreateMutex(NULL,FALSE,"OnlyOneInstanceExample");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("Already Exist An Instance!");
return FALSE;
}
3. 在ExitInstance() 函数中写入以下代码:
{
CloseHandle(hApp);
return CWinApp::ExitInstance();
}
方法三:
通过动态连接库DLL实现更通用的控制程式运行的方法。在DLL中使用#pragma data_seg指令实现共享数据段,在该数据段中定义一个变量long m_nRun,并配置其初始值为-1,同时还要在DLL的入口点函数DllMain返回成功值的语句前添加语句m_nRun++,意思是在应用程式启动连接DLL成功时对已运行的实例进行计数,然后在DLL中导出一个函数来返回该变量的值。最后将应用程式的工程配置为依赖于该DLL的工程,在应用程式根据DLL中的m_nRun变量的值来判断是否程式已运行了。
方法一:
一、 实现方法
对于具有窗口的应用程序,可以用静态函数CWnd::FindWindow()查找固定窗口,来判断程序是否已经运行。函数原型为:
CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName ); |
考虑到程序的健壮性,我们还需要判断窗口是否处于最小化状态、是否有弹出式子窗口,这就需要使用CWnd:: GetLastActivePopup()、CWnd::IsIconic()函数,它们的原型分别为:
CWnd* GetLastActivePopup( ) |
BOOL IsIconic( ) |
对于处于最小化状态的窗口,可以调用CWnd::ShowWindow( int nCmdShow )恢复窗口的正常状态,该函数的原型为:
BOOL ShowWindow( int nCmdShow ) |
SW_HIDE:隐藏窗口,活动状态给令一个窗口;
SW_MINIMIZE:最小化窗口,活动状态给另一个窗口;
SW_RESTORE:用原来的大小和位置显示一个窗口,同时令其进入活动状态;
SW_SHOW:用当前的大小和位置显示一个窗口,同时令其进入活动状态;
SW_SHOWMAXIMIZED:最大化窗口,并将其激活;
SW_SHOWMINIMIZED:最小化窗口,并将其激活;
SW_SHOWMINNOACTIVE:最小化一个窗口,同时不改变活动窗口;
SW_SHOWNA:用当前的大小和位置显示一个窗口,不改变活动窗口;
SW_SHOWNOACTIVATE:用最近的大小和位置显示一个窗口,不改变活动窗口;
SW_SHOWNORMAL:与SW_RESTORE相同;
最后不要忘记了用CWnd:: SetForegroundWindow()函数将弹出窗口设置为桌面的最前端。
有了上面的知识,我们就可以修改程序中应用程序类的InitInstance()函数,如果程序已经运行,也即是可以发现相应的程序窗口,那么就显示该窗口,InitInstance()函数就返回False,程序提前退出,否则就正常运行。
上述方法虽然实现起来很简单,但是他对于无窗口的应用程式却无能为力。
二、 编程步骤
1、 启动Visual C++6.0,生成一个基于对话框的应用程序,程序命名为"Instance";
2、 修改程序的InitInstance()函数;
3、 添加代码,编译运行程序;
代码如下:
BOOL CTestApp::InitInstance()
{//------------添加--------------
if (!FirstInitInstance())
return false;
//--------------end--------------
AfxEnableControlContainer();
//SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));//设置背景颜色
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
CTestrDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
return FALSE;
}
//-----------添加的成员函数FirstInitInstance()---------------
BOOL CTestApp::FirstInitInstance()
{
CWnd *p;
if(p = CWnd::FindWindow(NULL, "ocr"))
{
p->GetLastActivePopup();
if (p->IsIconic())
{
p->ShowWindow(SW_RESTORE);
}
p->SetForegroundWindow();
return false;
}
else
return true;
}
//成员函数的类型声明是:
public:
CTestApp();
//{{AFX_VIRTUAL(COcrApp)
public:
virtual BOOL InitInstance();
virtual BOOL FirstInitInstance();
//}}AFX_VIRTUAL
方法二:
1.声明句柄HANDLE hApp
2.在InitInstance()函数中写入以下代码:
//只运行一个实例
hApp = CreateMutex(NULL,FALSE,"OnlyOneInstanceExample");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("Already Exist An Instance!");
return FALSE;
}
3. 在ExitInstance() 函数中写入以下代码:
{
CloseHandle(hApp);
return CWinApp::ExitInstance();
}
方法三:
通过动态连接库DLL实现更通用的控制程式运行的方法。在DLL中使用#pragma data_seg指令实现共享数据段,在该数据段中定义一个变量long m_nRun,并配置其初始值为-1,同时还要在DLL的入口点函数DllMain返回成功值的语句前添加语句m_nRun++,意思是在应用程式启动连接DLL成功时对已运行的实例进行计数,然后在DLL中导出一个函数来返回该变量的值。最后将应用程式的工程配置为依赖于该DLL的工程,在应用程式根据DLL中的m_nRun变量的值来判断是否程式已运行了。
相关文章推荐
- 在VC++实现控制程序只运行唯一一个实例
- 在VC++中实现让程序只运行一个实例的方法
- 在VC++中实现让程序只运行一个实例的方法
- 实现程序唯一实例运行
- 在VC++中实现让程序只运行一个实例的方法
- VC 实现程序只运行一个实例,并激活已运行的程序
- [手工搬运][程序系统托盘与运行实例唯一实现]
- VC++实现程序只运行一个实例 最简单办法
- VC++实现程序只运行一个实例 (转)
- [VC]在VC++中实现让程序只运行一个实例的方法且实现该实例
- VC++实现程序只运行一个实例 .
- 【VC】 实现程序只运行一个实例
- VC++实现程序只运行一个实例
- 在VC++中实现让程序只运行一个实例的方法
- 用VC++实现控制程序运行一实例
- VC 实现程序只运行一个实例
- c#实现程序启动唯一实例的一种方法
- c#实现程序启动唯一实例的一种方法
- 基于.Net平台应用程序唯一运行实例实现
- VC程序只运行一次实例