Entwickler-Ecke

WinForms - Testprogramm welches Einbinden beliebiger Tasten ermöglicht


xxperformance - Fr 02.11.12 16:58
Titel: Testprogramm welches Einbinden beliebiger Tasten ermöglicht
Hallo alle miteinander!

Ich bin absoluter Newbie was Windows Form Applications anbelangt.
Ich hatte vor einiger Zeit einen C#- Kurs in der Uni, der beschränkte sich aber weitestgehend auf Konsolenanwendungen.
Mittlerweile habe ich festgestellt, dass ich so gut wie alles vergessen habe, möchte mich aber wieder einarbeiten.

Ich habe es auf folgendes Programm abgesehen (im Anhang findet ihr ein Bild.):

Zunächst soll auf der linken Seite die Belegung von beliebigen Tasten ermöglicht werden.
Sprich: Man drückt auf den Button "Taste für Rot belegen" und im Textfeld daneben wird man aufgefordert eine Taste zu drücken.
Diese Taste soll aufgeschnappt werden (KeyPress oder KeyDown) und anschließend statt dem Text "Taste drücken!" im Textfeld ausgegeben werden.

Mein Problem bei der Sache:

Ich habe keine Ahnung wie ich die Ereignisse KeyPress/KeyDown nutze...

Ich hatte mir das wie folgt vorgestellt:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private void Rot_Click(object sender, EventArgs e)
        {
            textBox1.Text = ("Taste drücken!");
            while (true)
            {
                if (Taste wird gedrückt)
                    textBox1.Text = (Name der Taste oder Code);
                    break;
            };
        }

Der Code ist natürlich jetzt nur sinngemäß gemeint.

Gruß

xxperformance

Moderiert von user profile iconNarses: C#-Tags hinzugefügt
Moderiert von user profile iconNarses: BMP->PNG


Ralf Jansen - Fr 02.11.12 17:13

Entscheidend wie man das macht ist wo du möchtest das der Tastendruck aufgefangen wird.

a.) Nur in einem speziellen Control (z.B einer bestimmten Textbox)
b.) einer bestimmten Form
c.) alle Formen deiner Anwendung.
d.) System weit in Windows


xxperformance - Fr 02.11.12 17:17

In der aktiven Form soll das aufgefangen werden.

Ich hatte erst vor, manuell über eine Eingabe in der Textbox die Taste zu speicher, aber das ist irgendwie "unschön" finde ich.

Zudem funktioniert das mit Tasten wie STRG etc nicht.


thepaine91 - Fr 02.11.12 17:23

Das halte ich für ein Gerücht.

Aber die Dokumentation erklärt dir das auch ausgiebig:
http://msdn.microsoft.com/de-de/library/system.windows.forms.control.keydown.aspx


xxperformance - Fr 02.11.12 17:35

Ja das habe ich auch schon gefunden:
http://openbook.galileocomputing.de/visual_csharp/visual_csharp_15_001.htm#mj4769f7c8717626f642160202065f6b9b

mir klingelt jedoch der Kopf von Klasse, Objekten, Instanzen, Eigenschaften und Methoden.
Ich weiß absolut nicht wie ich diese Sachen benutzen soll.

"Das Objekt vom Typ KeyEventArgs, das der Ereignishandler in Empfang nimmt, enthält für uns wichtige Informationen, mit denen die Ursache der Ereignisauslösung exakt beschrieben wird."


C#-Quelltext
1:
public delegate void KeyEventHandler(object sender,KeyEventArgs e);                    


Heißt doch: KeyEventHandler benötigt eine object sender (z.B. Form1) und ein KeyEventArgs e (z.B. KeyPress)?

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


Ralf Jansen - Fr 02.11.12 17:41

a.) KeyDown der Form verdrahten
b.) Die KeyPreview Property der Form auf true setzen (damit auch alles im Keydown der Form ankommt.)
c.) IsInputKey überschreiben wenn du bestimmte Tasten abbfangen willst die sonst schon vorher aussortiert worden wären (Enter, Tab, etc.)
d.) Im KeyDown Event der Form nun irgendwas nach deinen Wünschen veranstalten.


Zitat:
Heißt doch: KeyEventHandler benötigt eine object sender (z.B. Form1) und ein KeyEventArgs e (z.B. KeyPress)?


Das kann dir herzlich egal sein. Sender und EventArgs werden von dem Control gefüllt das diesen Event wirft (also z.B. den KeyDown Event deiner Form). Du fängst in nur und kannst die beiden Parameter auswerten (die sind auch immer da und nie null).


xxperformance - Fr 02.11.12 17:56

ich verstehe nicht wie das verdrahten funktioniert.

Wie "benutzt" man das Ereignis KeyDown?

Ich meine das funktioniert ja ähnlich wie das Ereignis Click für die Buttons...

nur ich befinde mich ja bereits "in" einem Ereignis

oder Erstelle ich quasi eine Methode, welche ständig auf KeyDown Events anspringt?


Ralf Jansen - Fr 02.11.12 18:18

Zitat:
Wie "benutzt" man das Ereignis KeyDown?


Im Winforms Editor wählst du die Form aus. In den Properties/Eigenschaften der Form kannst du dann auf die Events umschalten(das Blitz Icon) und siehst dann eine Liste aller möglichen Events.
Ein DoppelKlick auf den gewünschten Event erzeugt dann den passenden Code, verdrahtet den Event und navigiert dich an die passende Stelle wo der Code erzeugt wurde.

Oder wenn du das verdrahten lieber von Hand machen möchtest tust du das am besten im Konstruktor der Form unterhalb der InitializeComponent(); Methode.
Schreibe 'this.KeyDown +=' (dann geht auch schon ein Tooltip auf) und klicke nur noch TAB, TAB und der passende Code wird dir generiert.

Zitat:
oder Erstelle ich quasi eine Methode, welche ständig auf KeyDown Events anspringt?


Du erstellst einen EventHandler der bei jedem Tastendruck angestossen wird solange deine Form den Focus hat.


xxperformance - Fr 02.11.12 18:31

okay, das klappt jetzt. Aber das Problem ist, dass ich diese Abfrage ja nur ausführen möchte, nachdem der jeweilige Button gedrückt wurde.
Zudem soll die gedrückte Taste (nur) in der zugehörigen Textbox angezeigt werden... alle anderen bleiben unbetroffen.


Kann ich also in dem Event Rot_Click auf das Event Form1_KeyDown zugreifen?


Ralf Jansen - Fr 02.11.12 18:41

Die beiden Events haben nichts miteinander zu tun.

In Rot_Click musst du dir den KeyCode merken den du für Rot benutzen willst, entsprechend für die anderen Farben. Und im KeyDown Event dann abfragen ob der gerade gefangene Key einem der für die Farben gemerkten KeyCodes entspricht und dann das entsprechende tun.


xxperformance - Fr 02.11.12 19:24

Ich wollte das ja so machen, dass die Tasten beliebig bestimmt werden dürfen... als nicht schon vorher feststehen...
Ich habe das mal so gelöst, bin aber mit den if Abfragen nicht zufrieden. Gibt es da auch eine andere Lösung?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
       private int BoxNr = 1;
        private string Zwischenspeicher;

        public void Form1_KeyDown(object sender, KeyEventArgs e)
        {
                Zwischenspeicher = Convert.ToString(e.KeyData);
                if (BoxNr == 1)
                {
                    textBox1.Text = ("Taste " + Zwischenspeicher);
                    BoxNr = 0;
                }
                else
                {
                    if (BoxNr == 2)
                    {
                        textBox2.Text = ("Taste " + Zwischenspeicher);
                        BoxNr = 0;
                    }
                    else
                    {
                        if (BoxNr == 3)
                        {
                            textBox3.Text = ("Taste " + Zwischenspeicher);
                            BoxNr = 0;
                        }
                        else
                        {
                            if (BoxNr == 4)
                            {
                                textBox4.Text = ("Taste " + Zwischenspeicher);
                                BoxNr = 0;
                            }
                        }

                    }
                }


        }

        private void Rot_Click(object sender, EventArgs e)
        {
            textBox1.Text = ("Taste?");
            BoxNr = 1;                
        }
        private void Grün_Click(object sender, EventArgs e)
        {
            textBox2.Text = ("Taste?");
            BoxNr = 2;   
        }

        private void Blau_Click(object sender, EventArgs e)
        {
            textBox3.Text = ("Taste?");
            BoxNr = 3;   
        }

        private void Gelb_Click(object sender, EventArgs e)
        {
            textBox4.Text = ("Taste?");
            BoxNr = 4;   
        }


Moderiert von user profile iconNarses: Beiträge zusammengefasst

PS.: Kann man auch auf Tasten der Maus oder anderen Eingabegeräten reagieren?
Moderiert von user profile iconNarses: C#-Tags hinzugefügt