Entwickler-Ecke
WinForms - KeyDown funktioniert nicht innerhalb einer "UserControl"
Beathoven - Mi 14.09.11 13:36
Titel: KeyDown funktioniert nicht innerhalb einer "UserControl"
Hallo zusammen,
ich tüftele gerade daran, meiner Applikation Tastenkürzel beizubringen.
In einer Form habe das bisher so gelösst:
1. ich definiere in der Form KeyPreview = true;
2. ich rufe den Delegate auf (MeineForm_KeyDown...).
Das klappt super :)
ABER:
ich habe nun ein UserControl Objekt erstellt. Dieses Objekt lade ich in ein Panel meiner Form:
C#-Quelltext
1:
| meinHauptPanel.Controls.Add(new IrgendeinUserControlObjekt()); |
Auch im UserControl Objekt gibt es eine Keydown-Methode, aber diese wird nie aufgerufen. Leider verstehe ich nicht warum.
Als ich einen ähnlichen Fehler innerhalb einer Form hatte, fand ich heraus, dass ich wie in Schritt 1 beschrieben vorgehen muss.
Das Problem: ein UserControl Objekt erbt nicht von einer Form, und damit hab ich auch einen Zugriff auf die KeyPreview-Eigenschaft.
jetzt komm ich nicht weiter - kann mir vielleicht jemand helfen?
Vielen Dank und viele Grüße,
Stefan
Ralf Jansen - Mi 14.09.11 14:05
Ich vermute du kannst in deinem UserControl einfach ProcessKeyPreview überschreiben und dort dein Bearbeitung vornehmen (anstatt in KeyDown)
Beathoven - Mi 14.09.11 14:13
Hey,
danke aber..ich bin noch recht neu in C#, würde es Dir was ausmachen ein Code-Snipplet anzufertigen?
Ein einfaches Überschreiben bewirkt bei mir nämlich gar nichts...
C#-Quelltext
1: 2: 3: 4: 5:
| protected override bool ProcessKeyEventArgs(ref Message m) { log.Info(m.WParam); return base.ProcessKeyEventArgs(ref m); } |
Ich hab da mal nen Brechpunkt reingesetzte, aber wie gesagt: die Methode wird nicht aufgerufen..
Ideen?
LG
Ralf Jansen - Mi 14.09.11 14:35
Ja. Ließ nochmal welche Methode ich gesagt habe die du überschreiben solltest und welche du überschrieben hast :wink:
Beathoven - Do 15.09.11 09:38
Me culpa - da waren die Augen wieder schneller als der Kopf, tut mir leid :)
Ich werde das mal versuchen und melde mich dann wieder... (mein Gott, wie peinlich,..)
Danke und LG
Beathoven - Do 15.09.11 09:50
Okay, damit funktioniert es schon eher - zumindest springt er bei einem Tastendruck in die Methode.
So richtig eine Idee, wie ich von da an die gedrückte Taste komme, habe ich aber noch nicht.
Magst Du mir nochmal helfen :) ?
Danke !
Ralf Jansen - Do 15.09.11 10:16
Die Windows Message bekommst du ja in der Methode übergeben. Die mußt du prüfen ob es eine WM_KEYDOWN Message war und dann sollte im WParam der gedrückte Key stehen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private const int WM_KEYDOWN = 0x0100;
protected override bool ProcessKeyPreview(ref Message m) { if (m.Msg == WM_KEYDOWN) { Keys key = (Keys)m.WParam; if (key == Keys.F1) { MessageBox.Show("F1 gedrückt"); return true; } } return base.ProcessKeyPreview(ref m); } |
Beathoven - Do 15.09.11 11:32
Ahhhh!
Ja okay- so tief bin ich noch nicht in die Materie vorgedrungen, aber wenn mans liesst, macht das auch Sinn :)
Viiiielen lieben Dank für die Hilfe :)
LG
Stefan
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!