用于 java kiosk 应用程序的 windows shell

Posted

技术标签:

【中文标题】用于 java kiosk 应用程序的 windows shell【英文标题】:windows shell for java kiosk application 【发布时间】:2013-02-19 17:58:09 【问题描述】:

我在 SWT 中开发了一个 java 应用程序,它应该在作为 kiosk 运行的 Windows 系统上运行。该应用程序应该是系统中运行的唯一应用程序,并且应该在系统启动后立即打开。应该禁用任务管理器、Windows 开始菜单、热键等所有功能(例如,请参阅http://www.codeproject.com/Articles/7392/Lock-Windows-Desktop)。该应用程序还有一个内置管理员用户,可以再次激活所有东西,并有可能在系统中进行更改。这些东西已经实现了。问题是,当 Windows 启动时,它会持续几秒钟直到应用程序打开,并且在这很短的时间内,用户可以看到所有内容(在应用程序启动之前没有任何内容被禁用)。我搜索了互联网,唯一的解决方案似乎是替换注册表中的标准 Windows shell。现在问题来了:

有谁知道如何写一个 windows 的shell

    使我能够在启动时停用所有内容 让我在桌面上放置应用程序的快捷方式,以便用户打开应用程序 让我在我的应用程序中为管理员用户激活停用的功能

或者你有什么其他的想法可以做到这一点吗?

谢谢

【问题讨论】:

应用程序应该只是应用程序运行?科幻小说。 :-) 也许只有可见的应用程序。 我想说用户不应该能够打开任何其他应用程序,除非他通过我的应用程序中的相应按钮以应用程序的管理员身份登录。 或者,放弃 Windows,安装 Linux,然后[参考这个问题][1] [1]:***.com/questions/7831103/… 【参考方案1】:

由于我尝试完成的事情很复杂,直到现在没有人回答,我将根据我实现的事情自己回答这个问题。

为了有可能从桌面启动我的应用程序(由于我不得不删除它,所以它不存在)我尝试实现一种任务栏。我实现了一个 SWT 对话框,其中只有一个菜单栏和一个零外壳高度

....
WindowsSystemUtility.disableWindowsFunctionality(true);

shell = new Shell(getParent(), getStyle());

createMenu();

shell.layout();
shell.pack();   

Rectangle screenBounds = getParent().getMonitor().getBounds();
int monitorWidth = screenBounds.width;
int monitorHeight = screenBounds.height;
//System.out.println(monitorWidth + ", " + monitorHeight);

int dialogWidth = monitorWidth;
int dialogHeight = 0;   //height 0 - > shell has no height. only menu is shown
Rectangle shellBounds = shell.computeTrim(0, 0, dialogWidth, dialogHeight);
shell.setSize(shellBounds.width, shellBounds.height);

//place the dialog
int x = 0;
int y = 0;  //position north
//int y = monitorHeight - dialogHeight; //position south
shell.setLocation(x, y);

shell.open();
....

正如您所见,当此应用程序打开时,它会尝试禁用所有 Windows 功能,然后再启动。在对话框的菜单栏中,我放置了 1 个带有 2 个菜单项的菜单。一个用于启动我的应用程序,另一个用于管理员。生成了一个 jar,从 jar 中制作了一个 exe,并基于链接 http://technet.microsoft.com/en-us/library/cc939862.aspx 我把它放在 userinit 键中。

我使用http://www.codeproject.com/Articles/7392/Lock-Windows-Desktop 中的 dll 生成的 java 代码来禁用 Windows 功能,如任务栏、时钟、任务管理器等,以及用于安装密钥挂钩的链接 http://umang-world.blogspot.de/2012/02/is-it-is-possible-to-disable-windows.html 和用于虚拟的 http://www.kbdedit.com/manual/low_level_vk_list.html 和 http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx关键地图。当用户使用菜单栏中的管理员项登录时,我通过相同的 dll 再次启用所有内容并停用挂钩。注销管理员会再次激活一切。

总结一下:

    使我能够在启动时停用所有内容 覆盖 Windows 注册表中的 userinit 键以停用桌面并使我的应用程序在 Windows 启动后立即启动,而不会延迟 任务栏启动时(我实现的 swt 对话框) 杀死 explorer.exe 使用 dll 禁用 Windows 应用程序 安装 keyhook 以禁用键盘按键 让我在桌面上放置应用程序的快捷方式,以便用户可以打开应用程序 任务栏中的菜单项 让我在我的应用程序中为管理员用户激活停用的功能 如果管理员通过菜单项登录 启动 explorer.exe 使用 dll 启用 Windows 应用程序 停止键钩以启用键盘键

我希望这对其他搜索相同内容的人有用。我上面解释的内容是在 windows xp sp3 上测试的,效果很好。

【讨论】:

【参考方案2】:

我已将 Windows shell 更改为注册表中我的应用程序的启动器,而不是资源管理器,唯一有效的快捷方式是 ctrl-alt-del

以管理员身份运行 regedit

这将启动 cmd 而不是 explorer reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /v Shell /t REG_SZ /d cmd.exe /f

Shell 值编辑为c:\path\to\your\runMyShell.bat

所以只需放置一个脚本而不是像“runMyShell.bat”这样的资源管理器

@echo off
rem some Tasks To Be Done Before Custom Shell Loads
java -jar myshell.jar

要从 control-alt-del 中删除任务管理器:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 1 /f

【讨论】:

以上是关于用于 java kiosk 应用程序的 windows shell的主要内容,如果未能解决你的问题,请参考以下文章

如何在KIOSK模式下打开基于Java的Web应用程序?

iPad 中用于 Kiosk 类型 WebApp 的 URL 架构 - 需要有回调

用于Raspberry Pi的Tkinter / Canvas-based kiosk-like程序

ES-windos环境搭建

Android 11 - Kiosk 模式锁屏 NFC 问题

Angular 1.4.9 方法不适用于 IOS