Pytanie: jak czyścić bufor klawiatury???

0

Witam,

Aplikacja działa pod XP wywoływana spod cmd.exe, aplikacja NIE działa w trybie graficznym.

Użytkownik komunikuje się z aplikacją poprzez ekran w trybie tekstowym, czytnik kart RFID i klawiaturę numeryczną (System.console()Wink.

Działanie aplikacji wygląda +/- tak:
Aplikacja stoi i czeka na przyłożenie karty RFID, po przyłożeniu karty następuje prosta konwersacja z userem typu : naciśnij enter aby kontynuować lub wybierz opcje 1,2 lub 3 i potwierdź enterem, itp.

Problem polega na tym, że gdy aplikacja czeka na zdarzenie karty RFID, jakieś małpy przechodzą obok klawiatury numerycznej i wciskają byle co i odchodzą. Po czym ktoś przykłada kartę i to co małpy ponaciskały przedtem jest interpretowane przez aplikację.

Poradziłem sobie z czyszczeniem bufora ALE tylko do ostatniego klawisza ENTER, lecz jeśli w buforze jest ciąg znaków nie zakończony Enterem to user który się zalogował kartą dostaje na wstępie śmieci z bufora.

Poprzez rundll32 keyboard,disable można klawiaturę wyłączyć ale nie można już jej włączyć.

Proszę Bardzo o pomysły.

pozdrawiam.

0

Nie do końca rozumiem:

Czytnik RFID przesyła dane symulujac klawiaturę? Czyli w systemie jest widoczny jako klawiatura...mimo ze nie da się w kernelu rozdzielić strumieni wejsćia (wszystkie klawiatury wpychają dane do jednego bufora) to przecież wiesz jakoś że do czytnika przyłożona kartę. I od tego momentu rozpoczynasz czytanie ciągu...po co w ogóle bierzesz pod uwagę wczesniejsze,późniejsze znaki?

Daj sobie jakies statyczne pole które będzie odpowiadało eventowi rozpoczęcia czytania karty i masz:

   keyboardHook = new LowLevelKeyboardProc() {
        public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {
            if (nCode >= 0) {
                if(flagaOdczytu)
                 {
                switch(wParam.intValue()) {
                case User32.WM_KEYUP:
                {
                    System.out.println("ncode " + nCode);
                    System.out.println("WPARAM " + wParam.intValue());
                    System.out.println("iinfo.dwExtraInfo " + info.dwExtraInfo);
                    System.out.println("iinfo.flags " + info.flags);
                    System.out.println("iinfo.scancode " + info.scanCode);
                     System.out.println("--------------------------------");
                 //   System.out.println("iinfo.times " + info.time);
                //    System.out.println("iinfo.vkcode " + info.vkCode);
                    
                }
                case User32.WM_KEYDOWN:
                         {
                         //System.out.println("2");
                }
                case User32.WM_SYSKEYUP:
                         {
                   // System.out.println("3");
                }


                case User32.WM_SYSKEYDOWN:
                                             {
                   // System.out.println("4");
                     tu zbierasz tekst w całość
                }
                
                  
                }
               }
            }
            return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
        }
    };

Jak nie da eventu karty to w ogóle nie będziesz dodawać teklstu czyli Twój kod z rfid będzie "czysty"

0

sorry jeśli się źle wyraziłem.

Jest tak:

  1. Aplikacja w trybie tekstowym stoi i czeka na przyłożenie karty.

  2. User przykłada kartę - event który uruchamia logikę biznesową (m.in na podstawie danych z karty odczyt przez rpc danych o tym user'że, jego status itd.)

  3. Następuje dialog z userem (bardzo prosty: typu naciśnij Enter aby kontynuowac, wybierz opcje 1, 2 lub 3 i naciśnij Enter, itp.)
    (klawiatura numeryczna, System.console() console.readLine()).

  4. Jeśli user nie odpowiada przez 60 sekund jego sesja jest anulowana i aplikacja przechodzi w stan oczekiwania na przyłożenie karty ( punkt 1.).
    4a. user wykona kroki wg instrukcji na ekranie - sesja się kończy poprawnie, apilkacja przechodzi do punktu 1.

Problem jest gdy ktoś naciśnie klawisze w klawiaturze numerycznej PRZED przyłożeniem karty, to PO przyłożeniu tejże jest śmietnik w buforze klawiatury - aplikacja zachowuje się tak jakby te śmiecie były odpowiedziami usera w sesji.

Dziękuję bardzo i pozdrawiam

0

@belina, a może tak przed rozpoczęciem komunikacji wystarczy System.console().flush()?

0

koziołek może miec rację...ale co do mojej rady. Czy Ty używasz low-level keyboard hook?

0

flush() niczym nie skutkuje.

Dzięki za nakierowanie na JNA, chciałem rozwiązać problem w "czystej" javie (bez odwołań low level) ale widać ze się nie da.

Dziękuję i pozdrawiam.

0

Jest świetny przykład na stronach JNA - lov level ... wszystkie problemy Ci rozwiąże- daj znac to podeśle jak nie będziesz mógł znaleźc.

0

Witam,

wczoraj zaimplementowałem klaskę public class Hook2 implements Callable<String>,
w której przy pomocy:
new User32.LowLevelKeyboardProc() {
public W32API.LRESULT callback(int nCode, W32API.WPARAM wParam, User32.KBDLLHOOKSTRUCT lParam) {...

przechwytuję zdarzenia klawiatury. Działa świetnie - nacisniecia, puszczenia klawiszy sa przechwytywane.

Maestro! chciałbym pozostawić moduł konwersacji z userem, w którym użyto System.console(), pozostawić BEZ zmian; lecz przy pomocy
callback'a spowodować aby przechwycone nacisnięcia klawiatury nie pozostawały w buforze.

Stan aktualny jest taki, że callback jest przerywany przyłożeniem karty lecz mimo że callback działał, w buforze klawiatury nadal są śmieci.
co zrobić aby callback powodował nie pozostawianie w buforze klawiatury znaków?

Miłego weekendu zyczę.

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