怎样防止程序运行第二次?我使用的是创建原子的方法。(TAtom)。但是不知道该怎么把这些东西加入项目文件中!请用过的人给俺写段代码!(100分)

  • 主题发起人 主题发起人 wrksky
  • 开始时间 开始时间
W

wrksky

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。
在项目文件中这样写
finalization
begin
AtomText:='OnlyOne'+Application.title;
FoundAtom:=GlobalfindAtom(Pchar(AtomText));
if foundAtom<>0 then
GlobalDeleteAtom(foundAtom);
end;
但是不行。好像不执行。
 
以前有人答过了,翻贴子吧。
 

  实现单实例运行的关键是判断前一实例是否存在,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;
这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。

 
你在dpr文件里如下:
在uses加一个windows;
var
hMutex:THandle;
begin
Application.Initialize;
hMutex:=GreateMutex(nil,false,'ProgramA');
if GetLastError<>ERROR_ALREADY_EXISTS then
begin
//加入你的生成窗口代码比如 Application.CreateForm(TForm1,Form1);
Application.Run;
end
else
Application.MessageBox('本程序已经运行了,不能再次运行!',MB_ICONINFORMATION);
ReleaseMutex(hMutex);
end;
end;
 
我想我可以帮你:
:::如何防止一个程序执行两次:::
这是一个比较简单的防止程序执行两次的方法
implementation
var hnd: THandle;
initialization
hnd := CreateMutex(nil, True, 'irgendwaseinmaliges');
if GetLastError = ERROR_ALREADY_EXISTS then
Halt;
finalization
if hnd <> 0 then
CloseHandle(hnd);
end.

 
没这么复杂,在项目文件中这样写
begin
if ParamStr(0)<>'' then
Application.Terminate;
......
......
end.
 
多人接受答案了。
 
后退
顶部