program Project1;use forms,windows, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin CreateMutex(nil, True, 'MyAppClass'); if GetLastError = ERROR_ALREADY_EXISTS then begin MessageBox(0, '干吗?', '你运行了两次!' ,MB_ICONERROR); Halt; end; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end;
hprevinst:=findwindow('TFrm_Part_main',nil); if hprevinst=0 then begin //主 end else begin Application.Terminate; Application.Run; end; 在USES中引用WINDOWS
zdcnow(磁效应) 的方法就可以了
zdcnow(磁效应) 的方法就可以了
可以使用创建互斥对象的方法。尽管互斥对象通常用于同步连接,但用在这个地方也是非常方便的。仅用了4句代码就轻松搞定。 VAR Mutex:THandle; begin Mutex:=CreateMutex(NIL,True,‘SingleApp’); IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一实例 BEGIN Application.CreateHandle; Application.CreateForm (TExpNoteForm, ExpNoteForm); Application.Run; END; ReleaseMutex(Mutex); end. 抄来的,呵呵,不过还可以用吧
工程文件中 const MUTEX = 'MUTEX_HOUSESYS'; begin if OpenMutex(MUTEX_ALL_ACCESS, False, pChar(MUTEX)) = 0 then CreateMutex(nil, True, pChar(MUTEX)) else Exit;
http://expert.csdn.net/Expert/topic/717/717792.xml?temp=.373974
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;
这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。
forms,windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
CreateMutex(nil, True, 'MyAppClass');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, '干吗?', '你运行了两次!' ,MB_ICONERROR);
Halt;
end; Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
if hprevinst=0 then
begin
//主
end
else
begin
Application.Terminate;
Application.Run;
end;
在USES中引用WINDOWS
VAR Mutex:THandle;
begin
Mutex:=CreateMutex(NIL,True,‘SingleApp’);
IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一实例
BEGIN
Application.CreateHandle;
Application.CreateForm (TExpNoteForm, ExpNoteForm);
Application.Run;
END;
ReleaseMutex(Mutex);
end.
抄来的,呵呵,不过还可以用吧
const
MUTEX = 'MUTEX_HOUSESYS';
begin
if OpenMutex(MUTEX_ALL_ACCESS, False, pChar(MUTEX)) = 0 then
CreateMutex(nil, True, pChar(MUTEX))
else
Exit;