关机 / 重启 / 注销 需管理员权限。退出应用将还原所有系统设置后关闭 Kiosk。
WinKioskCCCC(Windows Kiosk Secure Desktop)是一个运行于 Windows 10/11 的 Kiosk 模式应用程序。 它通过低级别键盘钩子、注册表策略和系统命令实现设备锁定, 仅允许管理员配置的白名单应用运行,适用于公共查询终端、数字标牌、自助服务机等场景。
| 类别 | 技术 | 说明 |
|---|---|---|
| 运行时 / SDK | .NET 10.0 | 目标框架 net10.0-windows |
| UI 框架 | Windows Forms (WinForms) | 原生 Windows 桌面 GUI |
| 编程语言 | C# (v10+) | 启用 Nullable 引用类型 |
| 配置格式 | JSON | System.Text.Json 序列化 kiosk_config.json |
| 日志系统 | 自定义文件日志 | kiosk_YYYYMMDD.log 日期滚动日志 |
| 注册表 API | Microsoft.Win32.Registry | 读写 HKCU / HKLM |
| 键盘钩子 | Win32 P/Invoke (user32.dll) | WH_KEYBOARD_LL 全局低级别键盘钩子 |
| 窗口钩子 | Win32 P/Invoke (user32.dll) | SetWinEventHook 前台窗口监控 |
| 进程管理 | System.Diagnostics.Process | 启动白名单应用、重启 Explorer |
| 系统命令 | powercfg / netsh / PowerShell | 电源管理、网络硬件控制 |
| OS 兼容 | Windows 10/11 (21H2+), LTSC | 家庭版部分受限 |
※ 本项目的所有依赖均为 .NET 内建库和 Windows 系统工具,零外部 NuGet 包依赖。
进入设置页需要管理员密码验证。默认密码:0000(可在设置中修改)。
密码通过 PasswordChar 遮蔽输入,存储在 kiosk_config.json 中。
另有超级管理员后门(标题点击 20 次 + 独立密码)用于维护场景。
使用 FormBorderStyle = None + WindowState = Maximized 覆盖整个屏幕。
顶部栏显示应用标题与帮助、设置按钮(设置需管理员密码验证)。中间区域展示白名单应用图标,点击通过 ShellExecute 启动。
| 快捷键 | 效果 |
|---|---|
| Win 键(单独及组合) | 阻止打开开始菜单 / Win+R / Win+E / Win+D 等 |
| Alt+Tab | 阻止切换窗口 |
| Alt+F4 | 阻止关闭窗口 |
| Alt+Esc | 阻止切换窗口 |
| Ctrl+Esc | 阻止打开开始菜单 |
| Ctrl+Shift+Esc | 阻止打开任务管理器 |
通过 WH_KEYBOARD_LL 全局钩子实现,比注册表屏蔽更底层,无法被绕过。每个按键可单独开关。
使用 SetWinEventHook 监听 EVENT_SYSTEM_FOREGROUND 事件。
当非白名单应用窗口获得前台焦点时,自动发送 WM_CLOSE 消息关闭它并重新激活 Kiosk 窗口。
白名单应用启动的进程及其子进程通过 HashSet<int> 跟踪,不会被误关闭。
| 设置 | 注册表路径 |
|---|---|
| 禁用任务栏 | HKCU\...\Policies\Explorer\NoTaskbar = 1 |
| 禁用系统托盘 | HKCU\...\Policies\Explorer\NoTrayItemsDisplay = 1 |
| 禁用任务管理器 | HKCU\...\Policies\System\DisableTaskMgr = 1 |
| 屏蔽 Toast 通知 | HKCU\...\PushNotifications\ToastEnabled = 0 |
设置后重启 explorer.exe 使任务栏隐藏立即生效。程序退出时全部还原。
| 设置 | 注册表路径 | 效果 |
|---|---|---|
| 禁用锁屏 | System\DisableLockWorkstation | Ctrl+Alt+Del 隐藏"锁定" |
| 禁用切换用户 | System\HideFastUserSwitching | 阻止切换账户 |
| 隐藏注销 | Explorer\NoLogOff | Ctrl+Alt+Del 隐藏"注销" |
| 禁用修改密码 | System\DisableChangePassword | Ctrl+Alt+Del 隐藏"更改密码" |
| 隐藏安全中心图标 | Defender Security Center\Systray\HideSystray (HKLM) | 1 隐藏,0 显示 |
| 禁用屏保密码 | Control Panel\Desktop\ScreenSaverIsSecure = 0 | 唤醒无需密码 |
所有注册表写入操作前备份原始值,退出时逐一还原,确保系统非破坏性修改。
| 设置 | 实现方式 | 效果 |
|---|---|---|
| 开机自启动 | 计划任务 (schtasks) + ONLOGON 触发器 | 最高权限静默自启,不弹 UAC |
通过"最高权限"计划任务实现开机静默自启,登录后自动拉起已提权的 Kiosk 进程,全程无需用户干预。关闭后仅移除登录触发器,任务本身保留以便手动启动时静默提权。
| 设置 | 命令 | 效果 |
|---|---|---|
| 禁止休眠 | powercfg /h off | 禁用系统休眠功能 |
| 空闲睡眠超时 | powercfg /change standby-timeout-ac/dc | 可配置 0-1440 分钟 |
退出时恢复默认睡眠超时 (AC 30min / DC 15min) 并重新启用休眠。
| 硬件 | 命令 | 效果 |
|---|---|---|
| WiFi | netsh interface set interface "Wi-Fi" admin=enable/disable | 禁用/启用 WiFi 网卡 |
| 蓝牙 | PowerShell Get-PnpDevice -Class Bluetooth | Disable-PnpDevice | 禁用/启用蓝牙设备 |
| 移动网络 (4G) | netsh mbn set interface * admin=enable/disable | 禁用/启用 4G 模块 |
退出时自动恢复所有被禁用的硬件。
白名单应用显示在桌面中央,由管理员在设置中填写应用名称与绝对路径。点击图标通过 Process.Start + ShellExecute = true 启动。
可添加/移除/恢复默认应用。默认包含:计算器、记事本、Edge 浏览器。
完整支持中文 (zh-CN) 和英文 (en-US) 双语切换。60+ 个翻译字符串覆盖所有 UI 标签、消息、按钮文本。
通过 LangHelper.cs 字典实现,语言切换后需重启生效。
所有设置通过 AppConfig.cs 序列化为 kiosk_config.json(位于 exe 同级目录)。
启动时自动加载,每次修改设置自动保存。
日期滚动日志文件 kiosk_YYYYMMDD.log。六种日志级别:INIT INFO WARN ERROR APPLY RESTORE。
线程安全,记录启动、配置加载、注册表操作、电源管理、退出与还原全过程。
启动流程: 1. AppLogger.Init() — 初始化日志系统 2. AppConfig.Load() — 读取 kiosk_config.json 3. SystemLockdown.ApplyAll() — 应用所有注册表策略 & 电源管理 & 开机自启 4. RefreshHooks() — 安装键盘钩子 + WinEvent 钩子 5. ApplyDefaultSettings() — 屏蔽任务栏 / 任务管理器 / 通知 6. RefreshAppLauncher() — 渲染白名单应用图标 退出流程: 1. UnhookWindowsHookEx() — 卸载键盘钩子 2. UnhookWinEvent() — 卸载窗口钩子 3. RestoreSystemSettings() — 还原任务栏 / 任务管理器 / 通知 4. SystemLockdown.RestoreAll() — 遍历备份逐项还原所有注册表 & 电源设置 5. AppConfig.Save() — 持久化当前配置到磁盘
WinKioskCCCC/ ├── Program.cs # 应用入口 — Application.Run(new KioskForm()) ├── KioskForm.cs # 主界面 — 全屏桌面 + 应用启动器 + 键盘钩子 ├── SettingsForm.cs # 设置页面逻辑 ├── SettingsForm.Designer.cs # 设置页面布局 (TableLayoutPanel) ├── AppInfo.cs # 应用信息数据模型 (Name/NameEn/Path/Icon) ├── AppConfig.cs # JSON 配置持久化 (Load/Save) ├── AppLogger.cs # 磁盘日志记录 (日期滚动, 线程安全) ├── SystemLockdown.cs # 注册表锁定 + 电源管理 + 注册表备份恢复 ├── LangHelper.cs # 中英双语字典 + 语言切换 ├── PasswordDialog.cs # 独立密码验证对话框 └── WinKioskCCCC.csproj # SDK 风格项目文件 (net10.0-windows)
SystemLockdown 在每次设置注册表之前保存原始值:
RegistryBackup 结构: Hive: CurrentUser / LocalMachine KeyPath: 注册表路径 ValueName: 值名称 OriginalValue: 原始数据 Kind: 值类型 (DWord / String) Existed: 修改前是否存在 恢复逻辑: - 若原值存在 → 还原为原值 - 若原值不存在 → 删除该值
dotnet build 即可编译| 操作系统 | 支持 | 备注 |
|---|---|---|
| Windows 10 21H2+ | ✅ 完全支持 | 全部功能正常 |
| Windows 11 21H2+ | ✅ 完全支持 | 全部功能正常 |
| Windows 10/11 LTSC | ✅ 支持 | Shell Launcher 模式可用 |
| Windows 家庭版 | ⚠️ 部分支持 | 部分 GPO 无效(注册表仍生效) |