知识大全 delphi中,让程序只运行一次的方法[1]

Posted

篇首语:你不勇敢,没人替你坚强。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 delphi中,让程序只运行一次的方法[1]相关的知识,希望对你有一定的参考价值。

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

  下面是Delphi版的解决方法

  (方法一)  利用互斥对象  开发过多线程软件的可能都使用过互斥对象 它常被用做线程间同步的技术手段 简要的提一下互斥对象 互斥对象把第一次建立它的程序作为主程序 这样只用检测互斥对象是否已经有主程序就判断程序是否已经运行过 这里需要涉及到一个api函数 WaitForSingleObject 该函数的第一个参数为用以检测的互斥对象 第 个参数的表示函数返回结果前的滞留时间 如果改函数返回wait_TimeOut就表明互斥对象已经有了一个主程序

  注意 以下的代码都出现在工程文件中 而不是单元文件中   var   myMutex:HWND;  begin    //CreateMutex建立互斥对象 并且给互斥对象起一个唯一的名字     myMutex:=CreateMutex(nil false OneCopy );    //程序没有被运行过    if WaitForSingleObject(myMutex )<>wait_TimeOut then    begin     Application Initialize;     Application CreateForm(TForm Form );     Application Run;    End;  End;  [注释]

  当应用程序第一次运行的时候 在应用程序中会建立一个互斥对象 名称为 OneCopy 然后判断系统中有没有这个互斥对象 如果没有则初始化应用程序

  下面再完善一下这个程序

  我们不希望程序被多次运行 而是希望如果程序运行过后 再运行这个程序的时候 将已运行的程序做出一些响应 比如说让它变为最上层的活动窗口来提示用户该程序正在运行 为达到这个目的 必须要获得正在运行程序的句柄 然后用一个APISetForeGroundWindow(handle) 来使程序的窗口最前并激活 为了得到程序的句柄 要使用windows枚举函数EnumWindows来遍历windows窗口列表 该函数需要一个回调函数作参数 用这个回调函数来对每一个系统中的窗口进行调用直到最后一个窗口或回调函数返回false为止[注 关于EnumWindows函数的介绍在篇尾] 只要编写这个回调函数并在其中不断的比较当前遍历到的窗口类名和我们的程序的主窗口类名 以及比较窗口可执行文件的名称和我们程序的名称直到找到相同的为止 将这时的窗口句柄保存下来就行了 为获得窗口的类名和句柄 需要一个APIGetClassName 为获得可执行文件的名称 需要APIGetModuleFileName

  下面是详细代码

  注意 下面代码在delphi 下运行通过 但是如果窗口最小化后 再次运行程序时 原先已经运行的程序能够被置前并激活但是标题栏的最小化按钮却不能用了 当尝试了N中方法后估计是delphi自身TForm类的问题 下面给出一个解决方案 在窗口上放一个ApplicationEvents控件 它管理著应用程序所有的消息 我们在它的OnMessage事件里写上下面的代码     if Msg hwnd=Form Handle then   begin  // 是在标题栏按下鼠标  // 是在标题栏的最小化按钮上按下鼠标     if (Msg message= ) and (msg wParam= ) then     begin       Form WindowState:=  wsMinimized;     end;   end;  

cha138/Article/program/Delphi/201311/24832

相关参考

知识大全 delphi中,让程序只运行一次的方法[2]

  programMyThreadTest;  uses  Windows   Forms   SysUtils   Messages  Dialogs   U

知识大全 使用PB限制应用程序只运行一次

使用PB限制应用程序只运行一次  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  位操作系统中可以用

知识大全 让Java程序只运行一个实例

让Java程序只运行一个实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一个程序可以在内存里

知识大全 C#中让程序只运行一个实例的操作方法

C#中让程序只运行一个实例的操作方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  让程序只运行

知识大全 在Delphi数据库应用程序中常见错误

在Delphi数据库应用程序中常见错误  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Delph

知识大全 学习DELPHI程序开发中的几则应用技巧

学习DELPHI程序开发中的几则应用技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  delp

知识大全 在Delphi中开发使用多显示器的应用程序

在Delphi中开发使用多显示器的应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Wind

知识大全 Delphi应用程序的应用(二)[1]

DELPHI基础教程:Delphi应用程序的应用(二)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 Delphi应用程序的应用(一)[1]

DELPHI基础教程:Delphi应用程序的应用(一)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 在DELPHI程序中使用ADO对象存取ODBC数据库

在DELPHI程序中使用ADO对象存取ODBC数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!