无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 713|回复: 14
打印 上一主题 下一主题

[求助] 求开机加载软件,完成条件,自动退出

[复制链接]
跳转到指定楼层
1#
发表于 前天 17:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在Windows上搞一个程序
这个程序是开机后全屏占用
回答题目
比如是选择古诗,作者是谁? 下一句或者上一句,
比如是加减乘除 答案多少
回答正确后在退出,并加载Windows原来的资源管理器
好整不。
2#
发表于 前天 17:49 | 只看该作者
好整
回复

使用道具 举报

3#
发表于 前天 17:53 | 只看该作者
好整
回复

使用道具 举报

4#
发表于 前天 18:16 | 只看该作者
好整
回复

使用道具 举报

5#
发表于 前天 18:41 | 只看该作者
好整,丢给AI写吧,连题都帮你出好
回复

使用道具 举报

6#
发表于 前天 22:18 | 只看该作者
98时代应用程序可以屏蔽Ctrl-Alt-Del,NT时代不知道有什么好办法,比如挂钩winlogon.exe还是定时器不断占据顶层窗口。
回复

使用道具 举报

7#
发表于 昨天 10:08 | 只看该作者
写过类似锁全屏的工具,确实屏蔽Ctrl-Alt-De三大金刚键比较麻烦
回复

使用道具 举报

8#
发表于 昨天 13:28 | 只看该作者
这不是ATM取款机的软件逻辑吗!这做出来,起码的收10个W的技术费。
回复

使用道具 举报

9#
发表于 昨天 13:40 | 只看该作者
只有试过才知道
回复

使用道具 举报

10#
发表于 昨天 14:01 | 只看该作者
github上有开源的答题系统,拿来改一改就行了
回复

使用道具 举报

11#
发表于 昨天 16:43 | 只看该作者
这个我知道,windows自带这个功能,但是我忘了。真没骗你
回复

使用道具 举报

12#
发表于 昨天 21:36 | 只看该作者
本帖最后由 Metest 于 2025-7-30 22:07 编辑

抽空借助Ai助手编写了这个小工具,看看是否适合,编写环境为AutoIt v3脚本代码。末尾附上成品及源码,需要可自行修改。
界面截图




功能特点:

  • 全屏界面:覆盖整个屏幕,无法最小化
  • 禁用系统快捷键:屏蔽Win键、Alt+Tab、Alt+F4、Esc等快捷键
  • 开机自启:程序会自动添加至开机启动项
  • 随机题目:每次随机显示题库中的问题
  • 时间显示:屏幕底部显示当前时间和日期
  • 答题控制:
      支持上一题/下一题切换
      输入答案后按回车或点击"提交答案"按钮
      回答正确后程序自动退出

首次使用:
  • 将程序文件(StudyTool.exe)和题库文件(questions.ini)放在同一目录
  • 若没有questions.ini文件,程序会自动创建示例题库

运行方式:
  • 直接运行(双击StudyTool.exe)
  • 程序会修改注册表实现开机自启(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run)

退出条件:
  • 只有正确回答当前问题才能退出程序

题库配置:
[分类名称]
问题编号=问题内容
A编号=答案内容

题库示例:
[古诗]
1=床前明月光的下一句是什么?
A1=疑是地上霜
2=举头望明月的下一句是什么?
A2=低头思故乡

[数学]
1=25 × 4 ÷ 2 = ?
A1=50

配置规则:
  • 每个分类用[分类名]开头
  • 问题编号使用纯数字(如1=,2=)
  • 答案编号使用A+问题编号(如A1=,A2=)
  • 支持多分类,问题数量不限

脚本源码:带注释【已和成品一起打包】AutoIt
  1. #NoTrayIcon ; 不显示系统托盘图标
  2. #include <MsgBoxConstants.au3> ; 消息框支持
  3. #include <WinAPISys.au3> ; Windows API 系统函数
  4. #include <WinAPIProc.au3> ; Windows API 进程函数
  5. #include <WindowsConstants.au3> ; Windows 常量
  6. #include <GUIConstantsEx.au3> ; GUI 控件常量
  7. #include <EditConstants.au3> ; 编辑框控件常量
  8. #include <ButtonConstants.au3> ; 按钮控件常量
  9. #include <StaticConstants.au3> ; 静态文本控件常量
  10. #include <File.au3> ; 文件操作函数
  11. #include <Date.au3> ; 日期时间函数

  12. ; ==== 全局变量声明 ====
  13. Global $sCurrentAnswer = "" ; 当前问题的正确答案
  14. Global $aQuestions[0][2] ; 存储所有问题和答案的二维数组 [问题, 答案]
  15. Global $iCurrentQuestion = -1 ; 当前显示的问题索引
  16. Global $hGUI, $hLabel, $hInput, $hButtonSubmit, $hButtonPrev, $hButtonNext, $hStatusLabel ; GUI 控件句柄
  17. Global $hKeyboardHook, $hCallback ; 键盘钩子相关变量
  18. Global $hTimeLabel, $hDateLabel ; 时间和日期标签句柄

  19. ; 键盘钩子常量
  20. Global Const $WH_KEYBOARD_LL = 13

  21. ; ==== 主程序入口 ====
  22. _Main()

  23. Func _Main()
  24.     ; 设置开机自动启动
  25.     _SetAutoStart()

  26.     ; 确保资源管理器运行(防止系统功能异常)
  27.     If Not ProcessExists("explorer.exe") Then
  28.         Run("explorer.exe")
  29.     EndIf

  30.     ; 从INI文件加载题目
  31.     $aQuestions = _LoadQuestionsFromINI()

  32.     ; 检查题目加载情况
  33.     If UBound($aQuestions) = 0 Then
  34.         MsgBox(16, "错误", "未加载到任何题目,请检查questions.ini文件")
  35.         Exit
  36.     EndIf

  37.     ; 创建全屏窗口
  38.     $hGUI = GUICreate("学习工具", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, _
  39.         BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) ; 置顶且不显示在任务栏
  40.     GUISetBkColor(0x1F1F1F) ; 设置背景色为深灰色

  41.     ; ==== 创建界面控件 ====
  42.     ; 1. 时间日期显示
  43.     $hTimeLabel = GUICtrlCreateLabel("", 0, @DesktopHeight - 100, @DesktopWidth, 40, $SS_CENTER)
  44.     GUICtrlSetFont($hTimeLabel, 24, 800) ; 加粗字体
  45.     GUICtrlSetColor($hTimeLabel, 0xFFFFFF) ; 白色文字

  46.     $hDateLabel = GUICtrlCreateLabel("", 0, @DesktopHeight - 60, @DesktopWidth, 30, $SS_CENTER)
  47.     GUICtrlSetFont($hDateLabel, 16)
  48.     GUICtrlSetColor($hDateLabel, 0xFFFFFF) ; 白色文字

  49.     ; 2. 问题显示区域
  50.     $hLabel = GUICtrlCreateLabel("请等待题目加载...", 100, 150, @DesktopWidth - 200, 100, $SS_CENTER)
  51.     GUICtrlSetFont($hLabel, 28, 800) ; 大号加粗字体
  52.     GUICtrlSetColor($hLabel, 0xFFFFFF) ; 白色文字

  53.     ; 3. 状态标签(显示回答正确/错误信息)
  54.     $hStatusLabel = GUICtrlCreateLabel("", 0, 280, @DesktopWidth, 40, $SS_CENTER)
  55.     GUICtrlSetFont($hStatusLabel, 16, 800)

  56.     ; 4. 答案输入框
  57.     $hInput = GUICtrlCreateInput("", (@DesktopWidth - 600)/2, 330, 600, 40, $ES_CENTER) ; 居中文本
  58.     GUICtrlSetFont($hInput, 24)
  59.     GUICtrlSetBkColor($hInput, 0x333333) ; 深灰色背景
  60.     GUICtrlSetColor($hInput, 0xFFFFFF) ; 白色文字

  61.     ; 5. 按钮区域
  62.     $hButtonPrev = GUICtrlCreateButton("上一题", (@DesktopWidth - 600)/2, 400, 150, 50)
  63.     GUICtrlSetFont($hButtonPrev, 14)

  64.     $hButtonSubmit = GUICtrlCreateButton("提交答案", (@DesktopWidth - 200)/2, 400, 200, 50, $BS_DEFPUSHBUTTON) ; 设置为默认按钮
  65.     GUICtrlSetFont($hButtonSubmit, 14)
  66.     GUICtrlSetBkColor($hButtonSubmit, 0x2C8DFF) ; 蓝色背景
  67.     GUICtrlSetColor($hButtonSubmit, 0xFFFFFF) ; 白色文字

  68.     $hButtonNext = GUICtrlCreateButton("下一题", (@DesktopWidth - 600)/2 + 450, 400, 150, 50)
  69.     GUICtrlSetFont($hButtonNext, 14)

  70.     ; 禁用系统快捷键(防止用户退出)
  71.     _DisableSystemShortcuts()

  72.     ; 设置键盘钩子(拦截系统快捷键)
  73.     $hCallback = DllCallbackRegister("_KeyboardProc", "long", "int;wparam;lparam")
  74.     $hKeyboardHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hCallback), _WinAPI_GetModuleHandle(0), 0)

  75.     ; 显示随机题目
  76.     _ShowRandomQuestion()

  77.     ; 显示窗口
  78.     GUISetState(@SW_SHOW, $hGUI)

  79.     ; 注册定时器更新日期时间(每秒更新一次)
  80.     AdlibRegister("_UpdateDateTime", 1000)
  81.     _UpdateDateTime() ; 立即更新一次

  82.     ; ==== 主消息循环 ====
  83.     While 1
  84.         $nMsg = GUIGetMsg()
  85.         Switch $nMsg
  86.             Case $GUI_EVENT_CLOSE
  87.                 ; 已禁用关闭按钮(不做任何操作)
  88.             Case $hButtonSubmit
  89.                 ; 检查答案
  90.                 If _CheckAnswer() Then
  91.                     GUICtrlSetData($hStatusLabel, "恭喜您回答正确!程序将退出。")
  92.                     GUICtrlSetColor($hStatusLabel, 0x00FF00) ; 绿色文字
  93.                     Sleep(2000)
  94.                     ExitLoop ; 退出循环
  95.                 Else
  96.                     GUICtrlSetData($hStatusLabel, "答案不正确,请重新回答!")
  97.                     GUICtrlSetColor($hStatusLabel, 0xFF0000) ; 红色文字
  98.                     GUICtrlSetData($hInput, "") ; 清空输入框
  99.                     GUICtrlSetState($hInput, $GUI_FOCUS) ; 聚焦输入框
  100.                 EndIf
  101.             Case $hButtonPrev
  102.                 ; 显示上一题
  103.                 _ShowPreviousQuestion()
  104.             Case $hButtonNext
  105.                 ; 显示下一题
  106.                 _ShowNextQuestion()
  107.         EndSwitch
  108.     WEnd

  109.     ; ==== 退出前清理 ====
  110.     _CleanUpResources()
  111.     Exit
  112. EndFunc

  113. ; ==== 功能函数 ====

  114. ; 更新日期时间显示(避免闪烁)
  115. Func _UpdateDateTime()
  116.     Static $sLastTime = "", $sLastDate = "" ; 静态变量保存上次值(优化性能)

  117.     ; 更新时间显示 (格式: 时:分:秒)
  118.     Local $sTime = StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC)

  119.     ; 更新日期和星期显示
  120.     Local $sWeek = _GetWeekday(@WDAY)
  121.     Local $sDate = @YEAR & "年" & @MON & "月" & @MDAY & "日  " & $sWeek

  122.     ; 仅当时间变化时更新
  123.     If $sTime <> $sLastTime Then
  124.         GUICtrlSetData($hTimeLabel, $sTime)
  125.         $sLastTime = $sTime
  126.     EndIf

  127.     ; 仅当日期变化时更新
  128.     If $sDate <> $sLastDate Then
  129.         GUICtrlSetData($hDateLabel, $sDate)
  130.         $sLastDate = $sDate
  131.     EndIf
  132. EndFunc

  133. ; 获取星期名称(根据数字1-7)
  134. Func _GetWeekday($iWday)
  135.     Switch $iWday
  136.         Case 1
  137.             Return "星期日"
  138.         Case 2
  139.             Return "星期一"
  140.         Case 3
  141.             Return "星期二"
  142.         Case 4
  143.             Return "星期三"
  144.         Case 5
  145.             Return "星期四"
  146.         Case 6
  147.             Return "星期五"
  148.         Case 7
  149.             Return "星期六"
  150.     EndSwitch
  151. EndFunc

  152. ; 键盘钩子处理函数(拦截系统快捷键)
  153. Func _KeyboardProc($nCode, $wParam, $lParam)
  154.     ; 必须调用下一个钩子
  155.     If $nCode < 0 Then
  156.         Return _WinAPI_CallNextHookEx($hKeyboardHook, $nCode, $wParam, $lParam)
  157.     EndIf

  158.     ; 解析键盘事件结构
  159.     Local $tKEYHOOKS = DllStructCreate("dword vkCode;dword scanCode;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
  160.     Local $vkCode = DllStructGetData($tKEYHOOKS, "vkCode")

  161.     ; 拦截特定按键
  162.     Switch $vkCode
  163.         Case 0x5B, 0x5C ; Win键
  164.             Return 1 ; 阻止按键传递
  165.         Case 0x09 ; Tab键
  166.             ; 检查Alt键是否按下(Alt+Tab组合)
  167.             If _WinAPI_GetKeyState(0x12) < 0 Then
  168.                 Return 1
  169.             EndIf
  170.         Case 0x1B ; Esc键
  171.             Return 1
  172.         Case 0x73 ; F4键
  173.             ; 检查Alt键是否按下(Alt+F4组合)
  174.             If _WinAPI_GetKeyState(0x12) < 0 Then
  175.                 Return 1
  176.             EndIf
  177.         Case 0x0D ; 回车键
  178.             ; 当焦点在输入框时,点击提交按钮
  179.             If ControlGetFocus($hGUI) = "Edit1" Then
  180.                 GUICtrlSendMsg($hButtonSubmit, $BM_CLICK, 0, 0)
  181.                 Return 1 ; 阻止默认回车行为
  182.             EndIf
  183.     EndSwitch

  184.     ; 传递其他按键
  185.     Return _WinAPI_CallNextHookEx($hKeyboardHook, $nCode, $wParam, $lParam)
  186. EndFunc

  187. ; 清理资源(退出时调用)
  188. Func _CleanUpResources()
  189.     ; 取消定时器
  190.     AdlibUnRegister("_UpdateDateTime")

  191.     ; 卸载键盘钩子
  192.     If $hKeyboardHook Then
  193.         _WinAPI_UnhookWindowsHookEx($hKeyboardHook)
  194.     EndIf

  195.     ; 释放回调函数
  196.     If $hCallback Then
  197.         DllCallbackFree($hCallback)
  198.     EndIf

  199.     ; 恢复系统快捷键
  200.     HotKeySet("{ESC}")
  201.     HotKeySet("!{F4}")
  202.     HotKeySet("!{TAB}")

  203.     ; 删除GUI
  204.     GUIDelete($hGUI)
  205. EndFunc

  206. ; 禁用系统快捷键
  207. Func _DisableSystemShortcuts()
  208.     HotKeySet("{ESC}", "_DoNothing")
  209.     HotKeySet("!{F4}", "_DoNothing") ; Alt+F4
  210.     HotKeySet("!{TAB}", "_DoNothing") ; Alt+Tab
  211. EndFunc

  212. ; 空函数(用于禁用快捷键)
  213. Func _DoNothing()
  214.     ; 不执行任何操作
  215. EndFunc

  216. ; 设置开机自启动(写入注册表)
  217. Func _SetAutoStart()
  218.     ; 检查是否已存在注册表项
  219.     If Not RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "StudyTool") Then
  220.         ; 写入当前程序路径
  221.         RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "StudyTool", "REG_SZ", @ScriptFullPath)
  222.     EndIf
  223. EndFunc

  224. ; 从INI文件加载题目
  225. Func _LoadQuestionsFromINI()
  226.     Local $aResult[0][2] ; 初始化结果数组 [问题, 答案]
  227.     Local $sIniFile = @ScriptDir & "\questions.ini" ; INI文件路径

  228.     ; 如果文件不存在,创建示例文件
  229.     If Not FileExists($sIniFile) Then
  230.         _CreateSampleIni($sIniFile)
  231.     EndIf

  232.     ; 读取文件内容
  233.     Local $sContent = FileRead($sIniFile)
  234.     If @error Then Return $aResult ; 读取失败返回空数组

  235.     ; 按行分割内容
  236.     Local $aLines = StringSplit($sContent, @CRLF, $STR_ENTIRESPLIT + $STR_NOCOUNT)

  237.     Local $sCurrentSection = "" ; 当前INI节名
  238.     Local $sLastQuestion = "" ; 临时存储问题

  239.     ; 逐行解析INI文件
  240.     For $i = 0 To UBound($aLines) - 1
  241.         ; 跳过空行
  242.         If StringStripWS($aLines[$i], $STR_STRIPALL) = "" Then ContinueLoop

  243.         ; 检查是否是节头(例如 [古诗])
  244.         If StringLeft($aLines[$i], 1) = "[" And StringRight($aLines[$i], 1) = "]" Then
  245.             $sCurrentSection = StringMid($aLines[$i], 2, StringLen($aLines[$i]) - 2)
  246.             ContinueLoop
  247.         EndIf

  248.         ; 解析键值对
  249.         Local $iPos = StringInStr($aLines[$i], "=")
  250.         If $iPos > 1 Then
  251.             Local $sKey = StringStripWS(StringLeft($aLines[$i], $iPos - 1), $STR_STRIPTRAILING + $STR_STRIPLEADING)
  252.             Local $sValue = StringStripWS(StringMid($aLines[$i], $iPos + 1), $STR_STRIPTRAILING + $STR_STRIPLEADING)

  253.             ; 处理问题行(纯数字键)
  254.             If StringIsDigit($sKey) Then
  255.                 $sLastQuestion = $sValue
  256.             ; 处理答案行(A+数字键)
  257.             ElseIf StringLeft($sKey, 1) = "A" And StringIsDigit(StringMid($sKey, 2)) And $sLastQuestion <> "" Then
  258.                 ; 添加到结果数组
  259.                 ReDim $aResult[UBound($aResult) + 1][2]
  260.                 $aResult[UBound($aResult) - 1][0] = $sLastQuestion
  261.                 $aResult[UBound($aResult) - 1][1] = $sValue
  262.                 $sLastQuestion = "" ; 重置问题
  263.             EndIf
  264.         EndIf
  265.     Next

  266.     Return $aResult
  267. EndFunc

  268. ; 创建示例INI文件(当questions.ini不存在时)
  269. Func _CreateSampleIni($sFilePath)
  270.     Local $hFile = FileOpen($sFilePath, $FO_OVERWRITE + $FO_UTF8)
  271.     If $hFile = -1 Then Return

  272.     ; 写入示例内容
  273.     FileWrite($hFile, "[古诗]" & @CRLF)
  274.     FileWrite($hFile, "1=床前明月光的下一句是什么?" & @CRLF)
  275.     FileWrite($hFile, "A1=疑是地上霜" & @CRLF)
  276.     FileWrite($hFile, "2=举头望明月的下一句是什么?" & @CRLF)
  277.     FileWrite($hFile, "A2=低头思故乡" & @CRLF)
  278.     FileWrite($hFile, "3=春眠不觉晓的下一句是什么?" & @CRLF)
  279.     FileWrite($hFile, "A3=处处闻啼鸟" & @CRLF & @CRLF)

  280.     FileWrite($hFile, "[数学]" & @CRLF)
  281.     FileWrite($hFile, "1=25 × 4 ÷ 2 = ?" & @CRLF)
  282.     FileWrite($hFile, "A1=50" & @CRLF)
  283.     FileWrite($hFile, "2=(18 + 7) × 3 = ?" & @CRLF)
  284.     FileWrite($hFile, "A2=75" & @CRLF)
  285.     FileWrite($hFile, "3=144 的平方根是多少?" & @CRLF)
  286.     FileWrite($hFile, "A3=12" & @CRLF & @CRLF)

  287.     FileWrite($hFile, "[常识]" & @CRLF)
  288.     FileWrite($hFile, "1=中国的首都是哪个城市?" & @CRLF)
  289.     FileWrite($hFile, "A1=北京" & @CRLF)
  290.     FileWrite($hFile, "2=太阳系中最大的行星是?" & @CRLF)
  291.     FileWrite($hFile, "A2=木星" & @CRLF)

  292.     FileClose($hFile)
  293. EndFunc

  294. ; 显示随机题目
  295. Func _ShowRandomQuestion()
  296.     $iCurrentQuestion = Random(0, UBound($aQuestions) - 1, 1)
  297.     _ShowQuestion($iCurrentQuestion)
  298. EndFunc

  299. ; 显示上一题
  300. Func _ShowPreviousQuestion()
  301.     If $iCurrentQuestion > 0 Then
  302.         $iCurrentQuestion -= 1
  303.     Else
  304.         ; 循环到最后一条
  305.         $iCurrentQuestion = UBound($aQuestions) - 1
  306.     EndIf
  307.     _ShowQuestion($iCurrentQuestion)
  308. EndFunc

  309. ; 显示下一题
  310. Func _ShowNextQuestion()
  311.     If $iCurrentQuestion < UBound($aQuestions) - 1 Then
  312.         $iCurrentQuestion += 1
  313.     Else
  314.         ; 循环到第一条
  315.         $iCurrentQuestion = 0
  316.     EndIf
  317.     _ShowQuestion($iCurrentQuestion)
  318. EndFunc

  319. ; 显示指定索引的题目
  320. Func _ShowQuestion($iIndex)
  321.     ; 更新问题标签
  322.     GUICtrlSetData($hLabel, $aQuestions[$iIndex][0])
  323.     ; 保存正确答案
  324.     $sCurrentAnswer = $aQuestions[$iIndex][1]
  325.     ; 清空输入框和状态标签
  326.     GUICtrlSetData($hInput, "")
  327.     GUICtrlSetData($hStatusLabel, "")
  328.     ; 聚焦输入框
  329.     GUICtrlSetState($hInput, $GUI_FOCUS)
  330.     ; 更新窗口标题显示进度
  331.     WinSetTitle($hGUI, "", "学习工具 - 题目 " & ($iIndex + 1) & "/" & UBound($aQuestions))
  332. EndFunc

  333. ; 检查答案是否正确
  334. Func _CheckAnswer()
  335.     ; 获取并清理用户答案(去除空格)
  336.     Local $sUserAnswer = StringStripWS(GUICtrlRead($hInput), $STR_STRIPALL)
  337.     ; 与正确答案比较
  338.     Return ($sUserAnswer == $sCurrentAnswer)
  339. EndFunc
复制代码

下载链接:

主链接:https://www.123912.com/s/iINuVv-YRUBd 提取码:tdoi
备链接:https://www.123865.com/s/iINuVv-YRUBd 提取码:tdoi



回复

使用道具 举报

13#
发表于 半小时前 | 只看该作者
楼上的程序可以试试
回复

使用道具 举报

14#
发表于 半小时前 | 只看该作者
楼上的楼上牛C
回复

使用道具 举报

15#
发表于 22 分钟前 | 只看该作者
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-7-31 11:12

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表