如何在 Inno Setup 中设置自定义 .cur 或 .ani 光标?

How to set a custom .cur or .ani cursor in Inno Setup?

我想用 Inno Setup 做一个简单的安装脚本。如何在安装程序启动时加载自定义 .cur.ani 光标文件?谢谢

更新:更改标准光标 代码适用于 .cur 文件,但动画光标文件 (.ani) 在安装程序启动时没有动画。有什么解决办法吗?谢谢

取决于您要更改的光标。您可能想要更改一些标准游标。或者某些(或全部)安装程序 window 控件的默认(正常)光标。


更改标准游标

如果不使用某些外部 DLL 库,您很难仅在安装程序过程中更改这些。

仅使用 Inno Setup 本身,您可以更改系统光标。但这会影响所有其他应用程序,而安装程序是 运行.

[Files]
Source: "MyCursor.cur"; Flags: dontcopy

[Code]

const
  OCR_NORMAL = 32512;

function SetSystemCursor(hcur: LongWord; id: DWORD): BOOL;
  external 'SetSystemCursor@user32.dll stdcall';
function LoadCursorFromFile(lpFileName: string): LongWord;
  external 'LoadCursorFromFileW@user32.dll stdcall';
function CopyIcon(hIcon: LongWord): LongWord;
  external 'CopyIcon@user32.dll stdcall';
function LoadCursor(hInstance: LongWord; lpCursorName: LongWord): LongWord;
    external 'LoadCursorA@user32.dll stdcall';

var
  OriginalCursor: LongWord;

procedure InitializeWizard();
var
  PathToCursorFile: string;
  Cursor: LongWord;
begin
  // Remember the original custom
  OriginalCursor := CopyIcon(LoadCursor(0, OCR_NORMAL));

  // Load our cursor
  ExtractTemporaryFile('MyCursor.cur')
  PathToCursorFile := ExpandConstant('{tmp}\MyCursor.cur');
  Cursor := LoadCursorFromFile(PathToCursorFile);
  SetSystemCursor(Cursor, OCR_NORMAL);
end;

procedure DeinitializeSetup();
begin
  // Restore original cursor on exit
  SetSystemCursor(OriginalCursor, OCR_NORMAL); 
end;

更改部分(或全部)安装程序 window 控件的默认(正常)光标

[Files]
Source: "MyCursor.cur"; Flags: dontcopy

[Code]

const
  GCL_HCURSOR = (-12); 

function LoadCursorFromFile(lpFileName: string): LongWord;
  external 'LoadCursorFromFileW@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
  external 'SetClassLongA@user32 stdcall';   

procedure InitializeWizard();
var
  PathToCursorFile: string;
  Cursor: LongWord;
begin
  ExtractTemporaryFile('MyCursor.cur')
  PathToCursorFile := ExpandConstant('{tmp}\MyCursor.cur');
  Cursor := LoadCursorFromFile(PathToCursorFile);
  SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, Cursor); 
end;

以上代码更改 Next 按钮的光标。如果要对所有控件使用相同的自定义光标,可以迭代控件树。

procedure SetControlsCursor(Control: TWinControl; Cursor: LongWord);
var
  I: Integer;
begin
  SetClassLong(Control.Handle, GCL_HCURSOR, Cursor); 

  for I := 0 to Control.ControlCount - 1 do
  begin
    if Control.Controls[I] is TWinControl then
    begin
      SetControlsCursor(TWinControl(Control.Controls[I]), Cursor);
    end;
  end;
end;

procedure InitializeWizard();
...
begin
  ...
  SetControlsCursor(WizardForm, Cursor);
end;