Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odczyt inputu z klawiatury w czasie rzeczywistym
Forum PHP.pl > Forum > PHP > Object-oriented programming
scanner
Mam do rozwiązania pewien problem:

Dysponując czytnikiem kodów kreskowych napisać aplikację reagującą na aktywność czytnika i zapisującą kod i inne dane w bazie.

Oczywiście jedynym zmartwieniem dla mnie jest przechwycenie z poziomu php (najlepiej w przeglądarce) sekwencjio znaków wypisanych z klawiatury (czytnik kresek jest wpięty równolegle z klawiaturą i generuje cyfry na stdin - tyle informacji a razie mam).
Odczyt powinien się odbywac oczywiście bez ingerencji uzytkownika.

Pytanie:
Gdzie i co poczytać o tym?
Dajcie mi lekturkę do obiadu, jeśli macie coś pod ręką.
misterLu
Cytat
przechwycenie z poziomu php (najlepiej w przeglądarce)

Możesz coś przechwycic albo z poziomu php (po stronie serwera), alebo w przeglądarce (po stronie klienta).
Poczytać musisz o JavaScripcie, bo to jest narzędzie do działania po stronie przeglądarki, a co za tym idzie klawiatury, itp.
Polecam coś o 'dynamic forms'.

Przykładowe działanie skryptu:

na wejsciu ustaw focus (kursor) w polu w którym ma byc wczytana wartosc z czytnika.
Za kazdą zmiana zawartości 'tego' pola formularza (onChange()) zliczaj ilosc zankow w tym polu. Jezeli bedziesz mial ilosc znakow rowną ilosci znaków zczytanych z czytnika (czyli tyle, ile przewidujesz na kod kreskowy), to wyslij formularz (submit).
NuLL
Moge napomkan ze w php sa dostepne strumienie(o ktorych rzadko kto pamieta) takie jak w C - to chyba rozwiazuje problem - moge jutro cos podrzucic nt. - tzn. jakis przykladzik wkleje a manual reszte powie smile.gif
scanner
Obu dzieki za naprowadzenie.. a co do strumieni.. zawsze sie ich obawiałem, ale chyba tak jak mówi null - przyszła pora na nie...
Będę wdzięczny za te przykłady.
NuLL
Scanner wybacz za brak przykladu - sprobuje wytlumaczyc bo nie moge znalesc skryptu(napisze cos jutro i wkleje jak trzeba). Strumen otwieramy fopenem i korzystamy z standardowych funkcji systemu plikow- jak przeczytac pasek kreskopwy nie wiem za cholere - nie wiem jak jest zoorganizowany strumien(napisz cos smile.gif) jakbys cos napisal to moze napisze cos bardziej konkretnego

Pozdro
scanner
Więc tak.
Póki nie otrzymam czytnika do ręki, cięzko mi powiedzieć coś konkretnego, moge się tylko opierać na informacjach, jakie zleceniodawca mi przedstawił.

- Czytnik jest wpięty poprzez rozgałęziacz z portem klawiatury.
- Symuluje działanie klawiszy numerycznych
- Można mu ustawić poprzedzenie każdej odczytanej sekwencji dowolnym znakiem ASCII

Co do aplikacji:
Na razie przewiduję dwa moduły:
- Jeden pracujący w tle i obsługujący: odczytywanie sekwencji, zapis zdarzenia do bazy.
- Drugi pracujący w przeglądarce i obsługujący: drukowanie etykiet "Gość", zapis logu odwiedzin gościa (kto, do kogo, kiedy)

Całość ma pracować na zasadzie identyfikacji pracowników na portierniach.
Myślałem nad napisaniem tego w JAVie, ale tej dopiero zaczyna się uczyć i za długo by potrwało - php powinno sobie z tym poradzić.
kszychu
Scanner: a nie lepiej napisać coś powiedzmy w c siedzącego u klienta, odczytującego te dane i przesylajacego je do php? Albo zaprządz gtk do uaktywnienia php po stronie klienta? No chyba, że jakoś (javascript?) oprogramować przeglądarkę, która po odebraniu określonej liczby cyfr wyśle je do serwera.
scanner
Ostatni raz pisałem cos w C 7 lat temu niestety.

Przy okazji już wykształcił mi się teoretyczny problem:
Co w sytuacji gdy portier generuje etykietke dla gościa a w tym momencie przechodzi przez bramke uprawniona osoba?

teoretycznie zadziałają dwie kalwiatury i portier w formularzu zobaczy wpisywane dane czytnika

Więc moduł czytnika musiałby pobrać dane z stdin() i od razu je usunąć z bufora - taka operacja powinna IMHO zając nie wiecej niż ułamek sekundy, więc zmieści się pomiędzy dwoma naciśnięciami klawiszy na klawiaturze przez portiera - ale musże miec to na uwadze.
nocnyMark()
Scanner, mam prosbe

jak juz bedziesz mial cos konkretnego,
w sensie "jak pogryzles temat i co z tego wyszlo"
to wrzuc to na forum tutaj

osobiscie do tej pory stojac w supermarkecie w kasie obmyslalem sobie na ile sposobow mozna by wykorzystac taki czytnik

tylko problem byl zawsze jak zaczac od strony technicznej

czekam z niecierpliwoscia na twoje powodzenie smile.gif

Pozdr.
K.
yeti
Nie wiem, dlaczego nie chcesz spróbować z JavaScriptem (jak radził misterLu). IMHO jest to najłatwiejszy sposób. W taki sposób oprogramowywałem system do obsługi biblioteki i działał jak marzenie.
patrycjusz
Cytat(scanner @ 2004-10-06 10:01:42)
Co w sytuacji gdy portier generuje etykietke dla gościa a w tym momencie przechodzi przez bramke uprawniona osoba?

teoretycznie zadziałają dwie kalwiatury i portier w formularzu zobaczy wpisywane dane czytnika

Więc moduł czytnika musiałby pobrać dane z stdin() i od razu je usunąć z bufora - taka operacja powinna IMHO zając nie wiecej niż ułamek sekundy, więc zmieści się pomiędzy dwoma naciśnięciami klawiszy na klawiaturze przez portiera - ale musże miec to na uwadze.

@scanner: w javie nie bedzie to trudne, poczytaj o standardowym wczytywaniu informacji z inputu, a co do tego zacytowanego problemu, wielowątkowość smile.gif
a to juz troche wyższa szkoła jazdy winksmiley.jpg
zoba, masz jeden wątek który nie przerwanie nasłuchuje z czytnika, i jeżeli czytnik się "odezwie" to go obsługuje, dodatkowo wątki które nasłuchują z innych urządzeń dostępowych, czy to czytnik czy cokolwiek innego (koleś za biurkiem smile.gif
i wsio smile.gif
pzdr
scanner
No i zdobyłem już czytnik.
Pierwsze eksperymenty wykazują, ze przesyła on do komputera 13 cyfr i znak końca linii.
Próby robiłem w notepad.exe - linijka po linijce pokazywał kody wszystkiego co skanowałem.

mając jeszcze chwile wolnego czasu, próbowałem coś sklecić:
  1. <?php
  2.  
  3. $File = fopen( 'php://stdin', 'r');
  4. if ( !$File )
  5. {
  6. echo &#092;"'Błąd...n\";
  7. }
  8. while( true )
  9. {
  10. $sChar = fgetc( $File );
  11. echo $sChar.&#092;"n\";
  12. } 
  13. ?>
Ale nie wyszło... Chyba nie mam natchnienia dzisiaj...
Załozęnie jest takie, że czytnik jest podpięty bezpośrednio do komputera, na którym działa oskryptowanie. PHP5 jako moduł.

Mógłby mnie ktoś nakierować w dobrą stronę?
Prirytetem na chwile obecną jest odczyt wspomnianej sekwencji znaków. Jak to zrobię, to jestem w domu - reszta aplikacji to już betka.
Vengeance
@scanner

zamiast fgetc() ktore pobiera jeden znak daj
fgets() dodajac moze drugi parametr czyli dlugosc lini do pobrania (z tego co mowiles to 13+1 > 13 znakow i znak nowej lini)

Powinno śmigać.

Pozatym kiedyś coś takiego robiłem w Delphi i działało na zasadzie, że gdy TEdit zmieniał swoją wartość i osiągał te np. 13 znaków to zaczynało się wyszukiwanie. To samo (co już ktoś zaproponował) mógłbyś i ty zastosować. W javascript sprawdzać te znaki i wysyłać formularz gdy będzie ich 13. przecież czytnik wstawia txt "na raz". a jakby ktoś chciałby wprowadzać kod ręcznie to też zadziała. to chyba nawet bardziej miłe dla użytkownika wyjście niż STDIN
matid
Skrypt poprawnie czyta /dev/stdin, tylko nic nie jest przekazywane przez wejście tego procesu.
Spróbuj odpalić ten skrypt z lini poleceń:
php skrypt.php
Wtedy po naciskaniu przycisków na klawiaturze itp. wszystko działa. Trzeba znaleść jak sprawdzać dane wchodzące na wszystkie wejścia a nie tylko na jedno.
ActivePlayer
a te kody wczytywane z czytnika mają jakąs sumę kontrolną ?
scanner
Nie zagłębiałem się jeszcze w sposoby generowania kodów - ale chyba widziałeś cyferki pod kreskami - jakis algorytm na to jest.
Vengeance
co do kodow jeszcze u mnie na forum bylo podobne pytanie:
http://strefaphp.net/index.php?page=forum&...iew_topic&t=114
scanner
Dzięki za link.

Co do generowania kodu - informatyk firmy ma już w głownej aplikacji odpowiednie implementacje i wybrany sposób kodowania.

Co do problemu. Wymysliłem na razie (teoretycznie) coś takiego:
  • Pakiet musi działać zarówno pod Win jak i Linuxem. (odpada zastosowanie JS?)
  • Jest proces działający w tle - strażnik (Sentinel.php) który nasłuchuje wejścia klawiatury. Dodaje znaki do wewnętrznego bufora i w momencie, gdy sekwencja ma określoną długość i pasuje do wzorca (RegExp) wysyła impuls do bazy danych zapisując zdarzenie.
    Detekcja zdażeń może być nieco utrudniona, ale wystarczy zrobić X znakowy bufor, z którego spada najstarszy element:
    Out <------ [buffer] <------ In
    (robiłem to już w Basic'u na Meritum) i patrzeć czy ToString() bufora pasuje do wzorca i teoretycznie mamy po sprawie.
  • Jest proces aktywny (Doorman.php), który działając w przeglądarce (może GTK? Jeszcze się tym nie zajmowałem, może pora) umożliwia:
    • Podgląd zapisanych zdażeń,
    • Generowanie i wydruk kodów tymczasowych (pdf),
    • Export i import określonych danych,
    • ... innych zadań wykonywanych jawnie przez obsługującego
Podstawowy problem jest w tym, jak odczytać (wiadomo, jesli będzie potrzebne, Sentinel rozpozna system na którym jest zainstalowany) to co przychodzi z portu klawiatury.

Na razie czytam o wielowątkowości w Javie, ale chyba jestem lekko za słaby jeszcze na ten język, poza tym ambicjonalnie chciałbym udowodnić zleceniodawcy, że to jest możliwe do wykonania w php/MySQL.
ActivePlayer
Nie jestem pewien ale chyba musisz tez wziasc pod uwage ze user w czasie kozystania ze skryptu moze robic cos innego i musialbys jakos sprawdzac czy te dane które "strażnik (Sentinel.php)" bedzie wczytywał w tle, będą tymi które chcesz nasłuchiwać...
matid
No przecież napisał że skrypt będzie sprawdzał czy sekwencja ma odpowiednią długość i czy pasuje do wzorca. Wystarczy dobrze czytać :]
scanner
Spróbowałem zrobić symulację modułu Sentinel - do zrobienia pozostaje metoda openInput() oraz getKey().
Skrypt w zasadzie powinien działać niezauważalnie - w tle, nie generując żadnych outputów.

  1. <?php
  2. /**
  3.  * Sentinel
  4.  * Modul pakietu DoorKeeper
  5.  *
  6.  * @package DoorKeeper
  7.  * @author Grzegorz 'scanner' Tlołka
  8.  * @date 2004/10/15
  9.  * @update 2004/10/15
  10.  * @version 0.0.1dev
  11.  */
  12.  
  13. // Proces dziala w tle jako usluga stala)
  14. //ignore_user_abort( true );
  15.  
  16.  
  17. $Sentinel = new Sentinel( 13 );
  18. $Sentinel->run();
  19.  
  20. /** Abstract **/
  21. abstract class ASentinel
  22. {
  23. abstract public function __construct( $iBufferLen );
  24. abstract public function run();
  25.  
  26. abstract private function openInput();
  27. abstract private function addBuffer();
  28. abstract private function testBuffer();
  29. abstract private function writeEvent();
  30. abstract private function getKey();
  31. }
  32.  
  33. /** Implementation */
  34. class Sentinel extends ASentinel 
  35. {
  36. private $aBuffer;
  37. private $iBufferLen;
  38. private $sBufferPattern;
  39.  
  40. function __construct( $iBufferLen )
  41. {
  42. $this->iBufferLen = intval( $iBufferLen );
  43. $this->sBufferPattern = &#092;"#(d){\".$this->iBufferLen.\",}#\";
  44. $this->openInput();
  45. $this->aBuffer = array( null );
  46. }
  47.  
  48. function run()
  49. {
  50. while ( true )
  51. {
  52. $this->addBuffer();
  53. $this->testBuffer();
  54. }
  55. }
  56.  
  57. function openInput()
  58. {
  59. // TODO
  60. }
  61.  
  62. function addBuffer()
  63. {
  64. if( array_push( $this->aBuffer, $this->getKey() ) > $this->iBufferLen )
  65. {
  66. $DevNull = array_shift( $this->aBuffer );
  67. }
  68. }
  69.  
  70. function getKey()
  71. {
  72. // TODO
  73. $sChar = chr( rand( 48, 60 ) );
  74. return $sChar;
  75. }
  76.  
  77. function testBuffer()
  78. {
  79. $sTest = join( $this->aBuffer );
  80. if( preg_match( $this->sBufferPattern, $sTest ) )
  81. {
  82. $this->writeEvent();
  83. }
  84. }
  85.  
  86. function writeEvent()
  87. {
  88. echo &#092;"Event saved with result: \".join( '', $this->aBuffer).\"<br />\";
  89. }
  90. }
  91. ?>
max_catch
pisałem niegdyś moduł 'sprzedaży detalicznej' dla sklepu internetowego:

zadaniem tej aplikacji było rejestrowanie towarów sprzedanych w prawdziwym fizycznym sklepie i aktualizowanie stanu magazynu, czyli bazy towarów w MySQL (magazyn odzwierciedlał stan ilościowy towarów dla sklepu internetowego, lecz wspódzielony był przez prawdziwy sklep).

system zarządzania sklepem generował z pomocą biblioteki gd kody kreskowe (jeśli sie nie mylę to w standardzie code39) dla każdego nowo wprowadzanego produktu - obsługa drukowała tak wygenerowany kod za pomocą właściwej drukarki - w ten sposób towar był identyfikowany i możliwe było łatwe prowadzenie jego ewidencji.

Ale do sedna: wspomniany moduł działał tak: pracownik sklepu przed rozpoczęciem pracy otwierał internetowy panel obsługi i przechodził do sekcji sprzedaży detalicznej. Skrypt wyświetlał input na kod kreskowy i kilka opcji związanych z ilością jednorazowo sprzedawanego towaru. Pracownik przejeżdżał czytnikiem po kodzie kreskowym (dodam że to urządzenie dodaje po sekwencji cyfr kodu kreskowego enter), formularz był w tym momencie wysyłany i dokonywałą się aktualizacja bazy.

może to nieco OT, ale jeśli widzisz tu jakies podobienstwo do twojego problemu to czerp śmiało, pozdrawiam
scanner
Kwestia jest taka:
Nie moża wykorzystać formularza do odczytywania danych z czytnika.

Sentinel musi siedzieć w tle, nie wyświeltając żadnego okienka ani nic. Po prostu uruchomiony z autostartu lub Crona skrypt, którego nie widać.
Otwiera on jakis sposób odczytu tego, co przechodzi przez port klawiatury, miesza wewnętrzny bufor i jeśli zawartośc bufora jest zgodna z wzorcem, to zapisuje zdażenie (dla uproszczenia poprzez error_log() );

W żaden sposób nie ingeruje w dane z klawiatury, tylko je analizuje.
Operator stanowiska może w tym czasie nawet układąc pasjansa, albo robić inne cuda - dlatego Sentinel musi pozostać w trybie "Stealth".

Jeśli do końca tygodnia nic nie wymyślę, będę sie musiał zakopać w Javę, ale wolałbym to zrobić w php (chyba, ze ktoś mi udowodni, że się nie da).

Po drobnych modyfikacjach kod skrytpu wygląda tak:
  1. <?php
  2. /**
  3. * Sentinel
  4. * Modul pakietu DoorKeeper
  5. *
  6. * @package DoorKeeper
  7. * @author Grzegorz 'scanner' Tlołka
  8. * @date 2004/10/15
  9. * @update 2004/10/15
  10. * @version 0.0.1dev
  11. */
  12.  
  13. // Proces dziala w tle jako usluga stala)
  14. //ignore_user_abort( true );
  15.  
  16.  
  17. $Sentinel = new Sentinel( 13 );
  18. $Sentinel->run();
  19.  
  20. /** Abstract **/
  21. abstract class ASentinel
  22. {
  23. abstract public function __construct( $iBufferLen );
  24. abstract public function run();
  25.  
  26. abstract private function openInput();
  27. abstract private function addBuffer();
  28. abstract private function testBuffer();
  29. abstract private function writeEvent( $sMessage );
  30. abstract private function getKey();
  31. }
  32.  
  33. /** Implementation */
  34. class Sentinel extends ASentinel
  35. {
  36. private $hInput;
  37. private $aBuffer;
  38. private $iBufferLen;
  39. private $sBufferPattern;
  40.  
  41. function __construct( $iBufferLen )
  42. {
  43. $this->iBufferLen = intval( $iBufferLen );
  44. $this->sBufferPattern = &#092;"#(d){\".$this->iBufferLen.\",}#\";
  45. $this->openInput();
  46. $this->aBuffer = array( null );
  47. }
  48.  
  49. function run()
  50. {
  51. while ( true )
  52. {
  53. $this->addBuffer();
  54. $this->testBuffer();
  55. }
  56. }
  57.  
  58. function openInput()
  59. {
  60. $this->hInput = fopen( 'php://stdin', 'r');
  61. $this->writeEvent( 'Opening input...' );
  62. }
  63.  
  64. function addBuffer()
  65. {
  66. if( array_push( $this->aBuffer, $this->getKey() ) > $this->iBufferLen )
  67. {
  68. $DevNull = array_shift( $this->aBuffer );
  69. }
  70. }
  71.  
  72. function getKey()
  73. {
  74. // TODO
  75. //$sChar = chr( rand( 48, 60 ) );
  76. $sChar = fgetc( $this->hInput );
  77. return $sChar;
  78. }
  79.  
  80. function testBuffer()
  81. {
  82. $sTest = join( $this->aBuffer );
  83. if( preg_match( $this->sBufferPattern, $sTest ) )
  84. {
  85. $this->writeEvent( $sTest );
  86. }
  87. }
  88.  
  89. function writeEvent( $sMessage )
  90. {
  91. error_log( date( '[Y-m-d H:i:s] ' ).$sMessage.&#092;"n\", 3, 'Sentinel.log' );
  92. }
  93. }
  94. ?>

Ale niezaleznie od tego, czy go uruchomię w linii poleceń, czy z przeglądarki po prostu nie działa...

Czytałem o socketach, ale nie wiem, jak można by je zastosować.
null wspominał coś o strumieniach, ale tez jeszcze sie tym nie bawiłem, wiec nie wiem co i jak...

Osoba, która pomoże mi w rozwiązaniu tego problemu może liczyć na gratyfikację po oddaniu projektu zleceniodawcy.

P.S. Przenoszę do PHP5, żeby ktoś nie pomyślał, że piszę to w php4 smile.gif
netzah
Cytat
Sentinel musi siedzieć w tle, nie wyświeltając żadnego okienka ani nic. Po prostu uruchomiony z autostartu lub Crona skrypt, którego nie widać.


Chcesz przez to powiedziec, ze Sentinel nie ma focusa i chce odczytywac znaki? Jezeli tak, to, IMO, nie da sie tego zrobic w php. Nawet zwykly prog windowsowy nie ma takich mozliwosci - zeby przychwytywac wszystkie zdarzenia (majac nieaktywna aplikacje) trzeba uzyc hook-ow. To mogloby byc rozwiazanie Twojego problemu - aplikacja win32, przychwytujaca wszystkie znaki i ew. wysylajaca zapytania do serwera z php, przekazujaca np. przez GET odczytane dane do analizy i zapisania w bazie. (chociaz rownie dobrze mozna juz probowac robic to w C). Natomiast linux - nie wiem, w jaki sposob prog moze to robic (moze odczyt z portu klawiatury? czy to w ogole mozliwe?)
scanner
A gdyby zrobić tak, że uruchomimy jakis napisany w C czy czyś innym proces, który przy pomocy socketów lub strumieni będzie się komunikował z moim Sentinelem i podawał mu wychwycone z porty klawiatury sygnały?

Tylko w czym by taki program napisać? I jak?
Ktoś chętny na zarobienie kilkudziesięciu złotych?
netzah
Takiego proga mozna napisac np. w C. Tylko jest tu jeszcze jedna kwestia: z tego co pisales kody z czytnika nie powinny docierac do osoby siedzacej przy kompie. Nie jestem powien, czy proces dzialajacy w tle moze (w jakis ludzki sposob) usuwac wcisniete znaki z bufora, trzebaby to zbadac dokladniej.
Co do komunikacji to moga byc sockety, moga byc zapytania do serwera, na ktorym bryka Twoj skrypt. A strumienie? Tu nie wiem jak mogloby to dzialac.
PMadej
a ja wymyśliłem coś innego ... żeby sentinel siedział w Iframe w formularzu portiera i bylby poprostu niewidoczny ... chodzi mi o to ze wtedy mozesz zrobic formularz do ktorego moze on zapisywac sekwencje ... dodatkowo napisałeś, że jest możliwość zaprogramowania znaku ASCII od jakiego zacznie się sekwencja więc trzeba go tak ustawić żeby nawet pomiędzy naciśnięciami klawiszy jak wpadnie sekwencja rozpoczęta znakiem ASCII a zakończona enterem o długości 15 znaków, to żeby to przechwycił form w iframe

PS. Nie wiem czy dobrze myślę ale jestem trochę chory i mam spowolnione procesy myślowe
netzah
Tutaj wg mnie jedyny problem to to, w jaki sposob nieaktywna aplikacja otrzymywala znaki z klawiatury. Jezeli bedzie bedzie jakis formularz, to co jezeli, tak jak pisze scanner, facio przelaczy sie na pasjansa? Proby lapania klawiszy poprzez przegladarke to sredni pomysl. Jezeli byloby to mozliwe, to oznaczaloby, ze mozna zrobic keyloggera (bo o to przeciez chodzi!) przez www. ohmy.gif

No wlasnie - scanner, mozesz zapuscic jakiegos darmowego keyloggera i przez php analizowac logi jakie generuje. biggrin.gif I wcale nie zartuje w tej chwili, mysle, ze to spoko pomysl!
Ale jezeli zalezy Ci na natychmiastowej reakcji na klawisze, to juz trzeba zadzialac.
scanner
Cały czas mi chodzi po głowie ten programik w C.

1) Całość ma działać zarówno pod Windowsem jak i Linuxem/Unixem
2) Oprogramownaie będzie korzystać z Apacha, MySQL i PHP5 zainstalowanego na maszynie, na której podpięty jest czytnik.
30 Operator komputera w zasadzie ma tylko obsługiwac drugi moduł pakietu w sytuacji gdzy przyjdzie jakiś gość i trzeba mu będzie przypiąć tymczasowy barcode - więc problem
Cytat
kody z czytnika nie powinny docierac do osoby siedzacej przy kompie
gdyż nawet jełsi bnędzie ona wypełniać formularz gościa, to nie poroblem skasowac ewentualne znaki z czytnika.

Najwazniejsze w tej chwili to stworzenie keylogera właśnie.
Szykam oprogramownaie do mojego czytnika, bo podobno można go zmusić do wysłania sekwencji poprzedzonej zdefiniownaym w jego konfiguracji znakiem - wtedy łatwiej by było odfiltrować bufor klawiatury z czytanej sekwencji.
netzah
O ile w win32 jest w miare spoko, to ciekawe , czy pod linuxem mozna zmontowac keyloggera? Watpie, czy mozna rozwiazac to poprzez dostep do portu klawiatury (to 1. zagadka), bo przeciez nie mozna na nim wisiec w petli non-stop, bo obciazenia proca w 100% chyba nie wchodzi w gre...
scanner
No cóż. Chyba pozostanie mi tylko przebudowa projektu i oparcie się o przeglądarkę, focusy i JS.
Zmniejsza to elastyczność, ale trudno. Zobaczymy co zleceniodawca powie...
matid
Cytat(netzah @ 2004-10-20 15:21:44)
O ile w win32 jest w miare spoko, to ciekawe , czy pod linuxem mozna zmontowac keyloggera? Watpie, czy mozna rozwiazac to poprzez dostep do portu klawiatury (to 1. zagadka), bo przeciez nie mozna na nim wisiec w petli non-stop, bo obciazenia proca w 100% chyba nie wchodzi w gre...

W linuxie jest możliwe napisanie takiego programu. Wystarczy spojrzeć jak działają programy do obsługi klawiatur multimedialnych. Przecież one wychwytują kody wciśniętych klawiszy - w ten sposób można keyloggera zrobić bez problemu.

Dla chętnych źródła takiego programu pod linux'a: http://ypwong.org/hotkeys/0.5.7.1/hotkeys_0.5.7.1.tar.gz
netzah
Ale te sterowniki dzialaja tylko pod X-window, tak? System okienek winksmiley.jpg na pewnie sam rozdziela zdarzenia, tak jak win32. Czy moze sie myle? Czy jest mozliwe napisanie keyloggera pod konsole?
dag
Cytat(netzah @ 2004-10-22 08:08:56)
Ale te sterowniki dzialaja tylko pod X-window, tak? System okienek winksmiley.jpg na pewnie sam rozdziela zdarzenia, tak jak win32. Czy moze sie myle? Czy jest mozliwe napisanie keyloggera pod konsole?

Możliwe to jest - choćby napisać sterownik do klawiatury (najlepiej przerobić jakiś isteniejący ;-) i dodać funkcję, która gdy podany ciąg będzie pasował będzie go przechwytywała).

Sęk w tym jak to napisać. Nie zagłębiałem się w pisanie sterowników więc nie powiem jak i co ;-(
netzah
Do czego zmierzam: czy przychwytywanie klawiszy pod linuxem odbywa sie poprzez system okieniek czy na nizszym poziomie?
kszychu
Cytat(netzah @ 2004-10-22 08:26:46)
Do czego zmierzam: czy przychwytywanie klawiszy pod linuxem odbywa sie poprzez system okieniek czy na nizszym poziomie?

A pomyśla sam. Gdyby to było na poziomie okienek, to jak mółbyś cokolwiek pisać pod konsolą?

Sorry za OT, ale nie mogłem się oprzeć.
netzah
Cytat(kszychu @ 2004-10-22 09:31:19)
A pomyśla sam. Gdyby to było na poziomie okienek, to jak mółbyś cokolwiek pisać pod konsolą?

To nietrafione spostrzezenie. Przeciez nie napisalem, ze to dopiero okienka obieraja zdarzenia z klawiatury i wszystko co jest "nizej" nie ma dostepu do klawiszy(a wlasnie to wynika z Twojego postu). Mowa jest o przechwytywaniu zdarzen z klawiatury przez nieaktywne procesy. Pod okienkami mozna zazyczyc sobie, zeby do naszego procesu docieraly wybrane zdarzenia, bo to okienka je rozsylaja, ale NIE sa to zdarzenia prosto z klawiatury. Sa to przeciez inne, nowe zdarzenia, generowane po odebraniu czegos ze sprzetu. To jest raczej jasne, bo przeciez np. pod win32 obieramy WM_KEYDOWN a nie cos tam z portu 0x60...
Teraz linux: np. pod takim Qt do aplikacji dociera zdarzenie, ze ktos wcisnal guziczek, a nie trzeba sobie pilnowac co sie dzieje ze sprzetem. A zdarzenie to generuja wlasnie okienka.
A teraz moja odpowiedź: moge pisac pod konsola, bo tez kwestie nie sa powiazane winksmiley.jpg
matid
Sterowniki nie reagują jak jestem pod innym terminalem (np. tty6), ale jak działam w obrębie X'ów to niezależnie co robię eventy są wyłapywane.
bela
tak z ciekawości winksmiley.jpg

czy zamiast:
  1. <?php
  2. class Sentinel extends ASentinel
  3. ?>


nie powinno być:
  1. <?php
  2. class Sentinel implements ASentinel
  3.  
  4. ?>


czy też myle z javą dry.gif
dag
Nie bo ASentinel jest klasą abstrakcyjną a nie interfacem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.