unit wdRunOnce; {******************************************* * 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.
program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1} wdRunOnce in 'wdRunOnce.pas', Unit2 in 'Unit2.pas' {Form2} {$R *.res} begin Application.Initialize; if not AppHasRun(Application.Handle) then Application.CreateForm(TForm1, Form1); Application.Run; end.
相关推荐
10、程序运行状态的保存和恢复; 11、在桌面、开始菜单、程序组、收藏夹创建快捷方式技巧; 12、在 IE 的工具栏和 Tools 菜单中动态添加/删除按钮和菜单项技术; 13、注册机编程方法; 14、Dll 动态链接库的...
为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。 目前绝大多数官方支持库均已支持...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 FreeBird2011Dlg.h 主对话框类头文件 MultiGroup.h 多播组类头文件 UserLink.h 用户链表类头文件 ListenSocket.h 侦听接口...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
)初始按键配置你可以打开主窗体,只要窗体在激活状态,此时按遥控器的按键将不运行你配置的事件,而显示你当前按键的定义状态,单击左边的任何一个按键序号,就是出现右边的扩展界面显示当前按键配置,你可以修改他...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...
Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
一次创建多个同义字364 为你的表创建视图368 在一个计划中清除其所有的表的内容369 使用SQL 来生成SHELL 脚本371 再建表和索引372 总结373 问与答373 校练场373 练习374 第18 天PL/SQL 简介376 目标376 入门376 在...
21天学习SQL V1.0.pdf 66 SQL 21 日自学通(V1.0) 翻译人笨猪 ...日期/时间函数............................................................................................................ADD_MONTHS..................