


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用互斥对象让程序只运行一次转载“怎么让我的程序在运行时不能重复打开?”经常在论坛上看到有朋友问这方面的问题。本文将比较详细的说明这一问题,并给出一个较为完善的解决方案。尽管这已经不是一个新问题了,但这里还是简要的说明一下这种技术:这的确是一个相当有用的技术,可能你经常会注意到相当多的程序在运行之后当你再次点击运行时,它只是会回到原来的窗口,而不会运行两个程序。就如同你在运行delphi时,在外部点开另一个工程文件时,delphi只是会简单的将你的当前工程置换而不是运行两个delphi。这样的好处是显而易见的:你不必担心你的程序在某些情况下被别的软件恶意运行多次而吃光内存造成当机。下面我们做进一部的说明:熟悉win32编程的朋友(特别是多线程编程),相信对互斥对象已经相当熟悉了,它常被用做线程间同步的技术手段。这里我们使用它来防止程序重复运行。我们只是简要的提一下互斥对象,并不做深入研究:互斥对象把第一次建立它的程序作为主程序,这样我们只用检测互斥对象是否已经有主程序就判断程序是否已经运行过,这里需要涉及到一个api函数:WaitForSingleObject该函数的第一个参数为用以检测的互斥对象,第2个参数的表示函数返回结果前的滞留时间,如果改函数返回wait_TimeOut就表明互斥对象已经有了一个主程序。修改了的工程文件代码如下:(注意:以下的代码都出现在工程文件中,而不是单元文件中,并且这里都在最简单的delphi默认建立的工程基础上修改)varmyMutex:HWND;begin myMutex:=CreateMutex(nil,false,hkOneCopy);/ CreateMutex建立互斥对象,并且给互斥对象起一个唯一的名字。 if WaitForSingleObject(myMutex,0)wait_TimeOut then/程序没有被运行过 begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; End;End;下面的工作是来完善这个程序,我们不仅希望程序可以不被重复运行,而且我们也希望当用户再次点击程序可执行文件时,已经运行的程序能够做出一些响应。在这里我们希望它能够变为最上层的活动窗口以提醒用户程序已经被运行。为了达到这个目的,我们必须先获得已经运行程序的窗口句柄,以便使用SetForeGroundWindow(handle)来使程序窗口最前并激活。为了得到这个句柄,我们必须使用windows枚举函数EnumWindows来遍历windows的窗口列表,该函数可以使用一个回调函数作为参数,并用这个回调函数来对每一个系统中的窗口进行调用直到最后一个窗口或回调函数返回false为止,这个回调函数规定有两个参数(handle,Cardinal,只用注意第一个handle参数它表示由枚举函数当前遍历到的窗口句柄)。我们只要编写这个函数并在其中不断的比较当前遍历到的窗口类名和我们的程序的主窗口类名,以及比较窗口可执行文件的名称和我们程序的名称直到找到相同的为止,将这时的窗口句柄保存下来就可以了,下面的代码加上了适当的注释:function EnumWndProc(hwnd:Thandle;param:Cardinal):bool;stdcall;/由于用于api回调函数,请使用windows传统的参数传递方式stdcallvarClassName,WinMoudleName:string;WinInstance:THandle;beginresult:=true;SetLength(ClassName,100);GetClassName(hwnd,pchar(ClassName),length(ClassName);/获得当前遍历窗口的类名ClassName:=pchar(ClassName);/在字符串后加结束符,确定字符串结束if ClassName=TForm1.ClassName then/比较begin WinInstance:=GetWindowLong(hwnd,GWL_HINSTANCE);/获得当前遍历窗口的实例 setlength(WinMoudleName,100); GetModuleFileName(WinInstance,pchar(WinMoudleName),length(WinMoudleName); /获得当前遍历窗口的程序文件名 WinMoudleName:=pchar(WinMoudleName); if WinMoudleName=MoudleName then/MoudleName为工程全局变量,自身程序的文件名 begin FindHid:=hwnd;/FindHid为工程全局变量保存找到的句炳 result:=false;/找到以后就结束遍历 end;end;end;下面是全部的工程文件:varhMutex,FindHid:HWND;MoudleName:string;begin hMutex:=CreateMutex(nil,false,hkOneCopy); if WaitForSingleObject(hMutex,0)wait_TimeOut then begin /略去的代码在前文 end else begin SetLength(MoudleName,100); GetModuleFileName(HInstance,pchar(MoudleName),length(MoudleName); /获得自己程序文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行兰州市城关区2025秋招结构化面试15问及话术
- 农发行黑河市逊克县2025秋招结构化面试经典题及参考答案
- 国家能源佳木斯市富锦市2025秋招笔试言语理解与表达题专练及答案
- 国家能源合肥市肥西县2025秋招笔试题库含答案
- 广安华蓥中储粮2025秋招笔试性格测评题专练及答案
- 国家能源吉林市舒兰市2025秋招笔试题库含答案
- 国家能源蚌埠市固镇县2025秋招笔试言语理解与表达题专练及答案
- 关于战略合作协议书集锦15篇
- 土方工程承包合同(集锦14篇)
- 国有企业劳资法律服务合同7篇
- 2025年科技创新与成果转化的知识能力考核试题及答案
- 秩序员休假管理制度
- 2025至2030中国惯性导航行业投资现状与前景预测分析报告
- 轻型卒中临床诊疗中国专家共识(2024版)解读
- 非ST段抬高型急性冠脉综合征诊断和治疗指南(2024)解读
- 2025年中国张裕产区葡萄酒特色与品牌国际化发展报告
- 耳机品质协议书范本
- 2025版VI设计合同范本
- 人美版五年级上册5.绘画中的透视现象一等奖教案设计
- 从法律出发理解与应用新清单标准
- 公司销售人员激励方案
评论
0/150
提交评论