怎样让程序只运行一次
我想让我的程序只执行一次,当程序正在运行时如果用户想运行此程序的复本时将弹出一个提示框,然后将复本关闭,如何实现此功能,请各位赐教 问题点数:50、回复次数:38Top
1 楼zyb()回复于 2000-10-24 09:42:00 得分 0
到已解决问题中去找,方法有好几种呢。。。Top
2 楼meijg(星星之火)回复于 2000-10-24 10:22:00 得分 0
用原子功能,atom
Top
3 楼LaoZheng(阿明)回复于 2000-10-24 10:50:00 得分 0
用findwindow()函数Top
4 楼13023600339()回复于 2000-10-24 11:20:00 得分 0
请各位具体一点Top
5 楼Nicrosoft(奈软)回复于 2000-10-24 12:42:00 得分 0
用findwindow()函数查找是否有某标题的窗口(即上一个实例的窗口)存在,如果存在则Application.Terminate.Top
6 楼Nicrosoft(奈软)回复于 2000-10-24 12:48:00 得分 0
用findwindow()函数查找是否有某标题的窗口(即上一个实例的窗口)存在,如果存在则Application.Terminate.Top
7 楼PoolD(池龙)回复于 2000-10-24 12:59:00 得分 0
一般用两种方法实现。
1. 用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。
如在dpr中,建立主窗口之前
if findwindow('tform1', 'form1') = 0 then
//建立主窗口并运行程序
但是
2. 用CreateMutex函数建立一个互斥量。
如在dpr中
CreateMutex(0, true, 'my program');
if GetLastError <> ERROR_ALREADY_EXISTS then begin
Application.Initialize;
Application.CreateForm(TfMain, fMain);
Application.Run;
end;
我个人认为用CreateMutex的方法比较好。用findwindow的话在调试的时候会有一些麻烦。Top
8 楼mantousoft(孜孜)回复于 2000-10-24 13:06:00 得分 50
修改dpr文件,下面是我以前编的一个程序,看看对你有没有帮助。
program onlyone;
uses
Forms,
Windows,
main in 'main.pas' {Form1};
{$R *.RES}
var
MutexHandle: THandle;
hPrevInst: Boolean;
begin
//检查互斥句炳名
MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'Instance of this application is already running.',
'Application already running', mb_IconHand);
hPrevInst := TRUE;
CloseHandle(MutexHandle);
Halt; // 'Halt' 退出
end
else
begin
//没找到
hPrevInst := FALSE;
end;
end
else
begin
hPrevInst := FALSE;
end;
Application.Initialize;
Application.Title := 'My sample app';
Application.CreateForm(TForm1, Form1);
Application.Run;
end.Top
9 楼mantousoft(孜孜)回复于 2000-10-24 13:10:00 得分 0
修改dpr文件,下面是我的一个例子程序
program tool;
uses
Forms,
windows,
main in 'main.pas' {mainform},
setit in 'setit.pas' {setform},
about in 'about.pas' {aboutForm};
{$R *.RES}
var
MutexHandle: THandle; //定义互斥句柄
//防止二次运行
begin
// whether existed
MutexHandle := CreateMutex(nil, TRUE, 'My toolbar');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, '程序已经运行...',
'不好意思', mb_IconHand);
CloseHandle(MutexHandle);
Halt; // 'Halt' Is stop running the actual application.
end;
end;
Application.Initialize;
Application.Title := 'My toolbar';
Application.CreateForm(Tmainform, mainform);
Application.CreateForm(Tsetform, setform);
Application.CreateForm(TaboutForm, aboutForm);
Application.Run;
end.
Top
10 楼mantousoft(孜孜)回复于 2000-10-24 13:15:00 得分 0
修改dpr文件,下面是我的一个例子程序
program tool;
uses
Forms,
windows,
main in 'main.pas' {mainform},
setit in 'setit.pas' {setform},
about in 'about.pas' {aboutForm};
{$R *.RES}
var
MutexHandle: THandle; //定义互斥句柄
//防止二次运行
begin
// whether existed
MutexHandle := CreateMutex(nil, TRUE, 'My toolbar');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, '程序已经运行...',
'不好意思', mb_IconHand);
CloseHandle(MutexHandle);
Halt; // 'Halt' Is stop running the actual application.
end;
end;
Application.Initialize;
Application.Title := 'My toolbar';
Application.CreateForm(Tmainform, mainform);
Application.CreateForm(Tsetform, setform);
Application.CreateForm(TaboutForm, aboutForm);
Application.Run;
end.Top
11 楼PoolD(池龙)回复于 2000-10-24 13:34:00 得分 0
一般用两种方法实现。
1. 用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。
如在dpr中,建立主窗口之前
if findwindow('tform1', 'form1') = 0 then
//建立主窗口并运行程序
但是
2. 用CreateMutex函数建立一个互斥量。
如在dpr中
CreateMutex(0, true, 'my program');
if GetLastError <> ERROR_ALREADY_EXISTS then begin
Application.Initialize;
Application.CreateForm(TfMain, fMain);
Application.Run;
end;
我个人认为用CreateMutex的方法比较好。用findwindow的话在调试的时候会有一些麻烦。Top
12 楼PoolD(池龙)回复于 2000-10-24 13:57:00 得分 0
一般用两种方法实现。
1. 用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。
如在dpr中,建立主窗口之前
if findwindow('tform1', 'form1') = 0 then
//建立主窗口并运行程序
Top
13 楼PoolD(池龙)回复于 2000-10-24 14:00:00 得分 0
一般用两种方法实现。
1. 用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。
如在dpr中,建立主窗口之前
if findwindow('tform1', 'form1') = 0 then
//建立主窗口并运行程序
2. 用CreateMutex函数建立一个互斥量。
如在dpr中
CreateMutex(0, true, 'my program');
if GetLastError <> ERROR_ALREADY_EXISTS then begin
Application.Initialize;
Application.CreateForm(TfMain, fMain);
Application.Run;
end;
我个人认为用CreateMutex的方法比较好。用findwindow的话在调试的时候会有一些麻烦。Top
14 楼FamelStudio(Famel)回复于 2000-10-24 14:16:00 得分 0
· 使用RegisterWindowMessage注册一个用户自定义消息,在程序的主窗口消息处理函数中响应该消息。
· 在程序启动时,使用EnumWindows枚举所有的顶层窗口,并向每个窗口发送(使用SendMessage)那个自定义消息并检查返回结果。Windows的缺省消息处理函数对于自定义消息返回0。
该方法的优点是非常精确,不会出现错误。RegisterWindowMessage确保你所注册的消息的唯一性。同时你可以注册多个自定义消息来执行其他功能,如使用正在运行的程序拷贝来打开用户双击的文件等。
Top
15 楼Raptor(猛禽)回复于 2000-10-24 14:16:00 得分 0
方法多了,MUTEX也是一种Top
16 楼Raptor(猛禽)回复于 2000-10-24 14:28:00 得分 0
方法多了,MUTEX也是一种Top
17 楼solomon(金矿)回复于 2000-10-25 09:31:00 得分 0
HANDLE hMutex;
// Only one instance allowed
hMutex = CreateMutex(NULL, TRUE, "Any String");
if( hMutex == NULL )
{
//System Error return
}
else
{
if( !(GetLastError() == ERROR_ALREADY_EXISTS && hMutex != NULL) )
// One Instance is running just return
}
Top
18 楼ping1999(ping)回复于 2000-10-25 15:26:00 得分 0
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Top
19 楼nirvana()回复于 2000-10-26 13:32:00 得分 0
可以用同步机制中的信号灯,在程序启动时创建一个有名字的信号灯,如果返回说系统中已经有这个名字的信号灯则该程序已经被启动了。
或者用窗口类,将你的主窗口命名一个特殊的窗口类名,然后用ENUMWINDOW找是否系统中已经有这个名字的窗口类Top
20 楼optman(optman)回复于 2000-10-30 21:18:00 得分 0
你可以建立一个有名字的 Event对象,好像是CreateEvent()
因为无法建立同名的Event,所以第二个实例会建立失败......
这是<<Windows核心编程>>里使用的办法Top
21 楼jxabe(沙丁鱼)回复于 2000-10-30 21:49:00 得分 0
其实这个问题很简单,只要我们给Application.title付一个值,如test,然后当你的程序在开始运行时用GetWindowHandle获得句柄,检查是不是和test相同,如果没有相同的就可以继续运行,相同当然就是弹出对话框,但我觉得这没什么必要,只要让它不继续运行就行了嘛.就象winamp,如果每次都要弹出对话框那多烦.Top




