Java Windows锁定屏幕和注销屏幕上的全局热键?

Java Windows锁定屏幕和注销屏幕上的全局热键?,java,windows,windows-services,jintellitype,Java,Windows,Windows Services,Jintellitype,我正在开发一个Java非GUI客户端,它可以捕获windows操作系统中的全局热键并执行某些功能 为了实现全局热键,我曾经使用过,也曾经作为备份解决方案进行过研究,以防第一个库中出现问题 现在,我的要求是,即使在锁定屏幕和注销屏幕上,这也应该起作用,据我所知,只有当应用程序作为windows服务运行时,它才能在注销屏幕上运行 对于Windows服务,我使用了“高级安装程序”&遵循以下步骤 现在,当我以windows服务运行我的应用程序时,它无法接受热键。同样的应用程序,如果我运行正常,而不是wi

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

为了实现全局热键,我曾经使用过,也曾经作为备份解决方案进行过研究,以防第一个库中出现问题

现在,我的要求是,即使在锁定屏幕和注销屏幕上,这也应该起作用,据我所知,只有当应用程序作为windows服务运行时,它才能在注销屏幕上运行

对于Windows服务,我使用了“高级安装程序”&遵循以下步骤

现在,当我以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不可能满足此要求吗
  • 我是否应该使用其他方法或技术来实现这一点

我目前正在处理类似的问题:在登录屏幕上运行自己的应用程序。 但是,在此之前,让我解释一下问题是什么。“新”(自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"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Userinit="C:\path\application.exe"
并在system32文件夹(LogonUIO.exe)中复制LogonUI.exe。然后,此应用程序将获得自己的命令行参数,并使用此参数运行LogonUIO.exe。这允许运行任何程序并在登录屏幕、锁定屏幕、拦截重新启动、睡眠和注销时显示任何内容。但若操作系统为x64,则应用程序必须为x64

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

现在,我让它在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中,同样可以通过非常简单的方式完成-通过下一个注册表项:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LogonUI.exe
Value: Debugger="C:\path\application.exe"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Userinit="C:\path\application.exe"
在windows 10中,这将不起作用

所以,在你的情况下,你可以试试这样的东西

更新1

找到此链接,其中包含此安全模型的更详细描述:

更新2

还有一点:
看起来这可以工作…

我目前正在处理类似的问题:在登录屏幕上运行自己的应用程序。 但是,在此之前,让我解释一下问题是什么。“新”(自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"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Userinit="C:\path\application.exe"
并在system32文件夹(LogonUIO.exe)中复制LogonUI.exe。然后,此应用程序将获得自己的命令行参数,并使用此参数运行LogonUIO.exe。这允许运行任何程序并在登录屏幕、锁定屏幕、拦截重新启动、睡眠和注销时显示任何内容。但若操作系统为x64,则应用程序必须为x64

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

现在,我让它在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中,同样可以通过非常简单的方式完成-通过下一个注册表项:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LogonUI.exe
Value: Debugger="C:\path\application.exe"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Userinit="C:\path\application.exe"
在windows 10中,这将不起作用

所以,在你的情况下,你可以试试这样的东西

更新1

找到此链接,其中包含此安全模型的更详细描述:

更新2

还有一点:
看起来这样可以工作…

查看此线程中发布的链接。在这里,您可以找到有关
交互式服务问题的信息。我知道Windows服务在拥有GUI方面有限制,但我的应用程序不是GUI应用程序。如果按下,它将捕获热键并打印日志。确定。你的问题中没有提到这一点。但是很抱歉,我无法使用非GUI Windows服务拦截键盘输入。谢谢,我将编辑我的问题。请查看此线程中发布的链接。在这里,您可以找到有关
交互式服务问题的信息。我知道Windows服务在拥有GUI方面有限制,但我的应用程序不是GUI应用程序。如果按下,它将捕获热键并打印日志。确定。你的问题中没有提到这一点。但是,很抱歉,对于用非GUI的Windows服务截取键盘输入,我无能为力。谢谢,我将编辑我的问题。我刚刚使用了另外两种方法将java应用程序作为Windows服务运行,“Procrun”和“java Windows服务包装器”,您尝试过这些方法吗?这有可能解决我的问题吗?我已经尝试过服务:系统服务不能有GUI-即使它们创建GUI,它也会被隐藏,无法访问。交互服务也没用。也许其他人可以分享更多的经验。我同意你对GUI应用程序的看法,我也尝试过同样的方法,如果你作为服务运行,GUI就会隐藏起来。但在这里,应用程序是非GUI的,它必须与操作系统交互的唯一功能是收集热键。哪一个有用