From 868daf94f29ce1ffdd799a68c07bb668cd373bcd Mon Sep 17 00:00:00 2001
From: HP\李良庭 <liliangting@lanpucloud.cn:1111>
Date: 星期二, 08 七月 2025 11:49:03 +0800
Subject: [PATCH] 提交分辨率自适应版本V3.1.0.1500

---
 src/pub/MultInst.pas |   99 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 99 insertions(+), 0 deletions(-)

diff --git a/src/pub/MultInst.pas b/src/pub/MultInst.pas
new file mode 100644
index 0000000..f26ef60
--- /dev/null
+++ b/src/pub/MultInst.pas
@@ -0,0 +1,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.
\ No newline at end of file

--
Gitblit v1.9.3