"防止同时出现多个应用程序实例"之改进

2023-10-26

"防止同时出现多个应用程序实例"之改进
字号 [大 中 小]
在《Delphi 5 开发人员指南》中第13章中有一篇"防止同时出现多个应用程序实例",
代码中给出了一个MultInst.pas单元,工程引用此单元就能防止同时出现多个实例,
但实际应用中发现,如果应用程序并没有最小化,第二个实例不能把第一个实例提到最前.
下面是我改写的MultInst.pas单元,能解决这个小问题.
//==============================================================================
// Unit Name: MultInst
// Author   : ysai
// Date     : 2003-05-20
// Purpose  : 解决应用程序多实例问题
// History  :
//==============================================================================

//==============================================================================
// 工作流程
// 程序运行先取代原有向所有消息处理过程,然后广播一个消息.
// 如果有其它实例运行,收到广播消息会回发消息给发送程序,并传回它自己的句柄
// 发送程序接收到此消息,激活收到消息的程序,然后关闭自己
//==============================================================================
unit MultInst;

interface

uses
  Windows ,Messages, SysUtils, Classes, Forms;

implementation

const
  STR_UNIQUE    = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
  MI_ACTIVEAPP  = 1;  //激活应用程序
  MI_GETHANDLE  = 2;  //取得句柄

var
  iMessageID    : Integer;
  OldWProc      : TFNWndProc;
  MutHandle     : THandle;
  BSMRecipients : DWORD;

function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
  Longint; stdcall;
begin
  Result := 0;
  if Msg = iMessageID then
  begin
    case wParam of
      MI_ACTIVEAPP: //激活应用程序
        if lParam<>0 then
        begin
          //收到消息的激活前一个实例
          //为什么要在另一个程序中激活?
          //因为在同一个进程中SetForegroundWindow并不能把窗体提到最前
          if IsIconic(lParam) then
            OpenIcon(lParam)
          else
            SetForegroundWindow(lParam);
          //终止本实例
          Application.Terminate;
        end;
      MI_GETHANDLE: //取得程序句柄
        begin
          PostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP,
            Application.Handle);
        end;
    end;
  end
  else
    Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;

procedure InitInstance;
begin
  //取代应用程序的消息处理
  OldWProc    := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
    Longint(@NewWndProc)));

  //打开互斥对象
  MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, STR_UNIQUE);
  if MutHandle = 0 then
  begin
    //建立互斥对象
    MutHandle := CreateMutex(nil, False, STR_UNIQUE);
  end
  else begin
    Application.ShowMainForm  :=  False;
    //已经有程序实例,广播消息取得实例句柄
    BSMRecipients := BSM_APPLICATIONS;
    BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
        @BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
  end;
end;

initialization
  //注册消息
  iMessageID  := RegisterWindowMessage(STR_UNIQUE);
  InitInstance;

finalization
  //还原消息处理过程
  if OldWProc <> Nil then
    SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));

  //关闭互斥对象
  if MutHandle <> 0 then CloseHandle(MutHandle);

end.

 

//使用方法很简单,只要把此单元加入工程就可以了.
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

"防止同时出现多个应用程序实例"之改进 的相关文章

  • HTML 表单似乎同时提交*POST 和 GET?

    这不是诸如此类的问题的重复this https stackoverflow com questions 4726809 send both post and get in a form 而是相反 我有一个通过 jQuery 提交的表单
  • 在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

    我想获得 TCheckbox 的总大小 包括 Delphi 中的框和文本 我查看这篇文章Delphi FMX TCheckbox TRadiobutton 自动调整大小 https stackoverflow com questions 4
  • 帮助程序中的 Rails Form 块 - 如何包含“防止伪造”

    我正在尝试为我的液体主题语言构建一个表单块 我的方法基于这个答案 https stackoverflow com questions 15189669 can the liquid ruby template engine deal wit
  • Django 表单中的只读字段

    如何在 Django 表单中将字段设置为只读 我知道如何禁用某个字段 但这不是我想要的 任何帮助 将不胜感激 您可以使用可选的attrs定义时的参数Field 以机智 somefield forms CharField widget for
  • 通过“修改日期”确定文件夹中的哪个文件是最新的?

    我需要扫描特定文件夹中的最新文件 基本上检查修改日期以查看哪个是最新的 但请记住这些文件具有随机名称 这是我到目前为止得到的 procedure TForm1 Button1Click Sender TObject begin ftp Ho
  • 提交表单而不重定向

    我想提交表单而不重定向页面 表单已提交给第三方 因此我无法在 php ini 中进行更改 我想做的是 无需访问第三方页面即可提交 成功提交后显示警报 目前我正在使用隐藏的 iframe 和表单目标来隐藏 iframe 但我不满意 有没有更好
  • 在 Swift 中将单个整数值视为一个范围

    我需要验证字符串的长度 字符计数允许的值为 6 9 个字符 12个字符 15 个字符 所有具有不同字符数的字符串均无效 因此 我想创建一个 Swift 函数 它接受多个范围并计算字符串 extension String func evalu
  • 从 Delphi 访问 TRAKT API - 承载身份验证问题

    使用 TOauth2Authenticator TRESTClient TRESTRequest TRESTResponseDataSet TRESTResponse TFDmemtable 和 TDataSource 我成功连接到 Tra
  • 如何在不刷新的情况下向字段中插入数据?

    我需要知道如何在不刷新字段的情况下从数据库添加数据 我的意思是就像在电子邮件中添加联系人的工作一样 如果我单击 添加 按钮 我需要打开一个小窗口和其中的联系人 如果我检查一两个联系人并按插入键 它应该被插入到 收件人 字段中 而无需刷新父页
  • 如何将IDL导入到Delphi中?

    我如何导入接口定义语言 idl 文件存入Delphi 将类型和接口转换为 pascal 文件 我试过了 File Open 它只显示 idl 文本文件的文本 Project 添加到项目 它只是 就像 添加了一个 idl文本文件到项目 成分
  • 我有进程 ID,需要使用 Delphi 5 以编程方式关闭关联进程

    任何人都可以帮我提供一个编码示例 以便在我拥有进程 ID 时关闭关联的进程 我将使用 Delphi 5 在 Windows 2003 服务器上以编程方式执行此操作 如果您有进程 ID 并希望强制终止该进程 可以使用以下代码 function
  • 保留表单数据的策略(在选项卡/浏览器关闭时)

    我的任务管理应用程序有一个问题 用户偶尔会关闭浏览器 选项卡 并且他们输入的信息会消失 因为他们不小心关闭了浏览器 选项卡 导致他们输入的文本丢失 有些可以花半个小时输入文字 所以我必须提供一个解决方案 我有几个想法 但希望了解最好的解决方
  • Django 模型表单中的必填字段

    我有一个表格 当我也不想要它们时 会根据需要显示几个字段 这是来自 models py 的表格 class CircuitForm ModelForm class Meta model Circuit exclude lastPaged d
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • laravel 正则表达式验证不起作用

    我刚刚开始使用 laravel 正在努力验证我的表单之一中的文本区域 文本区域用于用户简介 因此我只想允许使用字母 数字 空格和以下字符 这就是我所拥有的 validator Validator make Input all array b
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • 使用 (Object as TClass) 和 TClass(Object) 进行强制转换有什么区别

    有问题在哪里MyObj classnameis TMyClass classname 是真的并且TMyClass MyObj 有效但是 MyObj as TMyclass doSomething抛出转换错误 我真的不需要任何关于这些垃圾的帮
  • 在数据转换之前应用验证

    我想将从提交的用户数据中获得的文本字段转换为 Symfony2 中的对象 我使用 DataTransformer 来做到这一点 当我使用 NotEmpty 或 NotNull 等内置验证器或任何以标准方式内置的自定义验证器时 Symfony
  • 构建两列 html 表单的最佳方法?

    对齐以下内容的最佳方法是什么 我想要 inputTitle左边和右边inputInput在右边 两者之间有错误 CSS crud form width 430px margin 10px solid font family Verdana

随机推荐

  • JVM底层又是如何实现synchronized的

    目前在Java中存在两种锁机制 synchronized和Lock Lock接口及其实现类是JDK5增加的内容 其作者是大名鼎鼎的并发专家Doug Lea 本文并不比较synchronized与Lock孰优孰劣 只是介绍二者的实现原理 数据
  • cuda与Eigen不兼容的解决方案

    cuda提供强大的矩阵计算库cuBlas 但cuBlas没法进行特征值 逆矩阵等高级的运算 要解决这个问题 要么自己写算法 太难 要么调用线性代数运算库 而线性代数运算库中Eigen是最简便易用的一个 当我想把这两个库放在一起编译的时候 出
  • 因果推断(一)-基础

    1 因果推断定义 根源 因果推断就是找到事情发生的原因 重要的现象 桑普森悖论 Casualty和Association之间的区别 Association是人工智能的基础 人工智能Association的问题 知其然 不知其所以然 不可解释
  • System.out.println()的详细解释

    System out println 的深入理解 文章参考了公众号 Java面试那些事儿 面向对象编程即创建了对象 所有的事情让对象帮忙操作 即对象调用方法 System out println hello world 输出 hello w
  • ubuntu 进入 recovery mode 修改系统文件

    当ubuntu无法启动时 根据提示修改某些配置即可 无需重新安装系统 recovery mode 为我们提供了这种便利 启动步骤如下 1 recovery mode 按e键进入如下菜单 2 ro recovery nomodeset 修改为
  • 文件夹重定向失败解决方案

    系统 Win7 原本想将Administrator里的下载目录重定向到D盘下的Download 结果目标选择了D盘 再想将其改成D Download时 出现 无法将父级重定向到后代 指定的路径无效 的提示 想恢复成默认 系统又说 无法生成
  • 2021美赛C题数据(完整有解压密码)

    C题数据 数据链接 https pan baidu com s 1ahACnhdNWRbfRQSVqPM eQ 提取码 eatx 解压的密码是 Af6SP7rdm33PxPJmDb4wZq7cw 说实话 一看到数据 我就果断放弃了C 不过肯
  • CPU的两种架构概要

    2种CPU架构 冯诺伊曼架构和哈佛架构 1 哈佛结构 是一种将程序指令储存 和 数据储存分开的存储器结构 哈佛结构的微处理器通常具有较高的执行效率 其程序指令和数据指令分开组织和储存的 执行时可以预先读取下一条指令 常见的有 PIC系列芯片
  • 计算机毕业设计ssm基于MySQL的房屋中介系统7m60a9 (附源码)轻松不求人

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 ssm mybatis Ma
  • VBS脚本统计红楼梦中贾宝玉出现的次数

    VBS脚本统计红楼梦中贾宝玉出现的次数 文件 链接 https pan baidu com s 1T XIbIHzMZiIX8IiSMcZdg 提取码 sti6 脚本代码 Dim fso ts s 创建Scripting FileSyste
  • 一份关于windows server服务器的安全漏洞处理建议(来自绿盟安全评估)

    文章目录 前言 一 服务器主机存在漏洞应该怎么修复 二 报告中的高危漏洞 部分展示 1 Microsoft Windows CredSSP 远程执行代码漏洞 CVE 2018 0886 2 SSL TLS协议信息泄露漏洞 CVE 2016
  • matlab读取csv有字符有数字,MATLAB读取csv文件里面既有文本又有数字的文件怎么读取。(可以不止csv文件,txt等文件都可以)...

    MATLAB读取csv文件里面既有文本又有数字的文件怎么读取 一 第一种方法用代码读取 用代码读取 1 如果你要读的文件里面都是数字的话 用csvread函数 它有三种方式读取 但是它的缺点就是只能读取全是数值的文件 简单来说 只能读数字
  • 智能小车红绿灯识别功能的实现(python,ubuntu)

    From sztu 自动化专业的小菜鸡 1 基本介绍 交通标志识别代码存在于 config teleop src smartcar scripts文件目录下的camera cmd py中 核心程序为light detection函数 lig
  • JavaScript实现简单区块链

    用JavaScript来实现一个简单的区块链 通过实现过程 你将理解区块链是什么 区块链就是一个分布式数据库 存储结构是一个不断增长的链表 链表中包含着许多有序的记录 然而 在通常情况下 当我们谈到区块链的时候也会谈起使用区块链来解决的问题
  • Implement Trie (Prefix Tree)前缀树系列

    208 Implement Trie Prefix Tree class Trie def init self Initialize your data structure here self tree def insert self wo
  • [HDLBits] Dualedge

    You re familiar with flip flops that are triggered on the positive edge of the clock or negative edge of the clock A dua
  • 时间函数——setDate()

    实例 设置一个月的某一天 var d new Date d setDate 15 d 输出结果 Sun Sep 15 2019 11 06 10 GMT 0800 中国标准时间 定义和用法 setDate 方法用于设置一个月的某一天 浏览器
  • [1055]VM上配置Centos7网络&设置静态IP&修改hostname

    文章目录 配置ceotos7网络 设置静态IP 修改hostname 配置ceotos7网络 首先在安装好centos7的时候会在本机电脑的网络管理里面出现以下网络 开机登录时候直接ping www baidu com 会发现ping不同
  • 一个很骚的sql报错:分页查询,每次返回数据可能不同

    追加 不是主要问题 应该是排序字段缺少唯一值 后面加了rowid 生效了 主表 bdg budget project 辅表 bdg budget 关系 一对一关系 问题 相同sql 分页查询 多次点击 返回的数据可能不同 原因 排序字段是辅
  • "防止同时出现多个应用程序实例"之改进

    防止同时出现多个应用程序实例 之改进字号 大 中 小 在 Delphi 5 开发人员指南 中第13章中有一篇 防止同时出现多个应用程序实例 代码中给出了一个MultInst pas单元 工程引用此单元就能防止同时出现多个实例 但实际应用中发