Delphi单元文件之-防止程序重复执行

简介: //工程引用此单元就能防止同时出现多个实例unit MultInst;interfaceuses Windows ,Messages, SysUtils, Classes, Forms;implementationconst  STR_UNI...

//工程引用此单元就能防止同时出现多个实例
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.

相关文章
|
5月前
|
存储 Cloud Native Linux
C++Qt防止程序重复启动
C++Qt防止程序重复启动
|
28天前
|
IDE 编译器 Shell
运行C程序的步骤与方法
C语言是一种通用、过程式的计算机编程语言,广泛应用于系统软件与应用软件的开发中。本文将详细介绍如何编写、编译和运行一个简单的C程序,并附上相应的代码示例。
16 0
|
11月前
vba程序用7重循环来计算24
vba程序用7重循环来计算24
54 0
|
12月前
|
C#
C# 判断当前控制台程序是否重复运行
C# 判断当前控制台程序是否重复运行
123 0
|
小程序 开发工具 开发者
【小程序】第一个小程序——创建小程序项目
【小程序】第一个小程序——创建小程序项目
96 0
【小程序】第一个小程序——创建小程序项目
|
Python
C调用Python崩溃的记录
C调用Python崩溃的记录
135 0
|
前端开发 测试技术
clswindow使用案例:防止vb程序重复打开,如果重复打开则激活当前已经打开的程序
clswindow使用案例:防止vb程序重复打开,如果重复打开则激活当前已经打开的程序
198 0
clswindow使用案例:防止vb程序重复打开,如果重复打开则激活当前已经打开的程序
|
存储 编译器 C语言
Win32汇编:各种语句的构造方式
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
181 0
|
Java Maven
编写一个 spootboot 程序,有二个方法,一个问早上好,一个说再见
编写一个 spootboot 程序,有二个方法,一个问早上好,一个说再见
111 0
|
小程序 Java C语言
初学者编译的第一个小程序
## 前言 我们在往期的文章中讲到 1.JDK的下载 2.配置环境变量 3.数据类型 接下来我们就可以开始写小程序啦
76 0
初学者编译的第一个小程序