bilal _hassan Ответов: 1

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();
       }
    }
    
}

1 Ответов

Рейтинг:
1

Richard MacCutchan

Службы Windows не запускаются в сеансе, имеющем доступ к терминалу (рабочему столу). То есть экран или клавиатура (логическая или физическая) не подключены. Итак, суть в том, что вы не можете сделать это из сервиса. И, честно говоря, это так же хорошо, как и то, что такая функция откроет огромную дыру в безопасности Windows.