VC 对话框 只允许运行一个实例 ,如果有就激活到前端

卫衣 / 双肩包 / T 恤/羽绒服等任选,下单送 CSDN 年卡 程序员周边任选一款实物,直接赠送 CSDN 会员年卡+ Coding Plan,写代码学习装备一起拿下 立即抢购

VC 对话框 只允许运行一个实例 ,如果有就激活到前端的实现方法如下:

  1。就是在其APP的CPP实现中,定义函数BOOL COnceApp::IsFirstInstance(CString title),并在其函数BOOL COnceApp::InitInstance()中,调用if (!IsFirstInstance(onlyTitle))   return FALSE; 即可。

  2。 在其APP的CPP实现文件中,定义一个全局的标题标量,CString onlyTitle="你是我的唯一";
  声明标题只是为了后续实例查找激活到前端使用,对于方法2,3 如果不激活到前端就不必要使用了。

  3。 在对话框的CPP实现中,定义为外部变量,extern CString onlyTitle;

  4。 并在对话框初始化函数中BOOL COnceDlg::OnInitDialog(),调用设置为标题SetWindowText(onlyTitle);

 

 

这里列举3种方法第1种最简单。3种方法的APP实现完整代码如下:

===方法1===

// once.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "once.h"
#include "onceDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// COnceApp

BEGIN_MESSAGE_MAP(COnceApp, CWinApp)
 //{{AFX_MSG_MAP(COnceApp)
 //}}AFX_MSG_MAP
 ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COnceApp construction

COnceApp::COnceApp()
{
 // TODO: add construction code here,
 // Place all significant initialization in InitInstance
}


/////////////////////////////////////////////////////////////////////////////
// The one and only COnceApp object

COnceApp theApp;

/////////////////////////////////////////////////////////////////////////////
// COnceApp initialization
//这里是应用程序的入口,还不能设置标题,需要到后面的出现窗口后才能设置标题


//1。声明唯一标题,只是为了后续实例查找激活到前端使用,对于方法2,3 如果不激活到前端就不必要了。
//2。在后面对话框的实现中,定义为外部变量,extern CString onlyTitle;
//3。并在初始化函数中BOOL COnceDlg::OnInitDialog(),将其设置为标题 SetWindowText(onlyTitle);
//
CString onlyTitle="你是我的唯一";
BOOL COnceApp::IsFirstInstance(CString title)
{
//有以下3中方法,第一种最简单

//=====方法1 普通的简单方式

 CWnd *pWndPrev, *pWndChild;
 if (pWndPrev = CWnd::FindWindow(NULL,title))
 {
  //AfxMessageBox( _TEXT("只允许一个实例在运行!"));
  pWndChild = pWndPrev->GetLastActivePopup();
  if (pWndPrev->IsIconic())
   pWndPrev->ShowWindow(SW_RESTORE);
  pWndChild->SetForegroundWindow(); //找到并激活到前端
//  pWndChild->PostMessage(WM_USER+100,0,0);//发消息让已经有的实例到前段,当然也可以发消息让其退出
  return FALSE;
 }
 else
  return TRUE; // 第一个实例
}

 

BOOL COnceApp::InitInstance()
{
 
 if (!IsFirstInstance(onlyTitle))
  return FALSE;

 AfxEnableControlContainer();

 // Standard initialization
 // If you are not using these features and wish to reduce the size
 //  of your final executable, you should remove from the following
 //  the specific initialization routines you do not need.

#ifdef _AFXDLL
 Enable3dControls();   // Call this when using MFC in a shared DLL
#else
 Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif


 COnceDlg dlg;

 m_pMainWnd = &dlg;
  int nResponse = dlg.DoModal();
 if (nResponse == IDOK)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with OK
 }
 else if (nResponse == IDCANCEL)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with Cancel
 }

 // Since the dialog has been closed, return FALSE so that we exit the
 //  application, rather than start the application's message pump.
 return FALSE;
}

 

 

===方法2===

// once.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "once.h"
#include "onceDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// COnceApp

BEGIN_MESSAGE_MAP(COnceApp, CWinApp)
 //{{AFX_MSG_MAP(COnceApp)
 //}}AFX_MSG_MAP
 ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COnceApp construction

COnceApp::COnceApp()
{
 // TODO: add construction code here,
 // Place all significant initialization in InitInstance
}


/////////////////////////////////////////////////////////////////////////////
// The one and only COnceApp object

COnceApp theApp;

/////////////////////////////////////////////////////////////////////////////
// COnceApp initialization
//这里是应用程序的入口,还不能设置标题,需要到后面的出现窗口后才能设置标题


//以下4行代码,只对于方法2使用
#pragma comment( linker ,"/section:Shared,rws" ) //1 等同在链接器LINK标签选项中增加 /section:Shared,rws
#pragma data_seg("Shared")//2 在数据段中加变量
 static LONG g_lInstanceCount = -1;
#pragma data_seg()

//1。声明唯一标题,只是为了后续实例查找激活到前端使用,对于方法2,3 如果不激活到前端就不必要了。
//2。在后面对话框的实现中,定义为外部变量,extern CString onlyTitle;
//3。并在初始化函数中BOOL COnceDlg::OnInitDialog(),将其设置为标题 SetWindowText(onlyTitle);
//
CString onlyTitle="你是我的唯一";
BOOL COnceApp::IsFirstInstance(CString title)
{
//=====方法2 全局的线程变量控制
 BOOL bIsFirstInstance = (InterlockedIncrement(&g_lInstanceCount) == 0);
 if (!bIsFirstInstance)
 {
  //AfxMessageBox( _TEXT("只允许一个实例在运行!"));

  HWND hwnd=FindWindow(NULL,title );//查找自己的先前同类
  ShowWindowAsync(hwnd, 1);  //调用api函数,正常显示窗口
  SetForegroundWindow(hwnd); //找到并激活到前端
  return false;
 }
 else
  return TRUE;// 第一个实例
}

 

BOOL COnceApp::InitInstance()
{
 
 if (!IsFirstInstance(onlyTitle))
  return FALSE;

 AfxEnableControlContainer();

 // Standard initialization
 // If you are not using these features and wish to reduce the size
 //  of your final executable, you should remove from the following
 //  the specific initialization routines you do not need.

#ifdef _AFXDLL
 Enable3dControls();   // Call this when using MFC in a shared DLL
#else
 Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif


 COnceDlg dlg;

 m_pMainWnd = &dlg;
  int nResponse = dlg.DoModal();
 if (nResponse == IDOK)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with OK
 }
 else if (nResponse == IDCANCEL)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with Cancel
 }

 // Since the dialog has been closed, return FALSE so that we exit the
 //  application, rather than start the application's message pump.
 return FALSE;
}

 

===方法3==

// once.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "once.h"
#include "onceDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// COnceApp

BEGIN_MESSAGE_MAP(COnceApp, CWinApp)
 //{{AFX_MSG_MAP(COnceApp)
 //}}AFX_MSG_MAP
 ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COnceApp construction

COnceApp::COnceApp()
{
 // TODO: add construction code here,
 // Place all significant initialization in InitInstance
}


/////////////////////////////////////////////////////////////////////////////
// The one and only COnceApp object

COnceApp theApp;

/////////////////////////////////////////////////////////////////////////////
// COnceApp initialization
//这里是应用程序的入口,还不能设置标题,需要到后面的出现窗口后才能设置标题


//1。声明唯一标题,只是为了后续实例查找激活到前端使用,对于方法2,3 如果不激活到前端就不必要了。
//2。在后面对话框的实现中,定义为外部变量,extern CString onlyTitle;
//3。并在初始化函数中BOOL COnceDlg::OnInitDialog(),将其设置为标题 SetWindowText(onlyTitle);
//
CString onlyTitle="你是我的唯一";
BOOL COnceApp::IsFirstInstance(CString title)
{
//=====方法3  创建进程互斥体
 HANDLE m_hMutex = CreateMutex(NULL,TRUE,_T("1"));
 if (m_hMutex == NULL) return FALSE;
 if (GetLastError() == ERROR_ALREADY_EXISTS)//如果程序已经存在并且正在运行
 {
  //MessageBox(NULL, _TEXT("只允许一个实例在运行!"), "提示", MB_OK | MB_ICONINFORMATION);
  HWND hProgramWnd = ::FindWindow(NULL,_T(title));
  if (hProgramWnd)
  {
   WINDOWPLACEMENT* pWndpl = NULL;
   WINDOWPLACEMENT   wpm;
   pWndpl =&wpm;
   GetWindowPlacement(hProgramWnd,&wpm);
   if (pWndpl)
   {
    pWndpl->showCmd = SW_SHOWNORMAL;//将运行的程序窗口还原成正常状态
    ::SetWindowPlacement(hProgramWnd,pWndpl);
    SetWindowPos(hProgramWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//找到并激活到前端
   }
  }
  CloseHandle(m_hMutex);//关闭进程互斥体
  m_hMutex = NULL;
  return FALSE;
 }
 else
  return TRUE;// 第一个实例
}

 

BOOL COnceApp::InitInstance()
{
 
 if (!IsFirstInstance(onlyTitle))
  return FALSE;

 AfxEnableControlContainer();

 // Standard initialization
 // If you are not using these features and wish to reduce the size
 //  of your final executable, you should remove from the following
 //  the specific initialization routines you do not need.

#ifdef _AFXDLL
 Enable3dControls();   // Call this when using MFC in a shared DLL
#else
 Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif


 COnceDlg dlg;

 m_pMainWnd = &dlg;
  int nResponse = dlg.DoModal();
 if (nResponse == IDOK)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with OK
 }
 else if (nResponse == IDCANCEL)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with Cancel
 }

 // Since the dialog has been closed, return FALSE so that we exit the
 //  application, rather than start the application's message pump.
 return FALSE;
}

MySQL5.7无法连接到[本地] MySQL 服务器 如果您的服务器正在侦听不同的端口,请更改该值。通常意味着系统上没有运行 MySQL 服务器,或者您在尝试连接服务器时使用了不正确的 Unix 套接字文件名或 TCP/IP 端口号。您应该检查是否有一台 MySQL 服务器正在运行、是否已启用网络连接、以及您指定的网络端口是否是服务器上配置的端口。系统变量的情况下启动,并且在运行服务器的主机上运行客户端,则还可以使用命名管道进行连接。LAN 连接是安全的,因为数据包到达时延迟很长的可能性很小,而通过距离和延迟相对较长的互联网则可能如此。 阅读详情

相关推荐

【问题解决记录】Windows 系统小皮面板(phpStudy Pro)MySQL8 无法启动及多 MySQL 共存问题解决

摘要:本文介绍了Windows系统中phpStudy Pro面板MySQL8无法启动的问题及解决方案。当MySQL8启动失败时,首先检查端口冲突,发现3306端口被占用。进一步排查发现系统已存在另一个MySQL服务。通过删除原MySQL服务并重新注册为不同名称(MYSQL8),同时修改phpStudy的MySQL端口为3307,成功实现了两个MySQL实例的共存。关键步骤包括:停止并删除原服务、修改端口、重新注册新服务启动。该方法适用于需要保留原有MySQL服务的同时运行phpStudy MySQL的情况

一名资深全栈开发工程师的博客 1954

MySQL连接工具无法连接的问题及解决方法

本文介绍了MySQL连接工具无法连接的一些常见问题及相应的解决方法。在尝试解决连接问题之前,请确保MySQL服务器正在运行,并检查连接配置、防火墙设置和用户权限。MySQL是一个流行的关系型数据库管理系统,可以通过各种工具进行连接和管理。本文将探讨一些可能导致连接问题的原因,并提供相应的解决方法。防火墙设置可能会阻止MySQL连接。确保您使用的用户名和密码具有足够的权限来连接MySQL数据库。确保您使用的连接工具中的MySQL连接配置正确无误。如果您使用的是其他防火墙工具,请根据其文档进行相应的配置。

MwgmPhilosophy的博客 789

MySQL安装运行时出现服务器无法响应控制的解决办法

MySQL安装运行时出现服务器无法响应控制的解决办法 文章目录MySQL安装运行时出现服务器无法响应控制的解决办法前言一、安装的环境说明二、出现服务器无法响应控制的几个原因1.缺失运行库2.mysql.ini配置文件问题2.1配置文件没有用ANSI编码保存,而是用UTF-8编码保存2.2配置文件中basedir与datadir中的文件路径的‘/’改为‘//’3.其他原因及其解决方法3.1在cmd窗口启动MySQL没有用管理员身份启动,权限不够。3.2其他方法4.如果以上方法都不能解决问题小结 前言 最

weixin_46704975的博客 1631

一个程序运行 一段时间连接不上数据库了(数据库运行正常),重起系统所在的服务器就好了

系统运行中奇怪的问题

qq_36247791的博客 707

windows服务器下,mysql运行一段时间之后忽然无法连接,但是mysql服务启动正常...

出现这种情况以前都是重启服务器可以解决,但是治标不治本,一段时间之后仍然会出现此问题。 此问题不是mysql应用程序的问题而是windows server system 的配置问题。因此需要修改windows server system的配置。 具体办法为修改windows 注册表: 有两个相关值,一是修改MaxUserPort(最大连接数);另一个是修改TcpTimedWaitD...

dbva7063的博客 1200

开启mysql服务器电脑死机_mysql 服务器重启后,很快又死机了,请高手看下 错误日志...

请高手看下 错误日志localhost.localdomain.err 文件的内容Number of processes running now: 0131004 02:43:19 mysqld restartedInnoDB: The log sequence number in ibdata files does not matchInnoDB: the log sequence number...

weixin_42577243的博客 280

nacos连接mysql失败_mysql服务启动连接不上的解决方法

mysql服务启动,但是连接不上,如何解决?登陆报错:root@localhost:~# mysql -u root -pEnter password:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)root@localhost:~# serv...

weixin_34434736的博客 2464

MySQL启动不了,无法启动MySQL服务解决技巧

如果是因为非法关机等原因导致MYSQL无法启动启动有问题的,最好使用重新安装的或确认是OK的MYSQL数据表及ibdata1、mysql.pid、ib_logfile0等文件进行覆盖,天缘试过遇到过多次这种情况,就是原来的MYSQL表有问题了,总是无法启动,但是更换成新表就可以。如果是重新安装的MYSQL,请确认安装后的MYSQL经过第一次配置,否则会缺少my.ini文件,配置方法,可以在安装到最后一步时选择,现在开始配置MYSQL,或在程序组中运行MYSQL配置向导。本文先列一下常见的解决方法。

目标检测专栏持续更新中,改进YOLO系列通用,适用v5、v7、v8、所有博客均是团队原创博客,所有文章禁止转载,违者必究。 1万+

Mysql服务无法启动MySQL安装

在打开控制面板》》管理工具》》服务》》m8(本人设置MySQL服务名为m8)时,出现“本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。”或者在控制台net start MySQL时,出现MySQL服务无法启动服务没有报告任何错误。cd E:\mysql\mysql-8.0.31-winx64\bin (这是本人安装的路径,要以自己的安装位置为准)本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。输入 show databases;

2302_76521190的博客 5018

连接MySQL 出现 2003 无法连接MySQL服务器 (10061 “未知错误“)

本地连接MySQL 出现 2003 无法连接MySQL服务器 (10061 “未知错误”)

weixin_62827213的博客 2601

mysql‘ 不是内部或外部命令、Can‘t connect to MySQL server、mysql服务无法启动、Access denied for user ‘root‘等解决办法

此文章梳理windows系统连接mysql 8.0数据库过程中遇到的问题,mysql8.0与版本5的操作略有不同,请知悉~ 问题一:‘mysql’ 不是内部或外部命令,也不是可运行的程序 问题二:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost:3306’ (10061) 问题三:mysql 服务正在启动 .mysql 服务无法启动服务没有报告任何错误。 问题四:ERROR 1045 (28000): Access denied

weixin_42827025的博客 1万+

如何在Windows上设置启动MySQL服务

当在Windows安装Mysql后,有时候有可能会出现重启电脑Mysql服没有自动启动,那么就需要手动的进行启动!那么下面就介绍一下如何在Windows上设置启动MySQL服务以上就是关于在Windows启动MySQL服务的详细指南。希望对您有所帮助!

咖啡程序员 5986

本地电脑WIN10连接阿里云WINDOWS服务器上搭建的MySQL数据库

前言 连接阿里云WINDOWS服务器上搭建的MySQL数据库,必须要做以下准备工作。 1、阿里云网站注册购买阿里云WINDOWS服务器 https://www.aliyun.com/?utm_content=se_1000301881 警告:购买的阿里云WINDOWS服务器至少需要2G内存,否则MySQL数据库系统无法启动运行。 2、获取公网IP地址并且创建了一个实例,实例已经运行 ...

ba_wang_mao的专栏 2834

Mysql服务启动连接

一、查看并启动MySQL服务。 在Windows XP下安装完MySQL后,它就已经自动启动服务了,并且在开始菜单中有其客户端的快捷方式连接,见图4.1。   图4.1   可以通过Windows服务管理器查看。“开始”-“运行”,输入“services.msc”,回车。弹出Windows服务管理器,然后就可以看见服务名为“mysql”的服务项了,其右边标明“已启动”,见图4.2。   图4.

从无到有 3597

启动连接、断开和停止MySQL服务器

1、启动、停止MySQL服务器 1)、通过系统服务器启动、停止MySQL服务器 如果MySQL设置为windows服务,则可以通过选择“开始”->“控制面板”->“系统和安全”->"管理工具"->“系统和安全”->"管理工具“->"服务”命令打开windows服务器管理器。 2)、在命令提示符下启动和停止MySQL服务器 启...

qq_42080635的博客 1713

mysql显示无法启动服务器,MySql服务器无法启动

对不起,我试图设置MySQL在我的机器上工作完全没有我的元素。我正在运行Windows 7 32x,并没有使用WAMP或任何其他类型的服务器设置。我没有任何问题下载并安装了MySQL网站上的所有内容,并且在安装期间,我选择了一个启动服务器的选项。但是,当我尝试与之交互时,服务器从未运行。如果我进入MySQL Workbench中的服务器启动/关闭屏幕并按下“启动服务器”按钮,服务器将在启动运行几...

weixin_29191669的博客 464

重新启动mysql服务器

-重新启动mysql服务器 如何重启MySQL,正确启动MySQL linux平台及windows平台mysql重启方法   Linux下重启MySQL的正确方法:   1、通过rpm包安装的MySQL   service mysqld restart   2、从源码包安装的MySQL   // linux关闭MySQL的命令   $mysql_dir/bin/mysqladmin -uroot -p shutdown   // linux启动MySQL的命令   $mysql_dir/bi

weixin_45084910的博客 9650

解决Spring Boot 部署到服务器无法连接MySQL 问题

今天spring boot 项目终于写好了,打算部署在刚买的digital ocean服务器上,从github pull之后,执行: mvn clean compile package 报错提示: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last pack...

bigbroase的博客 5010

windows启动mysql服务的命令行启动和手动启动方法

今天遇到mysql服务无法启动,上网一查很多人也遇到mysql服务器启动不了的问题,所以就索性整理了windows启动mysql服务的命令行启动和手动启动方法的文章,以便各位遇到同类问题的朋友进行参考。     1、图形界面下启动mysql服务。      在图形界面下启动mysql服务的步骤如下:     (1)打开控制面板->管理工具->服务,如下图所示:     可以看到Mys

Android教程_Android开发教程 16万+
上一篇: MFC中Static控件透明,重影,长度问题
下一篇: C++基础注意事项
Angus_pei
博客等级 码龄16年 18粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值