//防止多次打开unit MultInst;
interface
uses Windows ,Messages, SysUtils, Classes, Forms;
implementation
constSTR_UNIQUE    = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';MI_ACTIVEAPP  = 1;  {激活应用程序}MI_GETHANDLE  = 2;  {取得句柄}
variMessageID    : Integer;OldWProc      : TFNWndProc;MutHandle     : THandle;BSMRecipients : DWORD;
function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall;
beginResult := 0;if Msg = iMessageID thenbegincase wParam ofMI_ACTIVEAPP: {激活应用程序}if lParam<>0 thenbegin{收到消息的激活前一个实例}{为什么要在另一个程序中激活?}{因为在同一个进程中SetForegroundWindow并不能把窗体提到最前}if IsIconic(lParam) thenOpenIcon(lParam)elseSetForegroundWindow(lParam);Application.Terminate; {终止本实例}end;MI_GETHANDLE: {取得程序句柄}beginPostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP, Application.Handle);end;end;endelseResult := 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 thenbegin{建立互斥对象}MutHandle := CreateMutex(nil, False, STR_UNIQUE);endelsebeginApplication.ShowMainForm  :=  False;{已经有程序实例,广播消息取得实例句柄}BSMRecipients := BSM_APPLICATIONS;BroadcastSystemMessage(BSF_POSTMESSAGE or BSF_POSTMESSAGE,@BSMRecipients,iMessageID,MI_GETHANDLE,Application.Handle);//BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);end;
end;
initialization{注册消息}iMessageID  := RegisterWindowMessage(STR_UNIQUE);InitInstance;
finalization{还原消息处理过程}if OldWProc <> Nil thenSetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));{关闭互斥对象}if MutHandle <> 0 thenCloseHandle(MutHandle);
end.

在XE7下测试通过.

转载于:https://www.cnblogs.com/LceMeaning/p/5655523.html

Delphi 防止程序多次运行《转》相关推荐

  1. Delphi CreateMutex 防止程序多次运行

    windows是个多用户多任务的操作系统,支持多个程序同时运行,如果你的程序不想让用户同时运行一个以上, 那应该怎样做呢? 本文将介绍避免用户同时运行多个程序的例子. 需要用到的函数CreateMut ...

  2. Delphi应用程序的调试(二)使用断点

    Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...

  3. Delphi的程序单元结构

    来源:http://blog.csdn.net/lcq419/article/details/1305538 Delphi的程序单元 Object Passal的程序结构很特殊,与其它语言如C++,O ...

  4. 056_《Delphi应用程序开发精彩实例》

    <Delphi应用程序开发精彩实例> Delphi 教程 系列书籍 (056) <Delphi应用程序开发精彩实例> 网友(邦)整理 EMail: shuaihj@163.co ...

  5. Ubuntu中如何使得程序在后台运行

    Ubuntu中如何使得程序在后台运行 一.前言 在Ubuntu中有的程序启动需要执行改程序./bin目录下的文件,并且启动之后这个shell就不能使用和关闭了,非常的麻烦,因此就有了相应的命令来解决这 ...

  6. iOS中判断程序是不是第一次运行(新手引导界面用)

    2019独角兽企业重金招聘Python工程师标准>>> 在软件下载安装完成后,第一次启动往往需要显示一个新手操作引导,来告诉用户怎么操作这个app,这就需要在程序一开始运行就判断程序 ...

  7. Arduino可穿戴教程之第一个程序——上传运行程序(四)

    Arduino可穿戴教程之第一个程序--上传运行程序(四) 2.4.5  上传程序 现在所有Arduino IDE的设置都完成了,我们就可以将示例程序上传到板子中了.这非常简单,只需要单击如图2.45 ...

  8. python爬虫流程-Python爬虫程序架构和运行流程原理解析

    1 前言 Python开发网络爬虫获取网页数据的基本流程为: 发起请求 通过URL向服务器发起request请求,请求可以包含额外的header信息. 获取响应内容 服务器正常响应,将会收到一个res ...

  9. Delphi:程序自己删除自己,适用于任何windows版本(含源码)

    Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var   sei: TSHELLEXECUTEINFO;   szMod ...

最新文章

  1. Linux意外之rpm的删除与恢复
  2. 世界最优秀的分布式文件系统架构演进之路
  3. 笔记-信息系统开发基础-uml-uml类图关系
  4. 四十一、深入Java中的 File类
  5. LinkedHashSet集合
  6. [深度学习] 一篇文章理解 word2vec
  7. SQL中where 1 = 1的用处
  8. 无人驾驶五 使用pure pursuit实现无人车轨迹追踪(python)
  9. LeetCode7.反转整数
  10. 将WinServers2019打造成家用系统
  11. Word插入插图清单目录、附表清单目录
  12. 计算机基础常见八股问题集合(含计算机网络,操作系统,计算机组成,数据结构与算法,数据库)
  13. 电信系统服务器地址,中国电信专线dns服务器地址!DNS
  14. iPhone模拟器突然开始运行非常慢
  15. ColdFusion CGI or Application variables
  16. python实现嗅探
  17. 详解Linux内核IO技术栈
  18. 我的世界java版1.7.10咋刷物品,1.7指令方块刷自定义药水教程
  19. Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not wor
  20. 华为模拟器eNSP安装初体验

热门文章

  1. 【opencv学习】Blob检测斑点
  2. 漫步数学分析一——实数轴
  3. Jaccard文本相似度计算 Java程序
  4. C++/C--unordered_map常见用法详解
  5. springboot 做表白墙_经贸吐槽墙 |2020.12.13
  6. 6-4 使用函数统计指定数字的个数_高手不可不学的Excel引用函数(上)
  7. 跳一跳python开挂_微信跳一跳物理外挂—教​你用 Python 来玩微信跳一跳
  8. mysql数据字典生成器_「python技术」列表推导、生成器表达式和字典推导的差异及其示例
  9. python爬虫requests简单案例_Python小例子:一个最简单的爬虫
  10. 查看pcl版本 linux,Ubuntu16上安装PCL