国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

防止應用程序出現多個實例的通用單元-UniqueInstance.pas

2019-09-08 23:09:07
字體:
來源:轉載
供稿:網友
                                                                                                                                                       
                       

{ unit UniqueInstance;/t/t/t/t/t/t/t }
{/t/t/t/t/t/t/t/t/t      }
{ Check if previous application instance exists, if yes, the previous/t  }
{ instance will be active, and current instance will be terminate./t     }
{/t/t/t/t/t/t/t/t/t      }
{ written by savetime, http://savetime.delphibbs.com 2004/6/27/t/t }
{/t/t/t/t/t/t/t/t/t      }
{ Usage:/t/t/t/t/t/t/t/t       }
{   Include this unit to your delphi project, no more job to do./t       }
{/t/t/t/t/t/t/t/t/t      }
{ Important:/t/t/t/t/t/t/t/t   }
{   You must NOT remove the project line: Application.Initialize;/t      }
{/t/t/t/t/t/t/t/t/t      }
{ Notes:/t/t/t/t/t/t/t/t       }
{   This unit identify an application by it''s EXE file name. So, if you want   }
{   to specify another unique application name, you must change the value      }
{   UniqueApplicationName in CheckPriviousInstance procedure./t/t  }
{/t/t/t/t/t/t/t/t/t      }

unit UniqueInstance;

interface

uses Classes, SysUtils, Windows, Forms;

implementation

var
 UniqueMessageID: UINT;
 UniqueMutexHandle: THandle;
 PreviousWndProc: TFNWndProc;
 NextInitProc: Pointer;

function ApplicationWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM;
 lParam: LPARAM): LResult; stdcall;
begin
 // Note: Use "<>" may boost application speed.
 if uMsg <> UniqueMessageID then
   Result := CallWindowProc(PreviousWndProc, hWnd, uMsg, wParam, lParam)
 else begin
   if IsIconic(Application.Handle) then Application.Restore;
   SetForegroundWindow(Application.Handle);
   Result := 0;
 end;
end;

procedure BringPreiviousInstanceForeground;
const
 BSMRecipients: DWORD = BSM_APPLICATIONS;
begin
 BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
   @BSMRecipients, UniqueMessageID, 0, 0);
 Halt;
end;

procedure SubClassApplication;
begin
 PreviousWndProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
   Integer(@ApplicationWndProc)));
end;

procedure CheckPreviousInstance;
var
 UniqueApplicationName: PChar;
begin
 // Unique application name, default set to EXE file name,
 // you can change it to yourself.
 UniqueApplicationName := PChar(ExtractFileName(Application.ExeName));

 // Register unique message id
 UniqueMessageID := RegisterWindowMessage(UniqueApplicationName);

 // Create mutex object
 UniqueMutexHandle := CreateMutex(nil, False, UniqueApplicationName);

 // Create mutex failed, terminate application
 if UniqueMutexHandle = 0 then
   Halt
 // The same named mutex exists, show previous instance
 else if GetLastError = ERROR_ALREADY_EXISTS then
   BringPreiviousInstanceForeground
 // No previous instance, subclass application window
 else
   SubClassApplication;

 // Call next InitProc
 if NextInitProc <> nil then TProcedure(NextInitProc);
end;

initialization
 // Must use InitProc to check privious instance,
 // as the reason of Application hasn''t been created!
 NextInitProc := InitProc;
 InitProc := @CheckPreviousInstance;

finalization
 // Close the mutex handle
 if UniqueMutexHandle <> 0 then CloseHandle(UniqueMutexHandle);

end.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 台南县| 孟连| 巴彦淖尔市| 榆社县| 梓潼县| 六安市| 铜山县| 资源县| 和平县| 安龙县| 西青区| 江达县| 富宁县| 营口市| 凤阳县| 兴文县| 晋州市| 宁国市| 嘉义市| 密山市| 渝北区| 柳江县| 长顺县| 宿迁市| 五华县| 泸西县| 张家港市| 驻马店市| 岑溪市| 兴化市| 太原市| 安达市| 华宁县| 巴马| 尤溪县| 游戏| 阿鲁科尔沁旗| 赤峰市| 浙江省| 金乡县| 轮台县|