新写了一个程序,想实现如下功能:
当程序运行时,检查是否有该程序的实例在运行,如果有,则激活此实例;否则运行程序!

解决方案 »

  1.   

    http://dev.csdn.net/develop/article/20/20379.shtm
    这个上面有说明
    还有可以在GOOGLE里搜索啊,比问要快多了
      

  2.   

    http://www.hermes.com.cn/software/2000.04.06.htm
      

  3.   

    delphi猛料 里边有好几个例子呢,
    CreateMutex
    FindWindow
    SetForgroundWindow
    自己写写,我写的api函数不一定名字全正确
      

  4.   

    delphi5开发人员指南上的一段代码:附带光盘上考过来的,只需加入到你的项目中就可以了unit MultInst;interfaceconst
      MI_QUERYWINDOWHANDLE   = 1;
      MI_RESPONDWINDOWHANDLE = 2;  MI_ERROR_NONE          = 0;
      MI_ERROR_FAILSUBCLASS  = 1;
      MI_ERROR_CREATINGMUTEX = 2;// Call this function to determine if error occurred in startup.
    // Value will be one or more of the MI_ERROR_* error flags.
    function GetMIError: Integer;implementationuses Forms, Windows, SysUtils;const
      UniqueAppStr = 'DDG.I_am_the_Eggman!';var
      MessageId: Integer;
      WProc: TFNWndProc;
      MutHandle: THandle;
      MIError: Integer;function GetMIError: Integer;
    begin
      Result := MIError;
    end;function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
      Longint; stdcall;
    begin
      Result := 0;
      // If this is the registered message...
      if Msg = MessageID then
      begin
        case wParam of
          MI_QUERYWINDOWHANDLE:
            // A new instance is asking for main window handle in order
            // to focus the main window, so normalize app and send back
            // message with main window handle.
            begin
              if IsIconic(Application.Handle) then
              begin
                Application.MainForm.WindowState := wsNormal;
                Application.Restore;
              end;
              PostMessage(HWND(lParam), MessageID, MI_RESPONDWINDOWHANDLE,
                Application.MainForm.Handle);
            end;
          MI_RESPONDWINDOWHANDLE:
            // The running instance has returned its main window handle,
            // so we need to focus it and go away.
            begin
              SetForegroundWindow(HWND(lParam));
              Application.Terminate;
            end;
        end;
      end
      // Otherwise, pass message on to old window proc
      else
        Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
    end;procedure SubClassApplication;
    begin
      // We subclass Application window procedure so that
      // Application.OnMessage remains available for user.
      WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
        Longint(@NewWndProc)));
      // Set appropriate error flag if error condition occurred
      if WProc = nil then
        MIError := MIError or MI_ERROR_FAILSUBCLASS;
    end;procedure DoFirstInstance;
    // This is called only for the first instance of the application
    begin
      // Create the mutex with the (hopefully) unique string
      MutHandle := CreateMutex(nil, False, UniqueAppStr);
      if MutHandle = 0 then
        MIError := MIError or MI_ERROR_CREATINGMUTEX;
    end;procedure BroadcastFocusMessage;
    // This is called when there is already an instance running.
    var
      BSMRecipients: DWORD;
    begin
      // Prevent main form from flashing
      Application.ShowMainForm := False;
      // Post message to try to establish a dialogue with previous instance
      BSMRecipients := BSM_APPLICATIONS;
      BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
        @BSMRecipients, MessageID, MI_QUERYWINDOWHANDLE,
        Application.Handle);
    end;procedure InitInstance;
    begin
      SubClassApplication;   // hook application message loop
      MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
      if MutHandle = 0 then
        // Mutex object has not yet been created, meaning that no previous
        // instance has been created.
        DoFirstInstance
      else
        BroadcastFocusMessage;
    end;initialization
      MessageID := RegisterWindowMessage(UniqueAppStr);
      InitInstance;
    finalization
      // Restore old application window procedure
      if WProc <> Nil then
        SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));
      if MutHandle <> 0 then CloseHandle(MutHandle);  // Free mutex
    end.
      

  5.   

    Google上N多答案的可以用Mutex,Atom等方法
      

  6.   

    if GetLastError<>ERROR_ALREADY_EXISTS then
      begin
        Application.CreateForm(TFormMain, FormMain);
        Application.CreateForm(TForm2, Form2);
        Application.CreateForm(TFormOnLine, FormOnLine);
        Application.CreateForm(TFormReturn, FormReturn);
        Application.CreateForm(TFormAlarm, FormAlarm);
        Application.Run;
      end
      else
      begin
        ShowMessage('該系統已經運行,不能再打開另外一個了');
        ReleaseMutex(hMutex);
      end;
    我們程式里自己寫的一個.
      

  7.   

    这样的答案,在CSDN里多的是,为什么不找一下呢
      

  8.   

    use
      forms,windows,
      Unit1 in 'Unit1.pas' {Form1};
    {$R *.RES}
    begin
      CreateMutex(nil, True, 'MyAppClass');
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        MessageBox(0, '不理你了!', '你运行两次了啦!' ,MB_ICONERROR);
        Halt;
      end;  Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end;
      

  9.   

    上面代码加在program Project1里
      

  10.   

    同意older(疲倦的程序员) 
      “最好用CreateMutex”
      

  11.   

    我用ShowWindow(FindHid,SW_RESTORE)和SetForegroundWindow(FindHid)能够实现,但是窗体只能最大化,却不能最小化,这是为什么?
      

  12.   

    function CheckOnlyOneInstance(GUID: string): Bool;
    var
        mutex: THandle;
    begin
        result := true;
        mutex := CreateMutex(nil, true, PCHAR(GUID));
        if GetLastError = ERROR_ALREADY_EXISTS then
            result := false;
        if mutex <> 0 then ReleaseMutex(mutex);
    end;