我正在开发一个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);
}
问题:
答案 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 看起来这样可行......