Autor Beitrag
xxperformance
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 02.11.12 16:58 
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:
ausblenden 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
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 02.11.12 17:23 
Das halte ich für ein Gerücht.

Aber die Dokumentation erklärt dir das auch ausgiebig:
msdn.microsoft.com/d...control.keydown.aspx
xxperformance Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 02.11.12 17:35 
Ja das habe ich auch schon gefunden:
openbook.galileocomp...26f642160202065f6b9b

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."

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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).

Für diesen Beitrag haben gedankt: xxperformance
xxperformance Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: xxperformance
xxperformance Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



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

ausblenden volle Höhe 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