Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Привязка KeyListener


Автор: rith2 21.10.2008, 20:05
Приветствую.

Сразу скажу в Java слабоват.
Как понял, KeyListener необходимо привязать к какому либо компоненту. В данный момент ковыряю приложение, которые бы отслеживало нажатия, находясь в фоновом режиме (Фоновый режим обеспечивается Java Service Wrapper), то есть графический интерфейс мне не нужен, а все примерчики в гугле привязывают KeyListener к какому-либо компоненту. Ткните плиз, где почитать про это можно, либо примерчик киньте. Спасибо!

Автор: ecologist 22.10.2008, 08:48
KeyListener привязывается к компоненту и тут увы ничего не сделать. Каждое нажатие клавиши посылается окну или компоненту в фокусе.

Надо бы подробнее написать,что конкретно надосделать. Может какие-то другеи решения помогут.

Автор: LSD 22.10.2008, 11:49
Получать все события от клавиатуры, можно так:
Код

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
  public void eventDispatched(AWTEvent event) {
    KeyEvent keyEvent = (KeyEvent) event;
    ...
  }
}, AWTEvent.KEY_EVENT_MASK);

но для того, чтобы это работало надо:
а) чтобы приложение имело хотя бы одно видимое окно
б) чтобы это окно было в фокусе.

Т.е. кейлогер без использования JNI на Java не напишешь.

Автор: mbasil 22.10.2008, 13:21
А нельзя ли по-простому
Код

import java.io.*;

public class KeyboardInput {
 public static void main (String args[]) {
     System.out.println("Unix: Type ctrl-d to exit."
                      + "\nWindows: Type ctrl-c to exit");
       InputStream is = System.in;
   try {
         int k = is.read();
         while ( true ) {
              // Здесь интерпретируем ввод вместо System.out.println
              // правда консоль должна "висеть" это - минус
              System.out.println("Read: " + k );
              k = is.read();
          }
     } catch (IOException e) {
        e.printStackTrace();
     }
  }
}

Результат вывода:

C:\Docs>java KeyboardInput
f
Read: 102
Read: 13
Read: 10
d
Read: 100
Read: 13
Read: 10

Read: 13
Read: 10
w
Read: 119
Read: 13
Read: 10
d
Read: 100
Read: 13
Read: 10
c
Read: 99
Read: 13
Read: 10

То есть идея в том, что перехватывать ввод от потока System.in,  затем интерпретировать полученные байты. Никакой листенер в данном случае не нужен, мне кажется.  

Автор: mbasil 22.10.2008, 13:37
Тут я соврал !  В таком варианте требуется после каждого символа нажимать клавишу Enter !
Однако думаю можно попытаться перенаправить System.in 

Автор: PashaOvechkin 22.10.2008, 14:42
mbasil , а резве ето будет работать если консоь не под фокусом? 

Автор: mbasil 22.10.2008, 15:16
Не будет. Но не будет и в том случае, когда листенер в графике и приложение не фокусе.
Извините за тавтологию, в том то и фокус, что приложение получает от ОС сообщения о событиях, когда оно активно.
В былые времена мы просто перехватывали прерывания от мыши или клавиатуры (минуя DOS) и писали прямо в видиопамять. Замечательные были времена (социализм, понимаете !). 

Автор: LSD 22.10.2008, 15:25
mbasil
1. Твоё приложение перехватывает не нажатые клавиши, а то что пишется в стандартный поток ввода. И это две большие разницы. Попробуй в консоли выполнить:
Код

type KeyboardInput.java | java KeyboardInput

2. Не оффтопь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)