zoukankan      html  css  js  c++  java
  • 防止程序重复执行的单元

    来自万一老师博客:http://www.cnblogs.com/del/archive/2007/11/21/967074.html

    -----------------------------------------------------------------------------------------------

    //工程引用此单元就能防止同时出现多个实例
    unit MultInst;
    
    interface
    
    uses
     Windows ,Messages, SysUtils, Classes, Forms;
    
    implementation
    
    const
     STR_UNIQUE    = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
     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 <> 0 then CloseHandle(MutHandle);
    
    end.

  • 相关阅读:
    78. Subsets
    93. Restore IP Addresses
    71. Simplify Path
    82. Remove Duplicates from Sorted List II
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    312. Burst Balloons
    程序员社交平台
    APP Store开发指南
    iOS框架搭建(MVC,自定义TabBar)--微博搭建为例
  • 原文地址:https://www.cnblogs.com/del88/p/3061896.html
Copyright © 2011-2022 走看看