Unit Unit1; uses 
  Windows, Dialogs, Sysutils; {...} 
implementation {...} var mHandle: THandle;    // Mutexhandle Initialization 
  mHandle := CreateMutex(nil,True,'XYZ'); 
  if GetLastError = ERROR_ALREADY_EXISTS then 
   begin 
     showMessage('Program is already running!'); 
     halt; 
  end; finalization 
  if mHandle <> 0 then CloseHandle(mHandle) 
end.

解决方案 »

  1.   

    楼上的可能不行喔 ^_^将以下代码家境你的工程里,什么都不用作,看看效果:
    unit MultInst;interfaceconst
      MI_QUERYWINDOWHANDLE   = 1;
      MI_RESPONDWINDOWHANDLE = 2;  MI_ERROR_NONE          = 0;
      MI_ERROR_FAILSUBCLASS  = 1;
      MI_ERROR_CREATINGMUTEX = 2;function GetMIError: Integer;implementationuses Forms, Windows, SysUtils;const
      UniqueAppStr = 'Smtp&POP3Server;TVoice;Ver1.0.0';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 Msg = MessageID then
      begin
        case wParam of
          MI_QUERYWINDOWHANDLE:
            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:
            begin
              SetForegroundWindow(HWND(lParam));
              Application.Terminate;
            end;
        end;
      end
      else
        Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
    end;procedure SubClassApplication;
    begin
      WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
        Longint(@NewWndProc)));
      if WProc = nil then
        MIError := MIError or MI_ERROR_FAILSUBCLASS;
    end;procedure DoFirstInstance;
    begin
      MutHandle := CreateMutex(nil, False, UniqueAppStr);
      if MutHandle = 0 then
        MIError := MIError or MI_ERROR_CREATINGMUTEX;
    end;procedure BroadcastFocusMessage;
    var
      BSMRecipients: DWORD;
    begin
      Application.ShowMainForm := False;
      BSMRecipients := BSM_APPLICATIONS;
      BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
        @BSMRecipients, MessageID, MI_QUERYWINDOWHANDLE,
        Application.Handle);
    end;procedure InitInstance;
    begin
      SubClassApplication;
      MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
      if MutHandle = 0 then
        DoFirstInstance
      else
        BroadcastFocusMessage;
    end;initialization
      MessageID := RegisterWindowMessage(UniqueAppStr);
      InitInstance;
    finalization
      if WProc <> Nil then
        SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));
      if MutHandle <> 0 then CloseHandle(MutHandle);
    end.记得给分喔
      

  2.   

    喔,这东西还加入了激活功能,如仅判断,三两行代码就可搞定:
    把上上楼兄弟的代码改成先Open,返回为0则create,否则就是已运行
    (已有Mutex再Create在某些系统不会报错,仅返回已创建的)
      

  3.   

    sundayboys(sunboy)的办法最好也最简单