加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 我如何知道我的程序的另一个实例是否已经运行?

发布时间:2020-12-15 10:19:42 所属栏目:大数据 来源:网络整理
导读:如何知道我的程序的一个实例是否正在运行? 我想我可以做一个数据文件,但它只是乱七八糟: 我想这样做,因为我只想要一个实例一次打开。 解决方法 你可以创建一个Semaphore …并停止执行(将代码放入你的* .dpr文件),让你运行的应用程序到屏幕上。 var Sema
如何知道我的程序的一个实例是否正在运行?
我想我可以做一个数据文件,但它只是乱七八糟:

我想这样做,因为我只想要一个实例一次打开。

解决方法

你可以创建一个Semaphore …并停止执行(将代码放入你的* .dpr文件),让你运行的应用程序到屏幕上。
var
   Semafor     : THandle;

begin
     // Don't start twice ... if already running bring this instance to front
     Semafor := CreateSemaphore(nil,1,'MY_APPLICATION_IS_RUNNING');
     if ((Semafor <> 0) and // application is already running
         (GetLastError = ERROR_ALREADY_EXISTS))
        then begin
             RestoreWindow('TMyApplication');
             CloseHandle(Semafor);
             Halt;
             end;

     Application.CreateForm(....);    
     Application.Initialize;

     Application.Run;
     CloseHandle(Semafor);
end;

EDIT(添加了RestoreWindow方法):

aFormName是应用程序中您的主表单类的名称。

procedure RestoreWindow(aFormName : string);
var
   Wnd,App : HWND;

begin
     Wnd := FindWindow(PChar(aFormName),nil);
     if (Wnd <> 0)
        then begin // Set Window to foreground
             App := GetWindowLong(Wnd,GWL_HWNDPARENT);
             if IsIconic(App)
                then ShowWindow(App,SW_RESTORE);

             SetForegroundwindow(App);
             end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读