从android密钥代码到java密钥代码

时间:2015-05-09 19:19:26

标签: java android sockets keyboard

我正在开发一个远程键盘应用程序,它可以从Android设备控制计算机的键盘。

但问题是,当我想传递android按键密钥代码以在java的Robot类中使用时,字母和数字的效果很好,但是退格和移位键例如不能正常工作。当我从android按它时,它在我的电脑上显示22。

这是我在android上的代码

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

    }

}

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试使用getKeyCode而不是getUnicodeChar,因为第二个获取由指定的密钥和元键状态组合生成的Unicode 字符。 Shift是一个元键,它不会生成任何字符代码本身。 另一方面,getKeyCode方法检索键事件的代码。

当然,您需要修改接收部分代码,将这些代码视为键而不是字符。

答案 1 :(得分: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;
    ....