{------------------------------------------------------------------------------} {ÏîÄ¿Ãû³Æ£º¹«¹²ÏîÄ¿ } {µ¥ÔªÃû³Æ£º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.