我想编个程序同时只能运行一个此程序的实例再运行只是激活当前程序.
我现在不知道怎么样能激活这个程序,请指点下哈谢谢!

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, CheckLst;type
      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      //保存Mutex句柄
      mHandle:THandle;
      PreviousInstanceWindow:HWnd;
      Project:String;
      AppName:String;
    implementation{$R *.dfm}
    initialization
      //定义自己的项目名称,作为要创建的互斥区名,最好有自己的特点以防止重复
      Project:='RunOnlyOnce_MyProject';
      //将lpMutexAttributes设为nil,bInitialOwner设为True(即本程序拥有该互斥区)
      mHandle:=CreateMutex(nil,True,PChar(Project));
      if GetLastError=ERROR_ALREADY_EXISTS then
       //该互斥区已存在则表明已有本程序的另一个实例在运行
        begin
          ShowMessage('已经有该程序在运行');
          //保存程序标题
          AppName:=Application.Title;
          //不显示本窗口
          Application.ShowMainForm:=False;
          //改变程序标题,以使函数FindWindow找到的是前一个实例窗口
          Application.Title:='destroy me';
          //寻找前一个实例窗口句柄
          PreviousInstanceWindow:=FindWindow(nil,PChar(AppName));
          //已经找到
          if PreviousInstanceWindow<>0 then
          //如果该窗口最小化则恢复
             if IsIconic(PreviousInstanceWindow) then
               ShowWindow(PreviousInstanceWindow,SW_RESTORE)
            else
            //如果程序在后台则将其放到前台
             SetForegroundWindow(PreviousInstanceWindow);
             //中止本实例
            Application.Terminate;
          end;
        finalization
        //该互斥区对象仍存在则关闭对象
          if mHandle<>0 then
            CloseHandle(mHandle);
    end.
      

  2.   

    你可以去《Delphi开发人员指南》里面有这个例子,非常好的,我推荐你看这本书!
      

  3.   

    在Project里用FindWindow查找,如果查找结果为nil,则运行应用程序,如果不为nil,则表示已经运行了一个一样的程序.