急救啊~有没有人会??????(1分)

  • 主题发起人 主题发起人 leo.1999
  • 开始时间 开始时间
L

leo.1999

Unregistered / Unconfirmed
GUEST, unregistred user!


pas下面:

//复制副本,同时运行副本,再关闭自己
begin
if application.exename<> 'd:/1.exe' then
begin
copyfile(pchar(application.exename),pchar('d:/1.exe'),false);
winexec(pchar('d:/1.exe'),sw_hide);//运行WINDOWS下的程序
application.terminate;//退出





dpr下面:

//防止2次运行
const classname='tform1';//注册窗口名
var
handle:integer;
begin
handle:=findwindow(classname,nil);//如果有就自己挂掉自己,及防止2次运行
if handle<>0 then
halt;
-----------------------------------------------------------------------------------


请问上面2个功能怎么兼得?????
每个功能都有用,但加到一起,就不能用了!!!
 
1用共享内存块,程序运行时读一下看有没有,有都终止本程序
2推荐 用API:MutexWindow(可能是Mutexprocess,我忘了,主要是书上看到过,没用过,所以忘了)
 
请参阅http://www.delphiok.com/bcjq/all/48.htm
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;
这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。
顺便请问:如何才能知道CM_RESTORE = WM_USER + $1000,特别是后面的$1000?谢了!
 
后退
顶部