如何使用 NSIS 将焦点设置为许可协议复选框控件

How to set the Focus to a License Agreement Checkbox control using NSIS

我想使用 NSIS 将默认焦点设置为许可协议页面中的 "License Agreement" 复选框。然后 taborder 应该工作。

请问如何设置焦点?

下面是我的代码片段:

!include LogicLib.nsh

  !define MUI_TEXT_WELCOME_INFO_TITLE $(welcometitle)
  !define MUI_TEXT_WELCOME_INFO_TEXT $(welcometext)

  !insertmacro MUI_PAGE_WELCOME

  !define MUI_LICENSEPAGE_CHECKBOX ""
  !define MUI_INNERTEXT_LICENSE_BOTTOM ""
  !define MUI_INNERTEXT_LICENSE_TOP ""
  !define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX ""

  !define MUI_TEXT_LICENSE_TITLE $(licensetitle)
  !define MUI_TEXT_LICENSE_SUBTITLE $(licensesubtitle)
  !define MUI_LICENSEPAGE_CHECKBOX_TEXT $(licensecheckboxtext)

  !insertmacro MUI_PAGE_LICENSE "C:\Program Files (x86)\NSIS\Docs\Modern UI 2\license.txt"

 !define MUI_DIRECTORYPAGE_TEXT_TOP $(mydirtoptext)
 !define MUI_TEXT_DIRECTORY_TITLE $(mydirtitle)
 !define MUI_TEXT_DIRECTORY_SUBTITLE $(mydirsubtitle)

  !insertmacro MUI_PAGE_DIRECTORY

  !insertmacro MUI_PAGE_INSTFILES

  !define MUI_TEXT_FINISH_INFO_TITLE $(Finishpagetitle)
  !define MUI_TEXT_FINISH_INFO_TEXT $(Finishpagesubtitle)

  !define MUI_FINISHPAGE_RUN ""
  !define MUI_FINISHPAGE_RUN_TEXT $(FinishonlineReg)

  !insertmacro MUI_PAGE_FINISH

  !insertmacro MUI_UNPAGE_INSTFILES

 ;--------------------------------
  !insertmacro MUI_LANGUAGE "English" 

; The stuff to install
Section "My TestApp (required)"
SectionEnd

Windows UI guidelines 说:

For keyboard navigation, tab order should flow in a logical order, generally from left to right, top to bottom.

但如果你认为你必须强制那么你可以这样做:

!include WinMessages.nsh
!include MUI2.nsh

!insertmacro MUI_PAGE_WELCOME
!define MUI_LICENSEPAGE_CHECKBOX ""
!define MUI_PAGE_CUSTOMFUNCTION_SHOW myForceLicenseFocus
!insertmacro MUI_PAGE_LICENSE "${__FILE__}"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

Function myForceLicenseFocus
!if ${MUI_SYSVERSION} >= 2.0
    FindWindow [=10=] "BUTTON" "" $mui.LicensePage
!else
    FindWindow [=10=] "#32770" "" $hWndParent
    FindWindow [=10=] "BUTTON" "" [=10=]
!endif
System::Call 'USER32::SetFocus(pr0)'
!define /ifndef WM_CHANGEUISTATE 0x127
System::Call 'USER32::PostMessage(pr0,i${WM_CHANGEUISTATE},p0x30002,p0)' ; This forces the checkbox to display the focus rectangle
System::Call 'USER32::SetWindowPos(pr0,p0,i,i,i,i,i0x13)' ; Change tab order
FunctionEnd