java - 用于 java kiosk 应用程序的 windows shell

标签 java windows windows-shell kiosk

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

有谁知道如何编写windows shell

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

或者您还有其他实现方法吗?

谢谢

最佳答案

由于我试图完成的事情很复杂,到目前为止还没有人回答,我将根据我实现的事情自己回答这个问题。

为了能够从桌面启动我的应用程序(桌面不存在,因为我不得不删除它)我尝试实现一种任务栏。我实现了一个 SWT 对话框,只有一个菜单栏和一个 shell 高度为零

....
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我把它放在用户初始化 key 中。

我使用了 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用于安装 key 钩和 http://www.kbdedit.com/manual/low_level_vk_list.htmlhttp://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx对于虚拟键映射。当用户使用菜单栏中的管理员项登录时,我通过同一个 dll 再次启用所有内容并停用 Hook 。注销管理员会再次激活所有内容。

总结一下:

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

我希望这对其他搜索相同内容的人有用。我上面解释的是在 windows xp sp3 上测试的并且工作正常。

关于java - 用于 java kiosk 应用程序的 windows shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15222016/

相关文章:

shell - 用于 UNIX shell 命令替换的 WIndows 批处理模拟

windows - 以编程方式最小化/恢复窗口跳过动画效果

java - RandomStringUtils - 不为每个测试场景生成唯一的字符串

explorer - 如何告诉 Windows 资源管理器不要请求某些文件夹中的文件详细信息和缩略图?

java - Java 将 double 拆分为数组

windows - iExpress 与 Windows 7、32 位不兼容?

java - 如何在java中查找在端口号上运行的进程的进程ID

c++ - 如何检测多显示器系统上的最大化事件

java - JBoss 中带注释的 WS

java - 作用域 bean 应如何在 Hazelcast 中触发 session 创建