Entwickler-Ecke

WinForms - KeyDownEvent abfangen


eddyp - Di 09.05.06 13:42
Titel: KeyDownEvent abfangen
mal stark vereinfacht (Prinzipbeispiel) das Problem - ein Form und ein button. In buttonclick läuft eine Schleife mit Application.doevents.

die Schleife soll verlassen werden mit key.up.

der keydown-(auch keypress)event wird schon for dem Application.doevents verarbeitet und kommt dort nicht an, bzw ist zuvor erledigt.
Wodurch die keydown Funktion nicht angesprochen wird.
Bei einer leeren Form, ohne Buttons, geht es, da nur das Formular den Event bekommt.

Was muss ich tun ?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private void button2_Click(object sender, System.EventArgs e)
{
   for (int i=1; i<1000; i++)           
   {
      Application.DoEvents();
      button1.Left = i;                 // Beispiel

      Thread.Sleep(speed);
   }
}

Es geht nicht :


C#-Quelltext
1:
2:
3:
4:
5:
protected override void OnKeyDown(KeyEventArgs kea)
    {
      if (kea.KeyCode == Keys.Up)
        Close();
    }

auch nicht:


C#-Quelltext
1:
2:
3:
4:
5:
6:
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
   if (e.KeyCode == Keys.Down)
          Close();
   e.Handled = true;
}

Das das alles über timer, abfragen und weis ich wie gehen würde ist klar, aber ich muss doch einen Tastaturevent benutzen können ?

Moderiert von user profile iconraziel: C#-Tags hinzugefügt


Kha - Di 09.05.06 22:22

Wenn der Button den Fokus hat, bekommt auch nur er die Windows-Messages - es sei denn, du schaltest KeyPreview der Form an.


eddyp - Mi 10.05.06 18:44

... heisst das, ich brauche nur den Fokus auf den button2 setzen und die Tastatureingabe geht an Application.doevent ? Ich komme erst morgen zum testen...


Kha - Mi 10.05.06 19:26

Ah, jetzt verstehe ich deinen gedanklichen Fehler. Application.DoEvents fischt keine Windows-Messages heraus und löst dann deinen Eventhandler aus, sondern lässt einfach alle Messages verarbeiten, bevor es weitergeht.
Du rufst also in der Schleife DoEvents auf, dieses lässt ein WM_KEYDingens zum Button passieren. Wenn nun KeyPreview == true ist, schickt der Button die Message zusätzlich zum Formular und dieses löst dann deinen Eventhandler aus.


eddyp - Do 11.05.06 09:16

... ich habe jetzt Form.keypreview = false und den Focus auf den Button --- > nix geht, der Focus wird beim Betätigen der Tasten UP und DOWN einfach zwischen Button hin und her.

Habe gerade noch malö probiert - mit der Abfrage auf (=Keys.A) oder (=Keys.F1) geht es nur DOWN und UP nicht ....

Kann es sein, dass die Pfeiltasten nicht mit "OnKeyDown" abgefragt werden, sondern mit einer anderen Funktion, da in meine "OnKeyDown" gar nicht reingegangen wird ?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
private void button1_Click(object sender, System.EventArgs e)
    {
      button1.Focus();      
      for (int i=1; i<1000; i++)
      {
        Application.DoEvents();
        button2.Left = i;
        Thread.Sleep(50);
        if (i == 999)
        i = 1;
      }
    }

    protected override void OnKeyDown(KeyEventArgs kea)  
    {  
      if (kea.KeyCode == Keys.Up)  // Keys.F1 oder Keys.A geht
        Close();  
      if (kea.KeyCode == Keys.Down)  
        Close();  
    }


Schulteatq - Fr 26.05.06 22:07

hab gerade über dem selben Problem gegrübelt und habe dazu folgendes gefunden
http://66.249.93.104/search?q=cache:a2_74wyCchQJ:http://www.spotlight.de/zforen/dnt/m/dnt-1135776418-16717.html+c%23+Keys.Left&hl=de&gl=de&ct=clnk&cd=4&lr=lang_de&client=firefox-a

Auf jeden Fall werden beim OnKeyDown Event die Pfeiltasten aus der e.KeyCode Argument aussortiert. Dies kann man entweder umgehen, indem man sich eine neue Klasse erstellt, die von dem eigentlichen Control ableitet und dann die

C#-Quelltext
1:
protected bool IsInputKey(Keys keyData)                    

überschreibt. Oder man nutzt einfach das OnKeyUp Event. Dort funktionierts.

mfg
Schulte