Προς το περιεχόμενο

Capture Keyboard


NickTheGreek

Προτεινόμενες αναρτήσεις

Δημοσ.

Αν εννοείς πως να παρακολουθείς κάθε πλήκτρο που «πατάει» ο χρήστης (ανεξαρτήτως εφαρμογής) θα πρέπει να ασχοληθείς με τα Hook Functions των Windows: SetWindowsHookEx & KeyboardProc (υπάρχουν και άλλα για διάφορες άλλες παρακολουθήσεις...).

 

Συγκεκριμένα η KeyboardProc (ουσιαστικά ένα CALLBACK) θα πρέπει να τοποθετηθεί ως exportable function μιας DLL και από εκεί και πέρα να «εγκατασταθεί» στο σύστημα με την βοήθεια της SetWindowsHook (Win16s ή SetWindowsHookEx Win32s) από κάποιο εκτελέσιμο (EXE).

 

** Με αυτό τον τρόπο μπορείς σχετικά εύκολα να αναπτύξεις ενδιαφέρουσες εφαρμογές (όπως πχ. Keyboard spys κοκ...) αλλά θα πρέπει πρώτα να «κρύψεις» την εφαρμογή σου από τον task-manager : - )

Δημοσ.

Ki ego meta apo psaksimo ekei eixa kataliksei,alla einai arketa polyploko.

 

Auto pou thelo na kano einai na ftiakso ena programmataki pou me to patima enos pliktrou (aneksartitou efarmogis) na kanei orismena pragmata.

Ekana loipon disassemble ena gnosto programmataki to Roger Wilco sigkekrimena, to opoio me to patima enos pliktrou, aneksartitou efarmogis,stelnei ixo se diktio.E ayto to programma den xrisimopoiei Hooks.Oi mones leitourgies pou brika kai oi opoies anaferontai sto pliktrologio AMESA einai oi GetKeyboardLayout,GetKeyState kai MapVirtualKeyExA,apo tis opoies endiaferon exei mono h GetKeyState h opoia omos anaferetai stin efarmogi kai mono (me basi kati peiramata pou ekana,isos bebaia na exo kanei tipota lathi).

 

Mporei bebaia na xrisimopoiei alles leitourgies tis opoies den gnorizo.

 

Kammia protasi?

Δημοσ.

Λοιπόν το Roger Wilco κάνει κάτι πολύ έξυπνο θα έλεγα, προφανώς στήνει ένα message-loop (ο απλούστερος τρόπος είναι να δημιουργήσεις ένα κρυφό παράθυρο) και από εκεί και πέρα με τη βοήθεια (ίσως) ενός Timer παρακολουθεί την κατάσταση των πλήκτρων μέσο της ρουτίνας GetKeyState (πρέπει να είναι timer μιας και δεν κοστίζει σε CPU resources σε σχέση με τα Threads)!

 

Συγκεκριμένα κατάφερα να υλοποιήσω την παραπάνω λογική και να διαβάσω ανεξαρτήτως εφαρμογής την κατάσταση των πλήκτρων END & A χρησιμοποιώντας την αδελφή της GetKeyState την GetAsyncKeyState μιας και την προτιμώ αφού επιστρέφει άμεσες τιμές από την κατάσταση του hardware (και δούλεψε σε σχέση με την πρώτη : - ).

 

Μια σημείωση εδώ: Για να λαμβάνεις την κατάσταση των Special Virtual Keys όπως του ESCAPE, END κοκ. χρησιμοποιείσε ως παράμετρο τις σταθερές VK_xxxxxx που υπάρχουν δηλωμένες στο (Win32s API Reference) μην κάνεις όμως το ίδιο και για τα απλά πλήκτρα όπως τα γράμματα ή τους αριθμούς κοκ. αντίθετα όρισε τους απευθείας ως παραμέτρους της εντολής (υπάρχει σημείωση στο Win32s Reference και τουλάχιστο σε εμένα δεν δουλεύανε αλλιώς).

 

Πχ:

 

[..]

case WM_TIMER:

ShortKEY=GetAsyncKeyState(VK_END); //για special virtual keys είναι ΟΚ.

 

Αλλά

 

ShortKEY=GetAsyncKeyState(A); /*για το πλήκτρο Α και όχι VK_A γιατί δεν θα δουλέψει*/

 

If(LOBYTE(ShortKey))

{

MessageBeep(-1);

}

break;

[..]

 

** Πάντως είναι ένα παράδοξο μιας και το Win32s Help Reference διευκρινίζει ότι αν κάποια άλλη εφαρμογή έχει το keyboard focus τότε η ρουτίνα θα πρέπει να επιστρέφει μηδέν (έλα όμως που ο κώδικα λειτουργεί..anyway αυτά σε W98A!)

 

** Οι υπόλοιπες ρουτίνες (χωρίς να τις ψάξω περισσότερο) έχουν σαν σκοπό να βοηθήσουν την αποκωδικοποίηση των χαρακτήρων (από virtual keys σε ascii κοκ νομίζω δε ότι είναι απαραίτητες αφού η GetKeyState δεν διαχωρίζει σε Α αγγλικό πχ. και σε Α ελληνικό) τέλος η ρουτίνα GetKeyboardLayout έχει σαν σκοπό να επιστρέψει την γλώσσα του πληκτρολόγιου μιας thread (και επειδή το Roger Wilco τα κάνει όλα απλά δεν το έχω, συμπεραίνω από τα προαναφερθέντα) πάω στοίχημα ότι το κάνει με παράμετρο μηδέν (0 ,current thread).

 

*** Στη θέση σου θα κοίταζα και την GetKeyboardState που επιστρέφει ένα array με την κατάσταση των 256 virtual keys (ολόκληρου του ascii table υποθέτω).

 

**** Roger Wilco (χμ, εποχές Sierra On-Line : - )

 

Good Luck!

 

<small>[ 30-03-2002, 21:13: Το μήνυμα επεξεργάστηκε από: Directx ]</small>

Δημοσ.

Eyxaristo poly gia ton xrono sou,doueuei.

Aporo pos kai den eixa dei thn GetAsyncState.

 

Pantos tha mou menei h aporia gia to RW mias kai h GetKeyState den fainetai na xrisimeuei kapou.

 

Mia erotisi:

Ta timers den kostizoun se cpu resources?

Diladi se enan aplo ypologisti px sta 333MHz, an xrisimopoieis 5-6 timers sigxronos ti peripou epibarinsi tha exeis?

Δημοσ.

Αμελητέα σε σχέση με τα Threads μιας και η εκτέλεση τους είναι καθαρά message driven, συνεπώς η κλήση τους βασίζεται στην «διακριτική» ευχέρεια του συστήματος την στιγμή που τα Threads εκτελούνται συνεχώς σαν ένας C βρόχος for(; <img border="0" title="" alt="[Wink]" src="images/icons/wink.gif" /> { .. } ή while(1){ .. } οπότε «καταρρακώνουν» την CPU για την εκτέλεση άλλων εφαρμογών.

 

Χρησιμοποίησε Threads όταν έχεις να κάνεις κάτι ιδιαίτερα περίπλοκο, όπως πχ. ένα επαναλαμβανόμενο κομμάτι κώδικα και άρα χρειάζεσαι όσο το δυνατόν μεγαλύτερα ταχύτητα για αυτό (πχ. να βρεις όλους τους πιθανούς συνδυασμούς γραμμάτων μιας λέξης : - ) και βασίσου στα Timers όταν θες κάτι πιο απλό (παρακολούθηση ώρας, κατάστασης controls, input χρήστη, μικρά loops [for, while] κοκ..)

 

*Φυσικά και η ταχύτητα εκτέλεσης των Threads μπορεί να ρυθμισθεί μέσο εντολών WinAPI (πχ. SetThreadPriority, SetThreadPriorityBoost) αλλά σε καμία περίπτωση δεν φτάνουν την ευκολία των Timers (κατά τα άλλα όταν έχω να κάνω έναν ιδιαίτερα περίπλοκο «υπολογισμό» βασίζομε σε αυτά [threads]).

 

*Στα Windows 98 μπορείς να δεις την χρήση της CPU μέσο του εργαλείου System Monitor (οπότε βλέπεις ,μεταξύ άλλων, από πρώτο χέρι πόσο CPU consuming είναι ο κώδικας που σχεδιάζεις ή γενικότερα οι εφαρμογές που εκτελείς).

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...