Для реальных игр вы можете зарегистрировать их с помощью 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