Возрастные врата во время установки при использовании пакета NSIS - PullRequest
0 голосов
/ 06 апреля 2020

Я понятия не имею, пытался ли кто-нибудь делать это раньше (особенно если учесть стандарты для этого), но кто-нибудь когда-нибудь программировал возрастные барьеры в установщике NSIS для приложений, которые вращаются вокруг ограниченных тем, контента или развлечений? Я спрашиваю об этом по наиболее очевидным из распространенных причин, по которым авторитетный рынок в противном случае отклонил бы вашу заявку:

  1. Наличие сексуальных тем (как в «пятидесяти оттенках», если вы хотите быть более точными) 1012 *)
  2. Приложения, содержащие ссылки на использование или изображение регулируемых продуктов (пиво, каннабис, вапинг)
  3. Игры с экстремальными языками или тематическими предложениями (ESRB Class M или эквивалент)

Есть идеи?

1 Ответ

0 голосов
/ 06 апреля 2020

Для реальных игр вы можете зарегистрировать их с помощью Windows Games Explorer . IGameExplorer::VerifyAccess может сообщить вам, заблокирована ли игра родительским контролем. Хотя технически вы можете вызвать этот метод в установщике, он может дать неправильные результаты, если ваш установщик запрашивает повышение уровня UA C, поскольку установщик может работать под учетной записью родителей, а не учетной записью ребенка. Игра должна вызывать ее каждый раз, когда она запускается. Похоже, что в более поздних версиях Windows 10 API Game Explorer поврежден, но на Vista, 7, 8 и 8.1 он должен нормально работать.

В NSIS можно создать пользовательскую страницу для запроса (и проверки) указать c информация:

!include MUI2.nsh
Page Custom MyVerifyPageCreate MyVerifyPageLeave
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

!include nsDialogs.nsh
!include LogicLib.nsh

!define MIN_AGE 21
Var Age

Function MyVerifyPageCreate
!ifmacrodef MUI_HEADER_TEXT
!insertmacro MUI_HEADER_TEXT "Blah" "Blah blah blah"
!endif
nsDialogs::Create 1018
Pop $0
${NSD_CreateLabel} 10u 21u 100% 12u "Blah blah blah age ${MIN_AGE} blah blah"
Pop $0
${NSD_CreateNumber} 10u 35u 30u 12u "$Age"
Pop $1
nsDialogs::Show
FunctionEnd

Function MyVerifyPageLeave
${NSD_GetText} $1 $Age
${If} $Age < ${MIN_AGE}
    MessageBox MB_IconStop "You must be at least ${MIN_AGE} to install $(^Name)!"
    Abort
${EndIf}
FunctionEnd

Или, если пользователю необходимо ввести дату:

!include MUI2.nsh
Page Custom MyVerifyPageCreate MyVerifyPageLeave
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

!include nsDialogs.nsh
!include LogicLib.nsh
!define /IfNDef GDT_VALID 0
!define /IfNDef DTS_LONGDATEFORMAT 4
!define /IfNDef /math DTM_GETSYSTEMTIME 0x1000 + 1

!define MIN_AGE 18

Function MyVerifyPageCreate
!ifmacrodef MUI_HEADER_TEXT
!insertmacro MUI_HEADER_TEXT "Blah" "Blah blah blah"
!endif
System::Call 'COMCTL32::InitCommonControlsEx(*l0x10000000008)'
nsDialogs::Create 1018
Pop $0
${NSD_CreateLabel} 10u 21u -20u 25u "Blah blah blah age ${MIN_AGE} blah blah$\r$\n$\r$\nEnter your birthday:"
Pop $0
nsDialogs::CreateControl SysDateTimePick32 ${DEFAULT_STYLES}|${WS_TABSTOP}|${DTS_LONGDATEFORMAT} ${__NSD_Text_EXSTYLE} 10u 50u 200u 12u "" ; Probably only works on Win98 and higher
Pop $1
nsDialogs::Show
FunctionEnd


Function MyVerifyPageLeave
; NOTE: Does not deal with leap years etc!
System::Call 'USER32::SendMessage(p$1, i${DTM_GETSYSTEMTIME}, p0, @r2)i.r0'
${If} $0 = ${GDT_VALID}
    System::Call 'KERNEL32::SystemTimeToFileTime(pr2,*l.r2)'
    System::Call 'KERNEL32::GetSystemTimeAsFileTime(*l.r3)' ; Current time (UTC)
    System::Call 'KERNEL32::FileTimeToLocalFileTime(*lr3,*l.r3)'
    System::Int64Op ${MIN_AGE} * 315360000000000 ; 1 year (KB 188768)
    System::Int64Op $2 + 
    Pop $2
    ${IfThen} $2 L< $3 ${|} StrCpy $0 "OK" ${|}
${EndIf}
${If} $0 != "OK"
    MessageBox MB_IconStop "You must be at least ${MIN_AGE} to install $(^Name)!"
    Abort
${EndIf}
FunctionEnd
...