避免二次运行.txt

来自「大量Delphi开发资料」· 文本 代码 · 共 100 行

TXT
100
字号
避免二次运行


实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获知前 一实例的句柄,从而可以方便地进行判断,但 Windows 95 是抢先式多任务系统,其程序的前一实例句柄恒为零,所以只有另寻其他办法。目前最有效的办法是通过查看是否有相同窗口类名的例程存在来进行判断。下面介绍在Delphi中实现的方法。


1、对主窗口程序的改动:


在主窗口(即程序创建的第一个窗口)中interface节加入

const

CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}

MYAPPNAME = "My Delphi Program";

并在Form的定义的public节中加入

procedure CreateParams(var Params: TCreateParams); override;

Procedure RestoreRequest(var message: TMessage); message CM_RESTORE;

在implementation节中加入

{指定窗口名称}


procedure TForm1.CreateParams(var Params: TCreateParams);

begin

inherited CreateParams(Params);

Params.WinClassName := MYAPPNAME;

end;


{处理“恢复”消息}

procedure TForm1.RestoreRequest(var message: TMessage);

begin

if IsIconic(Application.Handle) = TRUE then

Application.Restore

else

Application.BringToFront;

end;



经过以上修改,程序的主窗口的类名已经被指定了,这是进行判断的基础。一般在程 序刚开始运行的时候进行判断,所以还要对DPR文件进行修改。


2、对DPR文件的改动


在 uses 节中添加 windows、messages这两个单元加入下列语句,注意两个文件中常 量CM_RESTORE和MYAPPNAME的定义必须一致

const

CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}

MYAPPNAME = "My Delphi Program";

var

RvHandle : hWnd;


将下列语句插到程序最前部(在Application.Initialize之前)

RvHandle := FindWindow(MYAPPNAME

NIL);

if RvHandle > 0 then

begin

PostMessage(RvHandle

CM_RESTORE

0

0);

Exit;

end;

这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退 出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?