5

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

有谁知道如何为windows编写一个shell

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

或者你有任何其他想法如何做到这一点?

谢谢

4

2 回答 2

4

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

为了有可能从桌面启动我的应用程序(由于我不得不删除它而不存在),我尝试实现一种任务栏。我实现了一个 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.htmlhttp:// /msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx用于虚拟键映射。当用户使用菜单栏中的管理员项登录时,我通过相同的 dll 再次启用所有内容并停用挂钩。注销管理员会再次激活一切。

所以总结一下:

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

我希望这对其他寻找相同事物的人有用。我上面解释的内容在 windows xp sp3 上进行了测试并且工作正常。

于 2013-03-28T16:04:35.420 回答
0

我已将 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
于 2021-03-03T08:22:50.360 回答