怎么让程序之运行一个副本?就像winamp一样,当程序已经运行时,点击winamp程序图标,就把winamp调到前台。
解决方案 »
- 关于游标
- 各位大虾救命啊!!!关于ADOdataset CatchUpdate的问题!
- 我想请问各路高手在listview里面实现排序怎么做?
- 紧急问题,大家快来,窗口焦点题
- 谁有IC卡开发的dll文件,发一个给我?
- 高手,请进来帮忙,急!!!!
- winXP下编的关于SQL SERVER的数据库的软件,为什么在win98下不能运行?
- 各位谁能给我一个例子,在一个exe中调用一个package中的子窗口.
- 如何将dbgrid的首列固定(急!)
- 请教InterBase高手!
- 用InstallShield Professional 6.22做安装程序出现"iKernel.exe"出错问题,在线等待
- IntraWeb如何打开另一个网页(Unit2/FORMMAIN2)
begin
GlobalDeleteAtom(GlobalFindAtom(iAtom));
if GlobalFindAtom(iAtom) = 0 then//通过全局原子量防止程序出现多个运行实例
begin
GlobalAddAtom(iAtom);
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);//改成你的createform
Application.Run;
GlobalDeleteAtom(GlobalFindAtom(iAtom));
end
else
MessageBox(0,'您可能已经运行了管理系统或是上次非正常退出管理系统,如果是后一种情况,请重新启动机器即可。','管理系统',mb_OK);
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;
这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。