Delphi 防止程序多次运行《转》
//防止多次打开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 防止程序多次运行《转》相关推荐
- Delphi CreateMutex 防止程序多次运行
windows是个多用户多任务的操作系统,支持多个程序同时运行,如果你的程序不想让用户同时运行一个以上, 那应该怎样做呢? 本文将介绍避免用户同时运行多个程序的例子. 需要用到的函数CreateMut ...
- Delphi应用程序的调试(二)使用断点
Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...
- Delphi的程序单元结构
来源:http://blog.csdn.net/lcq419/article/details/1305538 Delphi的程序单元 Object Passal的程序结构很特殊,与其它语言如C++,O ...
- 056_《Delphi应用程序开发精彩实例》
<Delphi应用程序开发精彩实例> Delphi 教程 系列书籍 (056) <Delphi应用程序开发精彩实例> 网友(邦)整理 EMail: shuaihj@163.co ...
- Ubuntu中如何使得程序在后台运行
Ubuntu中如何使得程序在后台运行 一.前言 在Ubuntu中有的程序启动需要执行改程序./bin目录下的文件,并且启动之后这个shell就不能使用和关闭了,非常的麻烦,因此就有了相应的命令来解决这 ...
- iOS中判断程序是不是第一次运行(新手引导界面用)
2019独角兽企业重金招聘Python工程师标准>>> 在软件下载安装完成后,第一次启动往往需要显示一个新手操作引导,来告诉用户怎么操作这个app,这就需要在程序一开始运行就判断程序 ...
- Arduino可穿戴教程之第一个程序——上传运行程序(四)
Arduino可穿戴教程之第一个程序--上传运行程序(四) 2.4.5 上传程序 现在所有Arduino IDE的设置都完成了,我们就可以将示例程序上传到板子中了.这非常简单,只需要单击如图2.45 ...
- python爬虫流程-Python爬虫程序架构和运行流程原理解析
1 前言 Python开发网络爬虫获取网页数据的基本流程为: 发起请求 通过URL向服务器发起request请求,请求可以包含额外的header信息. 获取响应内容 服务器正常响应,将会收到一个res ...
- Delphi:程序自己删除自己,适用于任何windows版本(含源码)
Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var sei: TSHELLEXECUTEINFO; szMod ...
最新文章
- Linux意外之rpm的删除与恢复
- 世界最优秀的分布式文件系统架构演进之路
- 笔记-信息系统开发基础-uml-uml类图关系
- 四十一、深入Java中的 File类
- LinkedHashSet集合
- [深度学习] 一篇文章理解 word2vec
- SQL中where 1 = 1的用处
- 无人驾驶五 使用pure pursuit实现无人车轨迹追踪(python)
- LeetCode7.反转整数
- 将WinServers2019打造成家用系统
- Word插入插图清单目录、附表清单目录
- 计算机基础常见八股问题集合(含计算机网络,操作系统,计算机组成,数据结构与算法,数据库)
- 电信系统服务器地址,中国电信专线dns服务器地址!DNS
- iPhone模拟器突然开始运行非常慢
- ColdFusion CGI or Application variables
- python实现嗅探
- 详解Linux内核IO技术栈
- 我的世界java版1.7.10咋刷物品,1.7指令方块刷自定义药水教程
- Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not wor
- 华为模拟器eNSP安装初体验
热门文章
- 【opencv学习】Blob检测斑点
- 漫步数学分析一——实数轴
- Jaccard文本相似度计算 Java程序
- C++/C--unordered_map常见用法详解
- springboot 做表白墙_经贸吐槽墙 |2020.12.13
- 6-4 使用函数统计指定数字的个数_高手不可不学的Excel引用函数(上)
- 跳一跳python开挂_微信跳一跳物理外挂—教​你用 Python 来玩微信跳一跳
- mysql数据字典生成器_「python技术」列表推导、生成器表达式和字典推导的差异及其示例
- python爬虫requests简单案例_Python小例子:一个最简单的爬虫
- 查看pcl版本 linux,Ubuntu16上安装PCL