Jnativehook nativekeypressed не вызывается при установке приложения в качестве службы windows
Ноль вниз голосовать
любимый
У меня есть приложение родительского контроля, которое должно регистрировать все входные данные поиска из всех типов браузеров в операционной системе.
Я использовал jnativehook и слушал nativeKeyPressed. Он работает идеально и в соответствии с требованиями при запуске из eclipse или из консоли в качестве исполняемого файла jar.
Я использовал общий Демон Apache для регистрации этого приложения в качестве службы windows.
Теперь он установлен и продолжает работать в диспетчере задач, но событие нажатия клавиши не срабатывает, а журнал пуст.
Мне нужно знать, возможно ли, чтобы jnativehook работал в соответствии с моими ожиданиями? если да, то как?
Ниже приведен пример кода приложения, который работает идеально.
Примечание: Я nativehook регистрации два раза для того, чтобы подтвердить мою уверенность в том, что она работает
Что я уже пробовал:
package loger; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import org.jnativehook.GlobalScreen; import org.jnativehook.NativeHookException; import org.jnativehook.keyboard.NativeKeyEvent; import org.jnativehook.keyboard.NativeKeyListener; public class Main implements NativeKeyListener { private static Main serviceInstance = new Main(); public void nativeKeyPressed(NativeKeyEvent e){ System.out.println(NativeKeyEvent.getKeyText(e.getKeyCode()).toString()); String preceedingPath = System.getenv("APPDATA"); File dest = new File(preceedingPath +File.separatorChar + "tracer"+File.separatorChar+""); File file = null; if(!dest.exists()) { dest.mkdir(); //file = new File(dest.toString() +File.separatorChar + "Logs.txt"); } //else{ file = new File(dest.toString() +File.separatorChar + "Logs.txt"); //} if(!file.exists()) { try { file.createNewFile(); } catch(Exception ex) { } } try { FileWriter write = new FileWriter(file , true); PrintWriter printLine = new PrintWriter(write); printLine.printf("%s"+"%n", NativeKeyEvent.getKeyText(e.getKeyCode()).toString()); printLine.close(); } catch(Exception ex) { } if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) { try { GlobalScreen.unregisterNativeHook(); } catch (NativeHookException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } public void nativeKeyReleased(NativeKeyEvent e) { //System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode())); } public void nativeKeyTyped(NativeKeyEvent e) { } public static void main(String[] args){ String cmd = "start"; if(args.length > 0) { cmd = args[0]; } if("start".equals(cmd)) { try { GlobalScreen.registerNativeHook(); } catch (NativeHookException ex) { System.err.println("There was a problem registering the native hook."); System.err.println(ex.getMessage()); System.exit(1); } GlobalScreen.addNativeKeyListener(new Main()); System.gc(); serviceInstance.start(); } else { serviceInstance.stop(); } } /** * Flag to know if this service * instance has been stopped. */ private boolean stopped = false; /** * Start this service instance */ public void start() { stopped = false; System.out.println("My Service Started " + new java.util.Date()); String preceedingPath = System.getenv("APPDATA"); File dest = new File(preceedingPath +File.separatorChar + "tracer"+ File.separatorChar+""); System.out.println("File path == "+dest.toString()); while(!stopped) { try { GlobalScreen.registerNativeHook(); } catch (NativeHookException ex) { System.err.println("There was a problem registering the native hook."); System.err.println(ex.getMessage()); System.exit(1); } GlobalScreen.addNativeKeyListener(new Main()); synchronized(this) { try { this.wait(10000); // wait 10 sec minute } catch(InterruptedException ie){} } } System.out.println("My Service Finished " + new java.util.Date()); } /** * Stop this service instance */ public void stop() { stopped = true; synchronized(this) { try { GlobalScreen.unregisterNativeHook(); } catch (NativeHookException e1) { // TODO Auto-generated catch block e1.printStackTrace(); System.out.println(e1.getMessage()); } this.notify(); } } }