基于对话框的单实例应用程序

介绍 有时,有必要将程序限制为只运行一个实例。例如,创建一个监听用户计算机上特定TCP/IP端口的Internet程序,或者创建一个在后台工作的程序,并在系统托盘(靠近时钟)中放置一个图标。 有几篇关于CodeProject和CodeGuru的好文章讨论了您可以使用的不同技术。例如,您可以使用命名内核模式对象(互斥、事件等),或者使用令牌,或者您可以在运行程序列表(EnumProcesses或CreateToolhelp32Snapshot)中搜索您的可执行名称。 在本文中,我将讨论对基于对话框的程序使用FindWindow。问题是Windows在默认情况下使用一个特殊的(非唯一的)类名“#32770 (Dialog)”来创建对话框。我们需要用唯一的类名创建对话框,而不是这个标准的类名。 我会告诉你: 如何用自己的类名创建对话框。如何使用FindWindow根据对话框的类名来查找对话框。 尽管我在这个示例中使用了MFC,但它并不仅限于MFC程序。您可以对基于ATL/WTL的程序以及通用的Win32应用程序执行相同的操作。 实现 创建一个基于MFC对话框的项目。打开资源脚本文件(.rc),找到主对话框模板,并添加以下代码: 隐藏,复制CodeCLASS“SINGLE_INSTANCE_APP” 你应该有这样的东西: 隐藏,复制CodeIDD_SINGLEINSTANCE_DIALOG DIALOGEX 0,0,320, 200 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW 类“SINGLE_INSTANCE_APP” 标题“单实例应用程序” … 这将指示Windows使用我们自己的Windows类“SINGLE_INSTANCE_APP”,而不是标准的对话框类。 现在,我们必须注册“SINGLE_INSTANCE_APP”windows类。最好的位置是InitInstance()。 隐藏,复制CodeWNDCLASS wc = {0}; wc。风格= CS_BYTEALIGNWINDOW | CS_SAVEBITS | CS_DBLCLKS; wc。lpfnWndProc = DefDlgProc; wc。cbWndExtra = DLGWINDOWEXTRA; wc。实例句柄= m_hInstance; wc。hIcon = LoadIcon (IDR_MAINFRAME); wc。LoadCursor(NULL, IDC_ARROW); wc。hbrBackground = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); wc。lpszClassName = _T(“SINGLE_INSTANCE_APP”); ATOM cls = RegisterClass; 在此之后,我们可以通过类名找到主对话框。一个非空指针意味着我们的程序已经在运行。我们将简单地激活它并退出。 隐藏,复制CodeCWnd* pWnd = CWnd::FindWindow(_T("SINGLE_INSTANCE_APP"), NULL); 如果(pWnd) { , pWnd→显示窗口(SW_SHOW); pWnd→窗体提前(),, ,返回错误; } 建议 当然,使用FindWindow有一些您应该知道的限制。如果在调用FindWindow之后而在创建主对话框之前(通过调用CDialog::DoModal()或CDialog::Create())执行一些初始化代码(这将花费很长时间),那么这种技术可能会失败。 因此,您应该避免执行任何在FindWindow调用和创建主对话框之间花费很长时间的代码,并避免使用PreCreateWindow()、OnCreate()等处理程序中的初始化代码。OnInitDialog()是他们最好的地方。 结论 我希望这篇文章对您有用。我在不同的免费和商业软件程序中使用过这种技术,它对我来说非常好用。 本文转载于:http://www.diyabc.com/frontweb/news8571.html

原文地址:https://www.cnblogs.com/Dincat/p/13468214.html