让程序只运行一次

关于 让应用程序只运行一次 

楼主:以下是一个兄弟的代码
var
mutex:thandle;
begin
mutex:=CreateMutex(Nil,True,'OneInstance');//第三个参数随便写
if GetLastError<>ERROR_ALREADY_EXISTS then
 begin
  Application.CreateHandle;
  Application.CreateForm(TForm1,Form1);//form1改为你窗体的name
  Application.Run;
end else ShowMessage('程序已经运行');
  ReleaseMutex(mutex);
end;
 
--------------------------------------------------

在程序主窗口的implementation之前写下
var
   hnd: THandle; 
在程序主窗口的end.之前写下
initialization   //比较好的防止程序再次执行语句
    hnd := CreateMutex(nil, True, 'irgendwaseinmaliges');
    if GetLastError = ERROR_ALREADY_EXISTS then Halt;
这是目前我发现的最有效防止再次运行程序的代码,楼上介绍的方法我也试过,但它会出现程序主窗口闪现现象.

--------------------------------------------------
网友回复:
//......
private 
{ Private declarations } 
public 
{ Public declarations } 
end; 

var 
Form1: TForm1; 
//保存Mutex句柄 
mHandle:THandle; 
PreviousInstanceWindow:HWnd; 
Project:String; 
AppName:String; 
implementation 

{$R *.dfm} 
initialization 
//定义自己的项目名称,作为要创建的互斥区名,最好有自己的特点以防止重复 
Project:='RunOnlyOnce_MyProject'; 
//将lpMutexAttributes设为nil,bInitialOwner设为True(即本程序拥有该互斥区) 


mHandle:=CreateMutex(nil,True,PChar(Project)); 
if GetLastError=ERROR_ALREADY_EXISTS then 
//该互斥区已存在则表明已有本程序的另一个实例在运行 
begin 
ShowMessage('已经有该程序在运行'); 
//保存程序标题 
AppName:=Application.Title; 
//不显示本窗口 
Application.ShowMainForm:=False; 
//改变程序标题,以使函数FindWindow找到的是前一个实例窗口 
Application.Title:='destroy me'; 
//寻找前一个实例窗口句柄 
PreviousInstanceWindow:=FindWindow(nil,PChar(AppName)); 
//已经找到 
if PreviousInstanceWindow <> 0 then 
//假如该窗口最小化则恢复 
if IsIconic(PreviousInstanceWindow) then 
ShowWindow(PreviousInstanceWindow,SW_RESTORE) 
else 
//假如程序在后台则将其放到前台 
SetForegroundWindow(PreviousInstanceWindow); 
//中止本实例 
Application.Terminate; 
end; 
finalization 
//该互斥区对象仍存在则关闭对象 
if mHandle <> 0 then 
CloseHandle(mHandle); 
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值