delphi中,让程序只运行一次的方法

delphi中,让程序只运行一次的方法

ID:41031946

大小:33.00 KB

页数:5页

时间:2019-08-14

delphi中,让程序只运行一次的方法_第1页
delphi中,让程序只运行一次的方法_第2页
delphi中,让程序只运行一次的方法_第3页
delphi中,让程序只运行一次的方法_第4页
delphi中,让程序只运行一次的方法_第5页
资源描述:

《delphi中,让程序只运行一次的方法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、公司开发的软件需要对串口进行*作,每次打开软件后程序自动去打开串口寻找连接到串口上的设备,但是如果用户不知道打开了两次,那么第二次打开的程序是不能正常使用的,因为对串口的*作时独占的,第一个程序独占了串口的使用权,其他程序无法再使用那一个串口,当然如果PC机器上有两个串口,那第二个程序也是可以用的。为了解决这个问题,必须限制对串口*作的软件只能打开一个。打开软件后用户如果误*作再次想打开该软件,需要提示用户软件已经打开,并让已打开的软件显示在窗口最顶层。  下面是Delphi版的解决方法。  (方法一)  利用互斥对象  开发过多线程软件的可能都使用过互斥对象,

2、它常被用做线程间同步的技术手段。简要的提一下互斥对象:互斥对象把第一次建立它的程序作为主程序,这样只用检测互斥对象是否已经有主程序就判断程序是否已经运行过,这里需要涉及到一个api函数:WaitForSingleObject,该函数的第一个参数为用以检测的互斥对象,第2个参数的表示函数返回结果前的滞留时间,如果改函数返回wait_TimeOut就表明互斥对象已经有了一个主程序。  注意:以下的代码都出现在工程文件中,而不是单元文件中。  var  myMutex:HWND;  begin  //CreateMutex建立互斥对象,并且给互斥对象起一个唯一的名字。

3、  myMutex:=CreateMutex(nil,false,'hkOneCopy');  //程序没有被运行过  ifWaitForSingleObject(myMutex,0)<>wait_TimeOutthen  begin  Application.Initialize;  Application.CreateForm(TForm1,Form1);  Application.Run;  End;  End;  [注释]:  当应用程序第一次运行的时候,在应用程序中会建立一个互斥对象,名称为'hkOneCopy',然后判断系统中有没有这个互斥对象,如果

4、没有则初始化应用程序。  下面再完善一下这个程序。  我们不希望程序被多次运行,而是希望如果程序运行过后,再运行这个程序的时候,将已运行的程序做出一些响应,比如说让它变为最上层的活动窗口来提示用户该程序正在运行。为达到这个目的,必须要获得正在运行程序的句柄,然后用一个APISetForeGroundWindow(handle),来使程序的窗口最前并激活。为了得到程序的句柄,要使用windows枚举函数EnumWindows来遍历windows窗口列表,该函数需要一个回调函数作参数,用这个回调函数来对每一个系统中的窗口进行调用直到最后一个窗口或回调函数返回fals

5、e为止[注:关于EnumWindows函数的介绍在篇尾]。只要编写这个回调函数并在其中不断的比较当前遍历到的窗口类名和我们的程序的主窗口类名,以及比较窗口可执行文件的名称和我们程序的名称直到找到相同的为止,将这时的窗口句柄保存下来就行了。为获得窗口的类名和句柄,需要一个APIGetClassName,为获得可执行文件的名称,需要APIGetModuleFileName。  下面是详细代码。  注意:下面代码在delphi7下运行通过。但是如果窗口最小化后,再次运行程序时,原先已经运行的程序能够被置前并激活但是标题栏的最小化按钮却不能用了。当尝试了N中方法后估计是

6、delphi自身TForm类的问题,下面给出一个解决方案:在窗口上放一个ApplicationEvents控件,它管理着应用程序所有的消息。我们在它的OnMessage事件里写上下面的代码:  ifMsg.hwnd=Form1.Handlethen  begin  //161是在标题栏按下鼠标  //8是在标题栏的最小化按钮上按下鼠标  if(Msg.message=161)and(msg.wParam=8)then  begin  Form1.WindowState:=wsMinimized;  end;  end;programMyThreadTest;  

7、uses  Windows,  Forms,  SysUtils,  Messages,  Dialogs,  Unit1in'Unit1.pas'{Form1},  {$R*.res}  var  myMutex,  FindHid:HWND;  MoudleName:string;  functionEnumWndProc(hwnd:Thandle;param:Cardinal):bool;stdcall;  //由于用于api回调函数,请使用windows传统的参数传递方式stdcall  var  ClassName,WinMoudleName:stri

8、ng;  WinInst

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。