⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 其他应用程序加菜单 如何给exe文件加个 菜单
💻 PAS
字号:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, UShare, Menus, ExtCtrls;

type
  TFrmMain = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
    procedure CMMsgWndCreated(var Message: TMessage); message CM_MSGWNDCREATED;
  public
    { Public declarations }
    PatchOK : integer;
  end;

var
  FrmMain: TFrmMain;
  DestWnd: HWND;

implementation

{$R *.dfm}

var
  hLib: THandle;
  InstallHook: procedure (MainWnd, DestWnd: HWND); stdcall;
  UninstallHook: procedure ; stdcall;

var
  MsgWnd: HWND;

procedure TFrmMain.CMMsgWndCreated(var Message: TMessage);
begin
  MsgWnd := Message.WParam;
  if Message.LParam = 1 then begin
    PatchOK := -1;
    PatchOK := SendMessage(MsgWnd, CM_BUILDMENU, 0, 0);
    if PatchOK >= 0 then begin
       FrmMain.Visible := False;
       showmessage('打补丁成功!');
    end;   
  end
  else
    //
end;                       
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UninstallHook;
  if hLib <> 0 then FreeLibrary(hLib);
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  WinExec('ToBePatchedExe.exe', SW_NORMAL); //启动待打补丁的程序
  sleep(500); //视情况等待一段时间,这样可以找到待打补丁程序的主窗口句柄

  if hLib = 0 then begin
     hLib := LoadLibrary('PatchDll.dll');
     if hLib = 0 then begin
        Showmessage('未找到动态链接库PatchDll.dll');
        Exit;
     end;
  end;

  //获取动态链接库中的函数
  @InstallHook := GetProcAddress(hLib, 'InstallHook');
  @UninstallHook := GetProcAddress(hLib, 'UninstallHook');

  //获取ToBePatchedExe.exe主窗口的句柄,你可以用更好的方法来获取
  DestWnd := FindWindow('TFrmHooked', '待打补丁的程序');
  if DestWnd = 0 then begin
     Showmessage('待打补丁的程序未找到!');
     Exit;
  end;   

  MsgWnd := 0;

  //安装钩子
  InstallHook(Handle, DestWnd);
  
  PostMessage(DestWnd, WM_NULL, 0, 0);
end;

procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  DestWnd := FindWindow('TFrmHooked', '待打补丁的程序');
  if DestWnd <> 0 then begin
    ShowMessage('请先关闭主程序!');
    CanClose := False;
  end;

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -