程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 防止程序重復執行的單元

防止程序重復執行的單元

編輯:Delphi

//工程引用此單元就能防止同時出現多個實例 
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. 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved