HP\李良庭
2025-07-08 868daf94f29ce1ffdd799a68c07bb668cd373bcd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{------------------------------------------------------------------------------}
{ÏîÄ¿Ãû³Æ£º¹«¹²ÏîÄ¿                                                            }
{µ¥ÔªÃû³Æ£º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.