2015-05-09 2 views
1

Привет, я разрабатываю приложение для удаленной клавиатуры, которое управляет клавиатурой компьютера с устройства Android.От кодов клавиш Android до java-ключей

Но проблема в том, что когда я хочу передать коды клавиш для андроидов, которые будут использоваться в классе роботов java, алфавиты и числа отлично работают, но обратное пространство и клавиша смены, например, не работают должным образом. Когда я нажимаю его на Android, он отображает 22 на моем компьютере.

Это мой код на андроид

@Override 
public boolean dispatchKeyEvent(KeyEvent event) 
{ 
    int keyaction = event.getAction(); 

    if(keyaction == KeyEvent.ACTION_DOWN) 
    { 
     int keyunicode = event.getUnicodeChar(); 
     char character = (char) keyunicode; 

     PrintStream ps; 
     try { 
      ps = new PrintStream(socket.getOutputStream()); 
      ps.println(character); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 


    return super.dispatchKeyEvent(event); 
} 

И это код на компьютере

public class Keyboard extends Thread{ 
    InputStreamReader isr; 
    BufferedReader br; 
    Socket socket; 
    Robot r; 

    @Override 
    public void run() { 
     try { 
      socket = SocketWrapper.getSocket(); 
      r = new Robot(); 
      new Thread(new Runnable(){ 
       @Override 
       public void run() { 
        while(true) 
        { 
         if(socket != null) 
         { 
          try { 
           isr = new InputStreamReader(socket.getInputStream()); 
           br = new BufferedReader(isr); 
           if(br.ready()) 
           { 
            char c = (char) br.read(); 
            System.out.print(c); 


            r.keyPress(KeyEvent.getKeyCodeForChar(c)); 
            r.keyRelease(KeyEvent.getKeyCodeForChar(c)); 


           } 
          } catch (IOException ex) { 
           Logger.getLogger(AndroidServer.class.getName()).log(Level.SEVERE, null, ex); 
          } 
         } 
        } 
       } 

      }).start(); 
     } catch (AWTException ex) { 
      Logger.getLogger(Keyboard.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

} 

Спасибо.

ответ

0

Попробуйте использовать getKeyCode вместо getUnicodeChar, потому что второй один получает символ Unicode, порожденную указанным ключом и мета состояния ключа комбинации. Shift - это мета-ключ, и он не генерирует никакого символьного кода. С другой стороны, метод getKeyCode извлекает ключ кода ключевого события.

Конечно, вам нужно изменить принимающую часть кода для обработки этих кодов как ключей, а не символов.

+0

действительно ли getKeyCode возвращает ascii или некоторые другие значения? cuz я пытался, но ничего не происходит – Tomahawk

+0

kecodes не ascii (это фактически номера символов), но коды для событий клавиатуры, которые включают в себя медиа-ключи, аппаратные ключи, метакиды, такие как backspace и shift, которые вы упомянули, и, конечно, обычные буквы. Эти коды просто нужно преобразовать на ПК персонально (если вы действительно хотите получить характер) или лучше проанализировать, какой тип кода вы получите (символ или контрольный символ). –

+0

Когда вы выполняете 'System.out.print (c);', вы можете вырезать символ для печати, но выход системы не может распечатать обратное пространство. Попробуйте напечатать код вместо символа. Я уверен, что вы получите разные значения для разных ключей. Чтобы лучше понять, как все это работает, рассмотрите возможность установки дисплея KeyEvent - он выводит каждое событие, которое приложение получает. –

0

Лучшее решение - отправить код виртуального ключа для SHIFT, BACKSPACE и других ключей, где event.getUnicodeChar() не определен;

if(keyCode == KeyEvent.KEYCODE_SHIFT_LEFT || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) 
     keyunicode = 16; //this is the code for KeyEvent.VK_SHIFT; 
    if(keyCode == KeyEvent.KEYCODE_DEL) 
     keyunicode = 8; //this is the code for KeyEvent.VK_BACK_SPACE; 
    ....  
Смежные вопросы