怎么让程序之运行一个副本?就像winamp一样,当程序已经运行时,点击winamp程序图标,就把winamp调到前台。

解决方案 »

  1.   

    http://www.csdn.net/develop/Read_Article.asp?Id=20379
      

  2.   

    在delphi中,菜单project->view source后出现工程文件代码改成如下即可:const iAtom = 'MyAtomName';
    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);
      

  3.   

    实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获知前一实例的句柄,从而可以方便地进行判断,但 Windows 95/98 是抢先式多任务系统,其程序的前一实例句柄恒为零,所以只有另寻其他办法。目前最有效的办法是通过查看是否有相同窗口类名的例程存在来进行判断。下面介绍在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;
    这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。