【问题标题】:Inno Setup - How to edit the "About Setup" dialog text boxInno Setup - 如何编辑“关于设置”对话框文本框
【发布时间】:2013-02-12 08:12:08
【问题描述】:

我需要编辑或替换 Inno Setup 的 About Setup 对话框文本中的文本。

这是一张图片:

在网上我得到了这个代码:

[Files]
Source: CallbackCtrl.dll; Flags: dontcopy

[Code]
type
  TWFProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;

function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function WrapWFProc(Callback: TWFProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';

var
  OldProc:Longint;

procedure AboutSetupClick;
begin
  //Edit your text here
  MsgBox('CUSTOM TEXT HERE', mbInformation, MB_OK);
end;

function WFWndProc(h:HWND;Msg,wParam,lParam:Longint):Longint;
begin
  if (Msg=$112) and (wParam=9999) then begin
    Result:=0;
    AboutSetupClick;
  end else begin
    if Msg=$2 then SetWindowLong(WizardForm.Handle,-4,OldProc);
    Result:=CallWindowProc(OldProc,h,Msg,wParam,lParam);
  end;
end;

procedure InitializeWizard;
begin
  OldProc:=SetWindowLong(WizardForm.Handle,-4,WrapWFProc(@WFWndProc,4));
end;

似乎工作正常..

但如果我关闭安装程序,我会收到崩溃消息。

请我需要帮助来修复此代码或提供更好的示例来更改“关于设置”对话框文本框中的文本。

我使用的 DLL。 HERE

【问题讨论】:

  • 好吧,如果我忽略了你要做什么(你知道这不合法,对吗?)以及你使用的是哪个库(某种可疑的 "我发现它在 Internet 上并且不在乎它可能包含病毒” 库),您需要将原始窗口过程返回到向导窗体。尝试在DeinitializeSetup 事件中恢复它。而且,-4、$2 和 $112 不是很好命名的常量;-)
  • :(我之前在这个论坛上问过...我不会使用、放置或提供任何病毒,该 dll 来自 inno setup (ultra) 的 dll 包,我不知道这是一个问题,我只想自定义我的安装程序...我需要一些帮助:(
  • 我知道这不是你的本意,但要非常小心。如果我是病毒开发者,安装程序扩展将是一个很好的游戏场所,因为它们通常运行在提升的状态(这可能会让病毒为所欲为)。我不想测试那个库,我只知道您需要在退出之前将原始窗口过程(您的示例中的OldProc)返回给向导表单。因此,从 DeinitializeSetup 事件中调用的 SetWindowLong(WizardForm.Handle, -4, OldProc); 之类的内容可能会帮助您解决问题。
  • @TLama,我的想法完全正确。我在我的安装程序中所做的是,我留下原始的“关于”文本(出于法律/道德原因)并利用TranslatorNote 键(在isl 文件中)添加我自己的东西。用 this 替换 GWL_WNDPROC 似乎有点极端,甚至不成比例......
  • 请注意,Inno 的许可要求之一是保留此处的所有现有文本不变。如果您只添加文本没问题,但不允许您更改任何现有内容。正如 kobik 所说,有一种更简单的方法可以做到这一点。

标签: inno-setup pascalscript


【解决方案1】:

在退出设置应用程序之前,您需要将保存的原始 Windows 过程返回到向导窗体。为此,请使用以下内容:

const
  GWL_WNDPROC = -4;

procedure DeinitializeSetup;
begin
  SetWindowLong(WizardForm.Handle, GWL_WNDPROC, OldProc);
end;

无论如何,您可以使用更可靠的库来包装回调,InnoCallback 库。我已经审查了您使用的代码并添加了对 Unicode InnoSetup 版本的支持,希望使用 InnoCallback 库:

[Files]
Source: "InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
const
  GWL_WNDPROC = -4;
  SC_ABOUTBOX = 9999;
  WM_SYSCOMMAND = $0112;

type
  WPARAM = UINT_PTR;
  LPARAM = LongInt;
  LRESULT = LongInt;
  TWindowProc = function(hwnd: HWND; uMsg: UINT; wParam: WPARAM; 
    lParam: LPARAM): LRESULT;

function CallWindowProc(lpPrevWndFunc: LongInt; hWnd: HWND; Msg: UINT; 
  wParam: WPARAM; lParam: LPARAM): LRESULT;
  external 'CallWindowProc{#AW}@user32.dll stdcall';  
function SetWindowLong(hWnd: HWND; nIndex: Integer; 
  dwNewLong: LongInt): LongInt;
  external 'SetWindowLong{#AW}@user32.dll stdcall';    
function WrapWindowProc(Callback: TWindowProc; ParamCount: Integer): LongWord;
  external 'wrapcallback@files:InnoCallback.dll stdcall'; 

var
  OldWndProc: LongInt;

procedure ShowAboutBox;
begin
  MsgBox('Hello, I''m your about box!', mbInformation, MB_OK);
end;

function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; 
  lParam: LPARAM): LRESULT;
begin
  if (uMsg = WM_SYSCOMMAND) and (wParam = SC_ABOUTBOX) then
  begin
    Result := 0;
    ShowAboutBox;
  end
  else
    Result := CallWindowProc(OldWndProc, hwnd, uMsg, wParam, lParam);
end;

procedure InitializeWizard;
begin
  OldWndProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, 
    WrapWindowProc(@WndProc, 4));
end;

procedure DeinitializeSetup;
begin
  SetWindowLong(WizardForm.Handle, GWL_WNDPROC, OldWndProc);
end;

【讨论】:

  • 使用 Inno Setup 6,您可以使用 CreateCallback(@WndProc),并且您根本不需要 InnoCallback(因此可以删除这些:Source: "InnoCallback.dll"function WrapWindowProc)。
猜你喜欢
  • 2011-12-06
  • 2013-09-18
  • 2020-12-11
  • 2011-08-22
  • 1970-01-01
  • 2011-09-29
  • 2016-08-11
  • 1970-01-01
  • 2012-01-19
相关资源
最近更新 更多