{------------------------------------------------------------------------------}
|
{ÏîÄ¿Ãû³Æ£º¹«¹²ÏîÄ¿ }
|
{µ¥ÔªÃû³Æ£ºMultInst.pas }
|
{°æ±¾°æ´Î£º1.5 }
|
{Ä£¿éÃû³Æ£º×¨Óù¦ÄÜ¿â }
|
{¹¦ÄÜÃèÊö£º½â¾öÓ¦ÓóÌÐò¶àʵÀýÎÊÌâ }
|
{½¨Á¢ÈÕÆÚ£º2023-10-24 }
|
{°æÈ¨ËùÓУºÀîÁ¼Í¥ }
|
{------------------------------------------------------------------------------}
|
|
// ¹¤×÷Á÷³Ì
|
// ³ÌÐòÔËÐÐÏÈÈ¡´úÔÓÐÏòËùÓÐÏûÏ¢´¦Àí¹ý³Ì,È»ºó¹ã²¥Ò»¸öÏûÏ¢.
|
// Èç¹ûÓÐÆäËüʵÀýÔËÐÐ,ÊÕµ½¹ã²¥ÏûÏ¢»á»Ø·¢ÏûÏ¢¸ø·¢ËͳÌÐò,²¢´«»ØËü×Ô¼ºµÄ¾ä±ú
|
// ·¢ËͳÌÐò½ÓÊÕµ½´ËÏûÏ¢,¼¤»îÊÕµ½ÏûÏ¢µÄ³ÌÐò,È»ºó¹Ø±Õ×Ô¼º
|
|
unit MultInst;
|
interface
|
|
uses
|
Windows ,Messages, SysUtils, Classes, Forms;
|
|
implementation
|
|
const
|
STR_UNIQUE = '{2BE6D96E-827F-4BF9-B33E-8740414CDEEE}';
|
MI_ACTIVEAPP =1; {¼¤»îÓ¦ÓóÌÐò}
|
MI_GETHANDLE =2; {È¡µÃ¾ä±ú}
|
|
var
|
iMessageID : Integer;
|
OldWProc : TFNWndProc;
|
MutHandle : THandle;
|
BSMRecipients : DWORD;
|
|
function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam:Longint):
|
Longint; stdcall;
|
begin
|
Result := 0;
|
if Msg = iMessageID then
|
begin
|
case wParam of
|
MI_ACTIVEAPP: {¼¤»îÓ¦ÓóÌÐò}
|
if lParam<>0 then
|
begin
|
{ÊÕµ½ÏûÏ¢µÄ¼¤»îǰһ¸öʵÀý}
|
{ÔÚͬһ¸ö½ø³ÌÖÐSetForegroundWindow²¢²»ÄܰѴ°ÌåÌáµ½×îǰ}
|
if IsIconic(lParam) then
|
OpenIcon(lParam)
|
else
|
SetForegroundWindow(lParam);
|
Application.Terminate; {ÖÕÖ¹±¾ÊµÀý}
|
end;
|
MI_GETHANDLE: {È¡µÃ³ÌÐò¾ä±ú}
|
begin
|
PostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP,
|
Application.Handle);
|
end;
|
end;
|
end
|
else
|
Result :=CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
|
end;
|
|
procedure InitInstance;
|
begin
|
{È¡´úÓ¦ÓóÌÐòµÄÏûÏ¢´¦Àí}
|
OldWProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
|
Longint(@NewWndProc)));
|
|
{´ò¿ª»¥³â¶ÔÏó}
|
MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False,STR_UNIQUE);
|
if MutHandle = 0 then
|
begin
|
{½¨Á¢»¥³â¶ÔÏó}
|
MutHandle := CreateMutex(nil,False, STR_UNIQUE);
|
end
|
else begin
|
Application.ShowMainForm := False;
|
{ÒѾÓгÌÐòʵÀý,¹ã²¥ÏûϢȡµÃʵÀý¾ä±ú}
|
BSMRecipients :=BSM_APPLICATIONS;
|
BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
|
@BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
|
end;
|
end;
|
|
initialization
|
{×¢²áÏûÏ¢}
|
iMessageID :=RegisterWindowMessage(STR_UNIQUE);
|
InitInstance;
|
|
finalization
|
{»¹ÔÏûÏ¢´¦Àí¹ý³Ì}
|
if OldWProc <> Nil then
|
SetWindowLong(Application.Handle, GWL_WNDPROC,LongInt(OldWProc));
|
|
{¹Ø±Õ»¥³â¶ÔÏó}
|
if MutHandle <> 0then CloseHandle(MutHandle);
|
|
end.
|