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

标签 java windows windows-services jintellitype

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

为了实现全局热键,我使用了 Jintellitype我也曾参与过JNativeHook作为备份解决方案,以防第一个库中有东西掉落。

现在我的要求是,即使在锁定屏幕和注销屏幕上,这也应该起作用,根据我的理解,只有当应用程序作为 Windows 服务运行时,应用程序才能在注销屏幕中运行。

对于 Windows 服务,我使用了“高级安装程序”并遵循这些 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 无法实现此要求吗?
  • 我还应该使用其他方法或技术来实现这一目标吗?

最佳答案

我目前正在解决类似的问题:在登录屏幕上运行自己的应用程序。 但是,在此之前,让我解释一下存在哪些问题。 "new"(自 Vista 起)Windows 安全模型的主要问题:现在所有服务都在自己的 session 中运行,并且该 session 无法访问用户 session (GUI 和热键也是如此)。系统服务在登录时运行 - 但它们不能在那里执行任何操作。我只找到了一个危险的解决方案:使用某种 LogonUI.exe Hook 。可以通过此注册表项来完成:

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。这允许运行任何程序并在登录屏幕、锁定屏幕、拦截重新启动、 sleep 、注销时显示任何内容。但如果操作系统为 x64,则应用程序必须为 x64。

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

现在我让它在 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 看起来这可以工作...

关于java - Windows 锁定屏幕和注销屏幕上的全局热键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790405/

相关文章:

java - 通过Web服务从服务器向客户端发送pdf文件

c++ - FindFirstFile/FindNextFile API 对缓存结果是否返回?

c# - 密集分布式 C# (WCF) 架构设计

windows - MSI 安装程序错误 - MSIExec 失败 : 1603

java - Android:TabLayout如何以编程方式设置height = 0?

java - 为什么我应该使用 java 和 php

Java:实现 "repeat until no change"集合

java - MulticastSocket 失败后没有响应

windows - Mercurial 可以从 Windows 创建自己的符号链接(symbolic link)格式吗?

c# - 自动启动时将参数传递给Windows服务