Cum de a lega cheie de tastatură pentru butonul cu stiva de preaplin # formă în limba rusă

WinForms și tastatură, combinație destul de distractiv, mai ales atunci când încercați să le forțați să lucreze în armonie.

Orice control poate răspunde la apăsarea tastelor și la această identificate mai multe evenimente: Control.KeyDown. Control.KeyPress. Control.KeyUp. Pare să fie bine, abona la evenimente și de a obține un răspuns pe taste. Dar există o captură - aceste evenimente sunt declanșate numai în cazul în care controlul este focalizat. În plus, multe controale sunt deja chei standard de manipulare, mulți reacționează la spațiu ca un clic, iar TextBox și rudele lui intercepta aproape întreaga tastatură.

2. Forma aceluiași controlling

Clasa Forma moștenește, de asemenea, de control și este capabil de a primi aceste evenimente. Pare a fi evident, este transferat la prelucrarea formei de evenimente-cheie și să se bucure, se pare, de asemenea, să fie mereu în centrul atenției. Dar nu este deloc ușor. În cazul în care un control copil este configurat să proceseze cheile și este focalizat (și dacă există copii în formă de control, una dintre ele trebuie să fie în centrul atenției), atunci formularul va ignora pur si simplu intrarile de la tastatura.

Puteți aminti proprietățile Forma Form.KeyPreview. care este proiectat pentru a intercepta evenimente atunci când evenimentele-cheie sunt transmise mai întâi în formă. Aceasta pare a fi o versiune de lucru, dar dacă nu doriți funcționalitatea standard a controalelor a fost încă de lucru, trebuie să vă amintiți să setați proprietatea KeyPressEventArgs.Handled = false; că, după procesarea evenimentelor de la tastatură la nivelul formularului, acesta a fost transferat la controalele copil. Sincer, acest lucru nu este cea mai bună opțiune, deoarece Ea are limitările sale și nu toate problemele pot fi rezolvate în acest fel. Deși el pare să facă și să se gândească.

Prima opțiune pentru a rezolva problema fara privind samanismul - pentru a adăuga la meniul sub forma feței MenuStrip. Meniul este realizat în așa fel încât fiecare dintre elementele sale, aveți posibilitatea să fixați hotkey, și intercepteaza toate evenimentele de la tastatură pentru meniul lor de funcționare corectă și dă în continuare numai cele care nu implică clicuri pe tastele specificate și combinațiile. O metodă de toate este bun, dar un cuplu de lucruri: pentru toate cheile potrivite și combinațiile au nevoie de un element de meniu și doriți meniul în sine pe formular. În cazul în care prima problemă poate fi încă rezolvată prin utilizarea unor elemente ascunse (nu a fost testat personal), al doilea - într-adevăr o problemă, deoarece Ea nu permite nici o formă de aplicare prezența meniului ei, și adăugați-l doar pentru cheia de procesare. bine, te punctul meu.

4. Soluția universală

Nu vă grăbiți să se bucure, toate punctele anterioare necesare stăpânirea de doar un clic de mouse pe interfața de proiectare, și apoi trebuie să scrie cod.

Sub formă, precum și orice control are o metodă ProcessCmdKey virtuală. care este responsabil pentru procesarea evenimentelor de la tastatură implicite de credit, deci este nevoia de a redefini formularul nostru pentru a obține funcționarea așteptată și corectă a tastaturii.

Apelarea Metoda de bază - nu este necesară. Pentru transferul de control al unui eveniment de filială îndeplinește rezultatul metodei, doar un pic de logică, dimpotrivă: adevărat - cheia este procesată, nu este necesară o prelucrare ulterioară; fals - evenimentul va fi transferat la controlul unei filiale, chiar dacă face unele de pre-procesare. Astfel, aveți control complet asupra prelucrării evenimentelor de la tastatură la nivel de formă, sau a unui control particularizat.

Avantajul acestei metode constă în faptul că veți obține acces la parametrul keyData. care, spre deosebire de KeyPressEventArgs conține nu numai simbolul afișat, precum și toate informațiile cu privire la tasta apăsată, inclusiv codul de scanare, starea tastelor de modificare și alte informații utile. Pentru asta, ce fel de eveniment a avut loc, este responsabil pentru stabilirea msg. care conține un mesaj de sistem WinAPI. Suntem interesați aparținând WM_KEYDOWN tastatură și WM_KEYUP. Eveniment apăsare de tastă - obtinerea de fapt WM_KEYDOWN coerente și WM_KEYUP.

5. Deci, cum să profite de?

Da, de fapt, ca de obicei. Prin apăsarea tastei și faceți clic pe butonul este o acțiune de utilizator, care ar trebui să cauzeze un fel de program de reacție. Reacția este descrisă printr-o metodă privată separată și clicurile pe butoane manipulare și tastare pune un apel la această metodă. Această abordare elimină necesitatea de a copia codul, codul de manipulare eveniment se reduce la minimum și permite apelantului să specifice reacția de program prin orice mijloace necesare, fie că este un clic pe orice control sau de selecție a butonului caseta de selectare sau radio, o tastă sau o combinație, meniu, sau toate dintr-o dată. Codul de răspuns este într-un singur loc și, dacă este necesar, modificați nu trebuie să se gândească în cazul în care i-ați uitat pentru a corecta.

Dacă aveți suficient entuziasm, am aduna mai târziu în acest răspuns link-uri la întrebările legate cu răspunsuri bune. Între timp, primul lucru găsit fără săpat adânc: