delphi 防止程序双开 更好的 Best!
![](/assets/blank.gif)
![](/assets/blank.gif)
{*******************************************
* brief: 让程序只运行一次
* autor: linzhenqun
* date: 2005-12-28
* email: linzhengqun@163.com
* blog: http://blog.csdn.net/linzhengqun
********************************************}
interface
(* 程序是否已经运行,如果运行则激活它 *)
function AppHasRun(AppHandle: THandle): Boolean;
implementation
uses
Windows, Messages;
const
MapFileName = '{CAF49BBB-AF40-4FDE-8757-51D5AEB5BBBF}';
type
//共享内存
PShareMem = ^TShareMem;
TShareMem = record
AppHandle: THandle; //保存程序的句柄
end;
var
hMapFile: THandle;
PSMem: PShareMem;
procedure CreateMapFile;
begin
hMapFile := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MapFileName));
if hMapFile = 0 then
begin
hMapFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
SizeOf(TShareMem), MapFileName);
PSMem := MapViewOfFile(hMapFile, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0);
if PSMem = nil then
begin
CloseHandle(hMapFile);
Exit;
end;
PSMem^.AppHandle := 0;
end
else begin
PSMem := MapViewOfFile(hMapFile, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0);
if PSMem = nil then
begin
CloseHandle(hMapFile);
end
end;
end;
procedure FreeMapFile;
begin
UnMapViewOfFile(PSMem);
CloseHandle(hMapFile);
end;
function AppHasRun(AppHandle: THandle): Boolean;
var
TopWindow: HWnd;
begin
Result := False;
if PSMem <> nil then
begin
if PSMem^.AppHandle <> 0 then
begin
SendMessage(PSMem^.AppHandle, WM_SYSCOMMAND, SC_RESTORE, 0);
TopWindow := GetLastActivePopup(PSMem^.AppHandle);
if (TopWindow <> 0) and (TopWindow <> PSMem^.AppHandle) and
IsWindowVisible(TopWindow) and IsWindowEnabled(TopWindow) then
SetForegroundWindow(TopWindow);
Result := True;
end
else
PSMem^.AppHandle := AppHandle;
end;
end;
initialization
CreateMapFile;
finalization
FreeMapFile;
end.
接下去就稍有点小麻烦了 把上面的代码保存成单元文件 比如 wdRunOnce.pas
然后加到项目文件里面如下
![](/assets/blank.gif)
![](/assets/blank.gif)
uses
Forms,
Unit1 in 'Unit1.pas' {Form1} ,
wdRunOnce in 'wdRunOnce.pas'; //在这里不要忘记加单元文件
{$R *.res}
begin
Application.Initialize;
if not AppHasRun(Application.Handle) then //这里不要忘记给个传入句柄判定是否创建窗体
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
转载于:https://www.cnblogs.com/rogee/archive/2010/09/20/1832014.html
delphi 防止程序双开 更好的 Best!相关推荐
- Delphi的程序单元结构
来源:http://blog.csdn.net/lcq419/article/details/1305538 Delphi的程序单元 Object Passal的程序结构很特殊,与其它语言如C++,O ...
- 056_《Delphi应用程序开发精彩实例》
<Delphi应用程序开发精彩实例> Delphi 教程 系列书籍 (056) <Delphi应用程序开发精彩实例> 网友(邦)整理 EMail: shuaihj@163.co ...
- 没人比程序猿更讨厌软件
原文作者:Jeff Atwood 几个月前.我们买了一台新的数码相机,为的是更好地记录我们家小宝贝的成长过程.採购的事情由我太太负责. 她小心地打开相机的包装盒,给相机装上电池.然后就開始了首次试拍. ...
- Delphi:程序自己删除自己,适用于任何windows版本(含源码)
Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var sei: TSHELLEXECUTEINFO; szMod ...
- Delphi应用程序的调试(二)使用断点
Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...
- 几个大神程序猿更喜欢用的Python编辑器!
作为开发者来说,肯定都有自己比较喜欢使用的编辑器,有的人喜欢这个,有的人喜欢那个,还有的大神就喜欢用记事本,今天小千就来给大家介绍几个大神程序猿更喜欢用的Python编辑器. 1.Sublime Te ...
- 没人比程序员更讨厌软件
原文作者:Jeff Atwood 几个月前,我们买了一台新的数码相机,为的是更好地记录我们家小宝贝的成长过程.采购的事情由我太太负责.她小心地打开相机的包装盒,给相机装上电池,然后就开始了首次试拍.像 ...
- 为什么没人比程序员更讨厌软件
几个月前,我们买了一台新的数码相机,为的是更好地记录我们家小宝贝的成长过程.采购的事情由我太太负责.她小心地打开相机的包装盒,给相机装上电池,然后就开始了首次试拍.像很多电子产品一样,随相机附送的还有 ...
- 消除switch/case语句,不破坏代码的封闭性,使程序结构更符合面向对象思想(二)
在 "消除switch/case语句,不破坏代码的封闭性,使程序结构更符合面向对象思想(一)"中,我们曾讨论过维护一个消息管理器来记录不同消息和它对应的消息处理类. 但是,这种实现 ...
- 比程序员更好的职业_立即成为更好的程序员的20条技巧
比程序员更好的职业 目录: (Table of contents:) Think Before You Code 编码前先思考 Understand the Business Behind Every ...
最新文章
- 1019 General Palindromic Number (20分)_18行代码AC
- hdu3078 建层次树+在线LCA算法+排序
- python中str是什么函数_python str函数怎么用
- 深度学习(1)---2017年深度学习NLP重大进展与趋势
- 如何看公司的财务数据
- SQL第四周学习笔记---python操作数据库、游标、sqlite、mysql数据库银行转账
- 如何用SPSS对数据进行标准化处理?
- 用css伪元素制作箭头图标
- UTS安装与卸载-Linux篇
- 怎么看电脑是32位还是64位?2个方法,快速查看
- 2021年煤气考试内容及煤气找解析
- 医疗his系统值不值得投入使用
- Learning Shape Representations for Clothing Variations in Person Re-Identification
- 苹果A14和高通骁龙888性能对比,A13都笑了
- Blender:Lowpoly手部建模流程(附blender源文件下载)
- python入门小程序之列表练习
- 镁光ddr3布线规则_DDR2布线规则(一)
- 全国计算机等级考试二级教程——c语言程序设计》,格式为doc.,全国计算机等级考试二级笔试样卷C语言程序设计样本.doc...
- 电脑专业测试cpu的软件,使用什么软件来测试计算机CPU的最佳性能
- Androi天气预报app制作(作业)
热门文章
- iview组件 eslint校验出错 Parsing error: x-invalid-end-tag
- SpringMvc @PathVariable 工作原理
- 转:一篇很全面的freemarker教程
- Metadata Lock原理5
- SPendidCRM:给HK的ImageInfoEntryEditView增加一个checkbox,用于判断特殊类型的PODS记录...
- VS2010中添加WebService注意的几个地方
- 爬虫—分析Ajax爬取今日头条图片
- vscode eslint插件对vue文件无效
- 架构实战项目心得(十四):spring-boot结合Swagger2构建RESTful API测试体系
- C语言的面向对象设计之 X264,FFMPEG 架构探讨