Inno setup 禁止按钮在Inno设置中接收焦点

Inno setup 禁止按钮在Inno设置中接收焦点,inno-setup,Inno Setup,在我的脚本中,当单击音频按钮时,它会收到一个焦点(蓝色粗边框) 我希望它是,即使当你点击音频按钮,重点按钮仍然是“下一步/安装” 这很难实现,因为Inno Setup API中缺少OnEnter事件 首先,要将按钮的TabStop属性设置为False,以防止按钮使用Tab键接收焦点 Button.TabStop:=False; (,这是声音按钮) 如果你对焦点总是回到“下一步”按钮感到满意,当鼠标点击时,这很容易。只需将焦点明确设置为按钮的OnClick处理程序末尾的“Next”按钮: p

在我的脚本中,当单击音频按钮时,它会收到一个焦点(蓝色粗边框)


我希望它是,即使当你点击音频按钮,重点按钮仍然是“下一步/安装”


这很难实现,因为Inno Setup API中缺少
OnEnter
事件

首先,要将按钮的
TabStop
属性设置为
False
,以防止按钮使用Tab键接收焦点

Button.TabStop:=False;
(,这是
声音按钮

如果你对焦点总是回到“下一步”按钮感到满意,当鼠标点击时,这很容易。只需将焦点明确设置为按钮的
OnClick
处理程序末尾的“Next”按钮:

procedure按钮点击(发送方:TObject);
开始
//一些实际代码
//如果按钮是聚焦的
//(当访问键被用来“点击”它时,它就不会是了)。。。
如果按下按钮(发送器)。则聚焦
// ... 聚焦“下一步”按钮
WizardForm.ActiveControl:=WizardForm.NextButton;
结束;
(在您的例子中,
OnClick
处理程序是
SoundCtrlButtonClick


但是,如果您想很好地实现这一点,通过将焦点返回到以前实际拥有焦点的控件,这将更加困难

我想不出比安排一个频繁的计时器来监视集中的控件更好的解决方案

[代码]
函数设置计时器(hWnd:LongWord;nIDEvent,UERelease:LongWord;
lpTimerFunc:LongWord):LongWord;外部的SetTimer@user32.dllstdcall';
变量
LastFocusedControl:TWinControl;
过程焦点监视程序(
H:LongWord;Msg:LongWord;IdEvent:LongWord;Time:LongWord);
开始
//记住聚焦控件,除非当前聚焦控件是
//已经是唯一的了,我们不想集中精力
如果(WizardForm.ActiveControl=nil)或
WizardForm.ActiveControl.TabStop然后
开始
LastFocusedControl:=WizardForm.ActiveControl;
结束;
结束;
程序按钮点击(发送方:ToObject);
开始
//一些实际代码
//如果按钮是聚焦的
//(当访问键被用来“点击”它时,它就不会是了)。。。
如果t按钮(发送器).Focused和(LastFocusedControl nil),则
{…聚焦先前聚焦的控件}
WizardForm.ActiveControl:=LastFocusedControl;
结束;
过程初始化Wizard();
开始
//设置50ms定时器以监视焦点
SetTimer(0,0,50,CreateCallback(@FocusMonitorProc));
//创建“不可聚焦”按钮
SomeButton:=TNewButton.Create(WizardForm);
//初始化按钮
SomeButton.TabStop:=False;
结束;
对于,您需要Inno设置6。如果您坚持使用Inno Setup 5,则可以使用库中的
WrapCallback
函数


另一种解决方案是使用类似按钮的图像(the),而不是实际的
t按钮
TBitmapImage
控件(不是)根本无法接收焦点

实际上,它可以让你得到一个漂亮的“静音”图像,而不是简单的“静音”标题