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

时间:2016-06-12 13:29:18

标签: inno-setup

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

更新:更改标准游标代码与.cur文件配合良好,但动画光标文件(.ani)在安装程序启动时不会生成动画。这有什么解决方案吗?感谢。

1 个答案:

答案 0 :(得分:1)

取决于你想要改变的游标。您可能想要更改一些标准游标。或者某些(或所有)安装程序窗口控件的默认(普通)光标。

更改标准游标

如果不使用某些外部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;

更改某些(或所有)安装程序窗口控件的默认(正常)光标

[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;