问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

delphi,只允许让程序运行一次。

发布网友 发布时间:2024-10-21 20:00

我来回答

2个回答

热心网友 时间:2024-11-13 21:47

楼上提供的代码和楼主提供网页的代码都能达到不让程序同时运行两次,但楼主提供的网页代码有一个与楼上不同的地方:
楼的的供码仅是不让程序两次运行,如果运行两次,将跳出一个MessageBox,点OK后就没有什么了,也就是说仅提示一下。
但那个网页上的代码却有一个好处,当你的程序的窗口被其他窗口遮挡时,两次运行时,你的程序的主窗口就会被激活并被放到其他窗口之上。
实现原理是建立一个互斥对象,然后运行程序时,如果互斥对象不存在,则运行,如果存在,则主被激活本程序窗口并将其放到其他窗口之上.
其实网页中提供的代码是比较详细的,但由于他是在工程文件中写代码,而现在delphi教材中讲工程文件的比较少,或者说初级入门的教材中讲工程文件的比较少,所以楼主看到这个时会迷茫一些!呵呵,不知道说的对不对,下面是我根据网页上的代码写的(仅是复制而已),D7运行通过!
他的源码应该是这样的:
program Project1;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
hMutex,FindHid:HWND;
MoudleName:string;
function EnumWndProc(hwnd:Thandle;param:Cardinal):bool;stdcall;
var
ClassName,WinMoudleName:string;
WinInstance:THandle;
begin
result:=true;
SetLength(ClassName,100);
GetClassName(hwnd,pchar(ClassName),length(ClassName));//获得当前遍历窗口的类名
ClassName:=pchar(ClassName);//在字符串后加结束符,确定字符串结束
if ClassName=TForm1.ClassName then//比较
begin
WinInstance:=GetWindowLong(hwnd,GWL_HINSTANCE);//获得当前遍历窗口的实例
setlength(WinMoudleName,100);
GetModuleFileName(WinInstance,pchar(WinMoudleName),length(WinMoudleName));
//获得当前遍历窗口的程序文件名
WinMoudleName:=pchar(WinMoudleName);
if WinMoudleName=MoudleName then//MoudleName为工程全局变量,自身程序的文件名
begin
FindHid:=hwnd;//FindHid为工程全局变量保存找到的句炳
result:=false;//找到以后就结束遍历
end;
end;
end;
begin
hMutex:=CreateMutex(nil,false,'hkOneCopy');
if WaitForSingleObject(hMutex,0)<>wait_TimeOut then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
SetLength(MoudleName,100);
GetModuleFileName(HInstance,pchar(MoudleName),length(MoudleName));
//获得自己程序文件名
MoudleName:=pchar(MoudleName);
EnumWindows(@EnumWndProc,0);//调用枚举函数
if FindHid<>0 then
SetForegroundWindow(FindHid);
end;

end.
在我的博客上有相关的文章,你可以看一下,地址:http://hi.baidu.com/jxsbb/blog/item/049b5d90258a1b8fa877a443.html
这个例子相对来说有一点难,所以我自己写了一个,跟上面差不多,只是添加了几个代码(有点乱,将就着看吧,- -!),但这里有一个缺点,就是当程序运行时,再次运行该程序,的确会将最小化或是被其他窗口遮盖的程序窗体放到其他窗口之上,但这个窗口却无法最小化了,还没弄清是什么原因。
program Project1;

uses
Forms,
Windows,
Messages,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
hMutex,FindHid:HWND;
MoudleName:string;
function EnumWndProc(hwnd:Thandle;param:Cardinal):bool;stdcall;
var
ClassName,WinMoudleName:string;
WinInstance:THandle;
begin
result:=true;
SetLength(ClassName,100);
GetClassName(hwnd,pchar(ClassName),length(ClassName));//获得当前遍历窗口的类名
ClassName:=pchar(ClassName);//在字符串后加结束符,确定字符串结束
if ClassName=TForm1.ClassName then//比较
begin
WinInstance:=GetWindowLong(hwnd,GWL_HINSTANCE);//获得当前遍历窗口的实例
setlength(WinMoudleName,100);
GetModuleFileName(WinInstance,pchar(WinMoudleName),length(WinMoudleName));
//获得当前遍历窗口的程序文件名
WinMoudleName:=pchar(WinMoudleName);
if WinMoudleName=MoudleName then//MoudleName为工程全局变量,自身程序的文件名
begin
FindHid:=hwnd;//FindHid为工程全局变量保存找到的句炳
result:=false;//找到以后就结束遍历
end;
end;
end;
var
han:Thandle;
begin
hMutex:=CreateMutex(nil,false,'hkOneCopy');
if WaitForSingleObject(hMutex,0)<>wait_TimeOut then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
SetLength(MoudleName,100);
GetModuleFileName(HInstance,pchar(MoudleName),length(MoudleName));
//获得自己程序文件名
MoudleName:=pchar(MoudleName);
EnumWindows(@EnumWndProc,0);//调用枚举函数
if FindHid<>0 then
begin
han:=findWindow(nil,'Form1');//Form1是你的窗口的name
if han<>0 then
begin
sendmessage(han,WM_SYSCOMMAND, SC_RESTORE,0);
end;
end;
SetForegroundWindow(FindHid);
end;

end.

热心网友 时间:2024-11-13 21:53

呵呵,我太菜了,你贴的网址里的内容我看不懂。不过只让程序运行一次好象代码很少,要引用Windows单元,如下:
CreateMutex(nil,False,'NetSend');
if GetLastError=ERROR_ALREADY_EXISTS then
begin
Application.MessageBox('程序已经运行','提示',MB_OK);
Halt(0);
end;
要写在program单元中。我贴出整个单元的代码吧:
program NetSend;

uses
Windows,
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
CreateMutex(nil,False,'NetSend');
if GetLastError=ERROR_ALREADY_EXISTS then
begin
Application.MessageBox('程序已经运行','提示',MB_OK);
Halt(0);
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
桑葚干直接吃还是泡水喝比较好桑葚干直接吃补肾吗 桑葚干泡水吃好还是干吃好 益智仁脑素神经酸片的功效与作用有哪些 黄冈师范学院师范专业有哪些 语文教育专业考研方向分析 黄冈师范学院语文教育专科毕业能拿教师资格证吗 php保留数字小数点后两位的方法 梦见被后咬 梦见母亲给赔鸡钱补了十二元的预兆 梦见门掉下来要二十五元修理费 怎么才能长高还有机会吗?25岁了怎么才能长高? 漳州到南通怎么坐车 d2290次列车途经站点,南通飞福建漳州旅游路线 为什么在ln运算中, a+ b等于lna* lnb 朋友的医生误诊怎么办 医生误诊患者如何维权 走出监狱的女人分集剧情 扁桃体肿大有什么影响及危害 儿童扁桃体肿大有什么危害 我想要矫正牙齿,想问问大家什么时间段做效果最好? 怀化洪江古商城自助游 我想要去矫正牙齿,可她们说牙齿基本矫不正,而且还会越弄越坏,这是真... 5.1三天想从长沙去怀化洪江古商城 ... 哈熊沟门票多少_不老村要门票吗 儿童在超市偷东西会被判刑吗 《碧蓝航线》卡尔斯鲁厄改造介绍介绍_《碧蓝航线》卡尔斯鲁厄改造介绍... 氟塑料耐腐蚀液下泵 为什么我手机发短信不显示记录了 短信发出去了没有显示已送达 为什么信息发出去了,手机不显示 ...我今年25岁净身高178厘米,还有没有机会在长高一点... delphi怎么获得某文件夹下最新建立的文件 delphi 想一个变量经过一个小时后变量的值自动改变成另一个,请问要怎么... ...和 全副相机用上35MM定焦,效果一样吗?请讲的详细点谢谢 ...拼音能将26个字母一个不多一个不少的全部用上,莫非是天造巧合... 孩子的聪明劲儿全用在玩儿上了,成绩没提升怎么办? 广州市从化区鳌头镇到深圳保安区路程有多远 成本费用控制改进成本费用控制的对策措施 优化管理的建议和措施怎么写 合同签订和施工准备阶段的成本控制措施? 可以这样订火车票吗?,会不会不让你上火车啊,比方说我想到上海,我人在陕... 从石家庄到安康的火车票,11点之前到安康的在石家庄买几点钟的票 没有诚意的人我不想交。除你之外。什么意思? 怎样让喜欢的人感觉到自己的诚意? 公司在女员工怀孕期间能辞退吗 女员工现在怀孕后公司能辞退吗 交直流试验变压器概述 YD轻型试验变压器产品介绍 2014新款飞度能不能长途自驾游呢 电子工程系的专业都有哪些?就业怎么样?