Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Interceptarea apasarii unei taste in c#

Avem o fereastra si vrem sa monitorizam (sau mai bine zis sa logam) fiecare apasare de tasta pe care userul o face in aplicatia noastra – asta este tema de discutie de azi.
Sa se scrie o aplicatie care sa logheze activitatea userului: ori de cate ori o tasta este apasata, acest lucru este “logat”, deocamdata intr-un textbox.

Pentru a primi notificari referitoare la alasarea tastelor, in proprietatile formului aplicatiei, proprietatea KeyPreview trebuie setata true.

Asta arata cam asa:

In tabul de evenimente, setam metode pentru evenimentele KeyDown si KeyPress.
Evenimentul KeyDown apare atunci cand userul apasa o tasta prima data. KeyPress este o combinatie de alte evenimente: KeyDown + KeyUp + Focus; asta se traduce cam asa: controlul care primeste acest eveniment trebuie sa aiba focus, iar userul sa apese si apoi sa ia degetul de pe buton (press and release).

Codul asociat acestor metode este:

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Alt)
                txtMonitor.Text += "Alt ";
            else if (e.Control)
                txtMonitor.Text += "Ctrl ";
            else if (e.Shift)
                txtMonitor.Text += "Shift ";
            else
            {
                if(e.KeyCode.ToString().Length!=1)
                    txtMonitor.Text += string.Format("{0} ", e.KeyData.ToString());
            }
        }

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(char.IsLetterOrDigit(e.KeyChar))
                txtMonitor.Text += e.KeyChar.ToString() + " ";
        }

asa cum se vede, fiecare apasare este scrisa in textbox-ul txtMonitor.

O sa mai pun cateva controale suplimentare pe form, numai ca sa pot avea focus in diverse puncte, si a verifica daca monitorizarea functioneaza indiferent de lucul unde este focusul pe forum. Arunc, pur si simplu, aiurea, cateva controale. Acum aplicatia mea arata asa:

La rularea aplicatiei se vede cum apasarile de tasta sunt afisate.

Cateva explicatii: monitorizarea nu functioneaza daca aplicatia nu este in focus – daca nu este aplicatia activa. Pentru a monitoriza si cand aplicatia nu este activa, avem nevoie de un pic de cod suplimentar, un hook pentru tastatura (eventual mouse), insa despre asta intr-un articol viitor.

De ce sunt 2 metode? Pentru ca in KeyPress pot monitoriza mai bine apasarile pe taste care reprezinta caractere tiparibile, iar in KeyDown se face monitorizarea tastelor care nu reprezinta un caracter tiparibil (enter, control, shift, f1-f12 etc).

Category: Uncategorized

Your email address will not be published. Required fields are marked *

*