Inno setup Inno安装程序在自定义表单标题栏上使用不同的图标

Inno setup Inno安装程序在自定义表单标题栏上使用不同的图标,inno-setup,pascalscript,Inno Setup,Pascalscript,默认情况下,自定义表单在标题栏中使用与主向导表单相同的图标,即设置图标配置文件。有没有办法在自定义表单的标题栏上给它一个不同的图标 [代码] 变量 自定义窗体:TForm; {创建并显示自定义窗口} 过程ShowCustomWindow(); 开始 CustomWindowForm:=TForm.Create(WizardForm); 使用CustomWindowForm do 开始 边框样式:=bsSingle; 位置:=poOwnerFormCenter; 标题:='窗口标题'; Clien

默认情况下,自定义表单在标题栏中使用与主
向导表单
相同的图标,即
设置图标配置文件
。有没有办法在自定义表单的标题栏上给它一个不同的图标

[代码]
变量
自定义窗体:TForm;
{创建并显示自定义窗口}
过程ShowCustomWindow();
开始
CustomWindowForm:=TForm.Create(WizardForm);
使用CustomWindowForm do
开始
边框样式:=bsSingle;
位置:=poOwnerFormCenter;
标题:='窗口标题';
ClientWidth:=ScaleX(400);
ClientHeight:=ScaleY(400);
显示
结束;
结束;

我需要的是类似于
TForm
图标
属性的东西,但似乎没有,而且我在任何地方都找不到有关该属性的任何信息。

您必须使用WinAPI,尤其是:

[文件]
资料来源:“custom.ico”;标志:dontcopy
[守则]
常数
图像_图标=1;
LR_LOADFROMFILE=$10;
WM_SETICON=80美元;
图标_小=0;
函数LoadImage(
hInst:整数;ImageName:字符串;ImageType:UINT;X,Y:整数;
旗帜:UINT):坦德尔;外部的LoadImageW@User32.dllstdcall';
程序CustomFormShow(发送方:ToObject);
变量
图标:坦德尔;
开始
提取临时文件('custom.ico');
图标:=LoadImage(
0,ExpandConstant('{tmp}\custom.ico'),IMAGE_图标,0,0,LR_LOADFROMFILE);
SendMessage(TForm(Sender).Handle,WM_SETICON,ICON_SMALL,ICON);
结束;
变量
自定义窗体:TForm;
{创建并显示自定义窗口}
过程ShowCustomWindow();
开始
CustomWindowForm:=TForm.Create(WizardForm);
使用CustomWindowForm do
开始
{您的代码}
OnShow:=@CustomFormShow;
显示
结束;
结束;
(代码用于Unicode版本的Inno Setup–Inno Setup 6的唯一版本)


奇怪的是,这种方法在一段时间内效果很好,然后就停止了。在显示窗口之前发送消息似乎不可靠。我不得不将
SendMessage
移动到
Show
之后,并添加了一个
Refresh
,这似乎使它恢复了活力。你知道为什么在一开始工作正常后,它会突然停止工作吗?每当重新创建窗口句柄时,图标就会丢失。理想情况下,应该在响应VCL方法时设置图标
CreateWnd
——但这在Inno设置中是不可能的。因此,您对代码所做的任何更改都会导致在
Show
中重新创建句柄(例如
Position
的某些值所做的操作),从而破坏代码。在
Show
之后移动代码确实更安全,但实际上会短暂地显示带有默认图标的窗口(这就是为什么我在显示前设置图标的原因)。只将
发送消息
移动到
显示
之后。在之前保持耗时的
提取临时文件
加载图像
。---虽然可能是Inno安装程序限制范围内的最佳解决方案,但还是在
显示
事件处理程序中设置图标-我已经更新了代码。啊,这很有意义。谢谢您的解释我想我移动了
位置
属性的顺序。也许这就是破坏它的原因。你上面的建议听起来是最好的方法。我实际上把
提取临时文件
放在
初始化设置
中,因为那似乎是最好的地方。