Windows锁定屏幕和注销屏幕上的Global HotKey?

时间:2016-03-04 07:30:57

标签: java windows windows-services jintellitype

我正在开发一个Java非GUI客户端,它可以在Windows操作系统中捕获全局热键并执行某些功能。

为了实现全球热键,我使用了Jintellitype而且我还使用JNativeHook作为备份解决方案,万一有些内容属于第一个库。

现在我的要求是,即使在Lock screen&注销屏幕,根据我的理解,只有当应用程序作为Windows服务运行时,应用程序才能在注销屏幕上运行。

对于Windows服务,我使用过“Advanced Installer”&遵循这些steps

现在,当我将我的应用程序作为Windows服务运行时,它无法使用热键。相同的应用程序,如果我正常运行而不是Windows服务,它可以使用热键。

要验证这是否有效,我将通过以下代码将所有system.out转移到文件中:

public static PrintStream out;    
try {
      out = new PrintStream(new FileOutputStream("C:\\"+"output.txt"));
      System.setOut(out);
} catch (FileNotFoundException ex) {
      System.out.println(ex);
}

问题:

  • 我在这里错过了什么?
  • Windows无法满足此要求吗?
  • 我应该使用其他方法或技术来实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

我目前正在处理类似的问题:在登录屏幕上运行自己的应用程序。 但是,在此之前,让我解释一下这些问题。 " new"(自Vista)windows安全模型的主要问题:现在所有服务都在自己的会话中运行,并且此会话无法访问用户会话(GUI和热键也是如此)。系统服务在登录时运行 - 但他们无法在那里做任何事情。我只发现了一个危险的解决方案:使用某种钩子来登录LogonUI.exe。可以通过此注册表项完成:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LogonUI.exe
Value: Debugger="C:\path\application.exe"

在system32文件夹(LogonUIO.exe)中复制LogonUI.exe。然后,此应用程序获取自己的命令行参数,并使用此参数运行LogonUIO.exe。这允许运行任何程序并在登录屏幕,锁定屏幕,拦截重启,睡眠,注销时显示任何内容。但是如果OS x64,应用程序必须是x64。

这是一个危险的密钥 - 如果您没有来自其他操作系统的系统备份或注册表/磁盘访问,或者这不是VM,请不要尝试使用它。在调试如何使其工作时,我已经打破了几个操作系统(仅限虚拟机)。

现在我让它在Windows 10和Windows Server 2016中运行稳定。在Windows 8中这还不行 - 我现在正在调试它。

对于一个问题,我仍然没有找到解决方案:它有一些奇怪的命令行和一些奇怪的数字:

/flags:0x0 /state0:0xa3a29055 /state1:0x41c64e6d
/flags:0x0 /state0:0xa3a32055 /state1:0x41c64e6d
/flags:0x0 /state0:0xa3a35055 /state1:0x41c64e6d
/flags:0x0 /state0:0xa3a37055 /state1:0x41c64e6d
/flags:0x0 /state0:0xa3a38855 /state1:0x41c64e6d

在Windows 7和Vista中,可以通过简单的方式完成相同的操作 - 通过下一个注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Userinit="C:\path\application.exe"

在Windows 10中,这不起作用。

所以,在你的情况下,你可以尝试这样的事情。

更新1

找到此链接,其中包含此安全模型的更详细说明:http://www.coretechnologies.com/WindowsServices/FAQ.html#GUIServices

更新2

还有一个:http://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-and-bit-Archite 看起来这样可行......