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.
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.
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.记得给分喔
把上上楼兄弟的代码改成先Open,返回为0则create,否则就是已运行
(已有Mutex再Create在某些系统不会报错,仅返回已创建的)