当前位置:主页>仓库管理软件> 列表

防止在一台机器上,同时运行一个应用程序的问题,在线等候~~

仓库管理软件版1楼: 如何防止在一台机器上,不让同时运行一个应用程序?
是用CREATEMUTEX函数吗?
怎么用,放在什么位置上呢?

2楼: http://www.delphibbs.com/delphibbs/dispq.asp?lid=715172
标题: 如何限制在一台机器上只开一个本程序 (100分)


Var
hMutex:HWND;
Ret:Integer;
begin
Application.Initialize;
Application.Title := ''title'';
hMutex:=CreateMutex(nil,False,''title'');
Ret:=GetLastError;
If Ret<>ERROR_ALREADY_EXISTS Then
Begin
Application.CreateForm(Tfm_password, fm_password);
Application.CreateForm(Tfm_wait, fm_wait);
fm_wait.Show;
fm_wait.Refresh;
fm_wait.Hide;
fm_wait.Free;
Application.Run;
End
Else
ReleaseMutex(hMutex);
end.免费服装店管理软件

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

4楼: 修改工程文件:

var hd:integer; //检测变量
begin
hd:=findwindow(''Tform1'',nil);// Form1 是 主Form
if hd<>0 then halt;

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

5楼: 哈哈,太多人回答,没有分赚!

6楼: 在create 里面用api获取你应用程序的句柄,如果能获取表示你有应用程序在,就不用再启动第二个就行了
var
handle_temp: cardinal;
begin
Form1.Hide;
handle_temp := findwindowex(0, 0, nil, ''applicationname'');
if handle_temp <> nil
begin
application.Terminate;
end
else
……
end;

仓库管理软件版7楼: 多人接受答案了。