2016-03-04 148 views
1

我正在研究一个Java非GUI客户端,它可以捕获Windows操作系统中的Global热键并执行某些功能。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); 
} 

问题:

  • M I失去了一些东西?
  • 这个要求不适用于Windows吗?
  • 有没有其他方法或技术可以用来实现这个目标?
+0

看看这个帖子中发布的链接[launch-an-exe-f ROM-procrun](http://stackoverflow.com/questions/35765273/launching-an-exe-from-procrun)。您可以通过'交互式服务'找到有关问题的信息。 – SubOptimal

+0

我明白Windows服务在GUI中有限制,但我的应用程序不是GUI应用程序。它只会捕获热键,如果按下并打印日志。 –

+0

好的。你的问题中没有提到这一点。但对不起,为了拦截非GUI Windows服务的键盘输入,我忍不住。 – SubOptimal

回答

0

我目前正在解决类似问题:在登录屏幕上运行自己的应用程序。但是,在此之前,让我解释一下有什么问题。 “新”(自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" 

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

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

现在,我使它在Windows 10和Windows服务器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 貌似这个作品可以.. 。

+0

我刚刚来到另外两个方法来运行Java应用程序作为Windows服务,“Procrun”和“Java的Windows服务包装”,你试过这些?它可能会解决我的问题吗? –

+0

我已经试过服务:系统服务不能有GUI - 如果他们甚至创建了GUI,它将被隐藏并且无法访问。交互式服务也是无用的。可能是其他人可以分享一些更多的经验。 – VoidVolker

+0

我同意你的GUI应用程序,我也尝试过,GUI只是隐藏起来,如果你作为服务运行。但是这里的应用程序不是GUI,只有与OS进行交互的功能正在收集热键。哪些工作时运行与服务,但不运行时,作为Windows服务运行。 –