Autor Beitrag
eddyp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 58



BeitragVerfasst: Di 09.05.06 13:42 
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 ?

ausblenden 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 :

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

auch nicht:

ausblenden 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

_________________
Grüsse, eddyp
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 58



BeitragVerfasst: 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...

_________________
Grüsse, eddyp
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 58



BeitragVerfasst: 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 ?

ausblenden 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();  
    }

_________________
Grüsse, eddyp
Schulteatq
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 16



BeitragVerfasst: Fr 26.05.06 22:07 
hab gerade über dem selben Problem gegrübelt und habe dazu folgendes gefunden
66.249.93.104/search...amp;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
ausblenden C#-Quelltext
1:
protected bool IsInputKey(Keys keyData)					

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

mfg
Schulte