一个应用程序多次点击时,如何只让它只运行一个

类别:Delphi 点击:0 评论:0 推荐:

/////////////////////  (一)项目文件  test.dpr //////////////////////
program SerialGet;

uses
  Forms,
  UMain in 'UMain.pas' {frmMain},
  ULogin in 'UForm2.pas' {Form2},
  UDataModule in 'UDataModule.pas' {DataModule1: TDataModule},

{$R *.res}

begin
  Application.Initialize;

  if CreateMutex then                 //创建句柄,判断此应用程序是否在运行
  begin
    Application.CreateForm(TfrmMain, frmMain);
    Application.CreateForm(Tform2, form2);
    Application.CreateForm(TDataModule1, DataModule1);
    Application.Run;
  end else
  begin
    DestroyMutex;                     //释放句柄
  end;
end.

////////////////  (二)登陆窗体 UMain.pas  UMain.dfm //////////////////
unit UMain;

interface
uses ......
type
  ... ... ...
  private
  public
  end;

var
  frmMain: TfrmMain;

  function CreateMutex: Boolean;     // 全项目公用函数
  procedure DestroyMutex;            // 全项目公用函数

implementation
uses UDataModule;  //引用数据模块
var Mutex: hWnd;

{$R *.dfm}

procedure DestroyMutex;
begin
  if Mutex <> 0 then CloseHandle(Mutex);
end;

function CreateMutex: Boolean;
var
  PrevInstHandle: THandle;
  AppTitle: PChar;
begin
  AppTitle := StrAlloc(100);
  StrPCopy(AppTitle, Application.Title);
  Result := True;
  Mutex := Windows.CreateMutex(nil, False, AppTitle);
  if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then begin
    Result := False;
    SetWindowText(Application.Handle, '');
    PrevInstHandle := FindWindow(nil, AppTitle);
    if PrevInstHandle <> 0 then begin
      if IsIconic(PrevInstHandle) then
        ShowWindow(PrevInstHandle, SW_RESTORE)
      else
        BringWindowToTop(PrevInstHandle);
      SetForegroundWindow(PrevInstHandle);
    end;
    if Mutex <> 0 then Mutex := 0;
  end;
  StrDispose(AppTitle);
end;

本文地址:http://com.8s8s.com/it/it4799.htm