发信人: d_fang@GZ()
整理人: teleme(2001-01-18 16:50:13), 站内信件
|
标 题: Re: 关于判断当前exe是否已经在运行的问题 发信站: 网易虚拟社区 (Sat Nov 18 12:06:45 2000), 站内信件
【 在 fishy (死鱼) 的大作中提到: 】
: 这个问题在VB里面很好解决,用App.PrevInst就可以了。但在Delphi中呢?
: 我先想到了用FindWindow,但我的主窗体的名字太容易被别的程序的窗体重复了
: ,失败~
: 我又想到FindWindow以后,发一个消息过去如果是自己的程序,就发一个预定的
: .......
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_RESTOR E;
在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;
这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息, 并退
出,而本例中原窗口收到该消息后会自动激活或从图标还原
-- 欢迎参观方文设计室
http//funstudio.net/
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.157.145.96]
|
|