将超链接实现到LangString中

时间:2018-12-05 07:24:25

标签: nsis

实际上,我正在尝试使用NSIS标准库将超链接实现到我的LangString中。但是当我“仅”将链接写入LangString时,它就不会被点击。

我正在使用自己的.nsh来构建LangStrings:

!undef LANG
!define LANG = "English"
!LANG_STRING "myTest" "search on google: https://google.com/" 

在我的nsis Main中,代码段如下所示:

!macro LANG_STRING NAME VALUE
  LangString "${NAME}" "${LANG_${LANG}}" "${VALUE}"
!macroend
!macro LANG_LOAD lang
  !insertmacro MUI_LANGUAGE "${lang}"
  !verbose 1
  !include "descriptions\${lang}.nsh"
  !verbose 4
  !undef LANG
!macroend
#Pages(here i build my pages up)
!insertmacro LANG_LOAD "English"

有没有可以使之成为可能的处理方法,是的时候我必须实现它。

1 个答案:

答案 0 :(得分:0)

对此没有内置支持。 NSIS不会尝试检测字符串中的URL,并且Windows控件在旧版本(XP之前)中受到很大限制。

您可以使用RichEdit控件来伪造它,但是没有内置的WM_NOTIFY处理程序来启动URL:

System::Call 'KERNEL32::LoadLibrary(t "MsftEdit")' ; 4.1+, Windows XP SP1 and later
FindWindow $9 "#32770" "" $HWNDPARENT
SendMessage $9 ${WM_GETFONT} 0 0 $8
System::Call 'USER32::CreateWindowExW(i ${WS_EX_TRANSPARENT}, w "RICHEDIT50W", p0, i ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_MULTILINE}|${ES_READONLY}, i 0, i 0, i 300, i 50, p $9, p 0, p 0, p 0)p.s'
Pop $9
SendMessage $9 ${WM_SETFONT} $8 1
!define /math EM_SETTEXTEX ${WM_USER} + 97
System::Call "USER32::SendMessage(p$9,i${EM_SETTEXTEX},*l0,ts)" '{\rtf1{Hello} {\field{\*\fldinst{HYPERLINK "https://stackoverflow.com/questions/tagged/nsis"}}{\fldrslt{SO link}}} {World}}'

可以在nsDialogs页面上处理WM_NOTIFY。在内置页面上,您需要一个自定义插件。您也许可以要求ButtonEvent plug-in的作者添加对此消息的支持。如果需要nsDialogs example可以做到这一点。

另一个替代方法是SysLink control,但是它也遇到相同的WM_NOTIFY问题,并且还限于Windows XP和更高版本的ComCtlv6(XPStyle On),并且仅适用于Unicode。 Windows 2000上存在其他内部实现,但是我不确定是否已记录。

最后的选择是Linker plug-in。我从来没有尝试过,如果要混合链接和普通文本,必须创建几个标签。