Przechwytywanie konsoli i naciskanych klawiszy

0

Witam!

Proszę o pomoc przy dwóch rzeczach:

  1. Jak przechwycić naciskane klawisze w aplikacj konsolowej (dowolny klawisz, nie ciąg zakończony enterem)?
  2. W jaki sposób pobierać treść konsoli (wiersza poleceń) z Windowsa? Np. przypisać do zmiennej String wyniki działania DOSowego polecenia 'dir'.

Co do pkt.1 wiem, że istnieje coś takiego jak jcurses, jeśli to ma pomóc to proszę o przykładową implementację.

Z góry dziękuję i pozdrawiam!

0
  1. Klasy Runtime, Procces poczytaj API. Generalnie można :)
  2. Klasa Scanner względnie własna implementacja interfejsu InputStream.
0

Dzięki za podpowiedź z Runtime - o to chodziło!

Jednak nie rozumiemy się pewnie co do problemu z klawiszami:

  1. Program jest konsolowy bez Frame'a
  2. Przechwytywane jest każde uderzenie w dowolny klawisz (nie zatwierdzany enterem)

Pseudo-kod:

while(true)
{
  int keyCode = <b>PobierzKlawisz</b>;
  if (keyCode==KEY_UP) poz=poz++;
  if (keyCode==KEY_DOWN) poz=poz--;
}

gdzie: KEY_UP, KEY_DOWN to stałe ze zdefiniowanymi kodami klawiszy.

Jeśli jednak klasa Scanner rozwiązuje problem to proszę o jakiś przykład, z góry dziękuję!

0
  1. Tak prosto nie da się
    http://4programmers.net/Forum/viewtopic.php?id=142029
    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6351276

Można to zrobić tylko stosując nieprzenośne, używające bibliotek natywnych rozwiązania jak np. jcurses

Toolkit.init();
InputChar inc; 
char c;
while ((inc = Toolkit.readCharacter()) != null && !inc.isSpecialCode() && (c = inc.getCharacter()) != 'q' ){
	Toolkit.printString("Wprowadzono: " + c, 0, 0, new CharColor(CharColor.BLACK, CharColor.YELLOW));
}
Toolkit.shutdown();

Jeżeli chcesz mieć nieblokujące wczytywanie klawiszy - czytaj w drugim wątku.

Dwa szczegóły:
-kiedy budujesz swojego jara, libjcurses.so musi być wewnątrz tego jara na najwyższym poziomie
-nie działa ze wszystkimi terminalami, z terminalem Gnome tak, ale z Eclipsem już nie.

0

Żeby nie mieć wczytywanych klawiszy buforowanych wierszowo i na dodatek zrobic taką aplikację przenośną, najprościej jest... zbudować własną konsolę. To w końcu nic innego jak zwykłe okienko wyświetlające tekst i umożliwiające wprowadzenie tekstu tylko w ostatnim aktywnym wierszu. Na dodatek wszelkie rozmiary takiej konsoli mogą być kontrolowane przez własny program. Nie jest też aż tak wiele kodu do napisania. Ot zwykły frame oparty o wielowierszową klasę JText, w której zabraniamy poruszać kursorem w pionie (chyba, że nie zabraniamy jak w workbenchu starej Amigi).
Nie ma żadnego problemu w upodobnieniu własnej konsoli do CMD z Windows lub dowolnego tekstowego shella z systemów X-owych. Odczytywanie kodów klawiszy i ich transfer do postaci znakowej zrealizuje Swing lub SWT, a wyświetlanie i sterowanie znakami własna klasa konsoli.

Może dlatego propozycja rozszerzenia przedstawiana formalnie jako bug nie znalazła żadnego uznania u Suna? I w praktyce została rozpatrzona negatywnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1