| | | 17 Optionen für korrosionsbeständige Teile: Metalle und Nachbearbeitungen, ein Fachartikel
|
Autor
|
Thema: VB.NET: form.KeyDown Abfrage klappt nicht (4083 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 01. Apr. 2014 11:46 <-- editieren / zitieren --> Unities abgeben:
Hi Experten, ich habe ein Programm, das wie üblich über diverse Buttons bedient wird. Zusätzlich sollen diese Buttons der Main-Form über Shortcuts angesprochen werden. Dazu frage ich den Tastenzustand über das KeyDown-Event ab:
Code: Private Sub MainForm_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown Try If e.Control And e.KeyCode = Keys.S Then 'Streuerung-S gedrückt If interactive Then btnSaveList_Click(Me, e) Else End If Else Select Case e.KeyCode.ToString Case "F1" If interactive Then BtnHelp_Click(Me, e) Else End If Case "F5" If interactive Then btnReadComponents_Click(Me, e) Else End If Case "Return" MsgBox("Return gedrückt!") If interactive Then btnDoit_Click(Me, e) Else End If Case "Escape" MsgBox("Esc gedrückt!") If interactive Then 'BtnExit_Click(Me, e) Else If MessageBox.Show(My.Resources.msgCancelAction, Me.Text, _ MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _ Windows.Forms.DialogResult.Yes Then 'Abbrechen: BtnExit_Click(Me, e) End If End If Case "F2" MsgBox("F2 gedrückt!") Case Else 'Keine Aktion End Select End If Catch ex As Exception MsgBox("ups!") End Try End Sub
So weit so gut, das Programm reagiert auf alle hier definierten Tasten wie gewünscht, ich kann es um beliebige Tasten erweitern und alles klappt- mit einer Ausnahme: Return Wenn ich die Taste Return drücke, wird diese Sub gar nicht durchlaufen, das Programm wird einfach beendet (was es mit Return nicht soll!), wie wenn ich Escape gedrückt hätte. Auch die "MsgBox("Return gedrückt!")" wird nicht angezeigt. Ich habe den entsprechenden Button auch schon der Eigenschaft "AcceptButton" der Form zugewiesen, trotzdem passiert mit Reurn nicht das, was passiert, wenn ich den Button anklicke. Ich habe auch einen Menüstrip drin, den ich im Verdacht hatte. Aber dort ist dem Punkt "Beenden" der Shortcut Alt-F4 zugewiesen. Return lässt sich als Shortcut auch gar nicht auswählen. Bin ratlos... [Edit] Bin schon etwas weiter gekommen. Das Problem ist, dass bei Programmstart der Exit-Button selektiert ist. Und der Druck auf Return führt den aktuell selektierten button aus. Die Frage ist also, wie kann ich -
- verhindern, dass Buttons selektiert sind, auch nachdem drauf geklickt wurde
- dafür sorgen, dass die Return-Taste immer das ausführt, was ich für sie vorgesehen habe, unabhängig davon, was gerade zufällig selektiert ist.
??? [/Edit] ------------------ Klaus www.al-ko.com | mein Gästebuch [Diese Nachricht wurde von KMassler am 01. Apr. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005
|
erstellt am: 01. Apr. 2014 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Zitat: Original erstellt von KMassler:
Wenn ich die Taste Return drücke, wird diese Sub gar nicht durchlaufen ...
Hallo Klaus, würde einfach mal drauf tippen, dass ein anderes Control den Focus hat. Die Frage ist welches ? Das lässt sich evtl. rauskriegen, indem Du den Debugger auf Einzelschritte stellst und dann Return drückst. Oder im FormClosing-Event einen Haltepunkt setzen und im CallStack nachsehen, was davor aufgerufen wurde. Irgendwo muss der Tastendruck ja verarbeitet werden. Wenn's so nicht geht, tippe ich auf ein anderes Programm, das auf Windowsebene die Message abfängt und nicht, oder nicht korrekt weitergibt. Hast Du was laufen, das z.B. Komma in Punkt wandelt ? Gruß, Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 01. Apr. 2014 12:37 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
... typischer Fall von nicht synchronisiertem MultiThreading ... OK, wenn's der ExitButton ist, dann gib' doch einem anderen Control den Focus, das keine unerwünschte Aktion draus macht. Oder versuch's mit SelectNextControl. Gruß, Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000
|
erstellt am: 01. Apr. 2014 13:41 <-- editieren / zitieren --> Unities abgeben:
nee nee nee, genau das ist ja das Problem: Beim Programmstart hat der Exit-Button den Focus, im Verlauf der Benutzung hat mal der mal jener Button den Focus. Und wenn ich Return drücke, wird genau dieser Button dann ausgeführt. Aber genau das will ich verhindern! Wenn ich Return drücke, soll eine definierte Aktion ausgeführt werden, egal welcher Button den Focus hat. Ich hab da auch was gefunden bei ActiveVB. In einem kleinen Testprogramm (1 Form, 2 Buttons) funktioniert das hervorragend. Aber in meinem richtigen Programm ändert sich gar nix ------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Ehrenmitglied V.I.P. h.c. Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 01. Apr. 2014 15:14 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Klaus, versuch es mal mit folgender Funktion innerhalb deiner Form... Code:
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys)As Boolean If msg.WParam.ToInt32() = CInt(Keys.Enter) Then MsgBox("Die Entertaste wurde gedrückt!") Return True else Return MyBase.ProcessCmdKey(msg, keyData) End If End Function
Das Problem ist, dass im Standard die Form bzw. außerhalb des Focus keine Taste verwertet wird. Mit KeyPreview=True wird dann entsprechend der Handler registriert. Das bringt dich der Enter-Taste allerdings nicht näher, da diese nicht verwertet wird bzw. eben als Klick des aktiven Feldes gewertet wird. Hier kannst du Quasy nur die Basisklasse überschreiben... ------------------ MFG Rick Schulz Nettiquette (CAD.de) - Was ist die Systeminfo? - Wie man Fragen richtig stellt. - Unities
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000
|
erstellt am: 01. Apr. 2014 15:58 <-- editieren / zitieren --> Unities abgeben:
Hey das ist cool und so schön schlank Funktioniert bestens. Ein bischen Verzierung dazu, um festzustellen, ob die Enter-Taste gerade benötigt wird (z.B. beim Editieren in einem Eingabefeld etc.), die Leertaste auch noch verarbeiten und fertig. Bin begeistert Code: Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean Select Case msg.WParam.ToInt32() Case CInt(Keys.Enter) If DataGridView.CurrentCellAddress.X = dgNewFilename And DataGridView.CurrentCell.IsInEditMode Then Return MyBase.ProcessCmdKey(msg, keyData) Else Debug.Print("Returntaste gedrückt") 'Ausführen: btnDoit_Click(Me, Nothing) Return True End If Case CInt(Keys.Space) If DataGridView.CurrentCellAddress.X = dgNewFilename And DataGridView.CurrentCell.IsInEditMode Then Return MyBase.ProcessCmdKey(msg, keyData) Else 'nix machen Debug.Print("Leertaste gedrückt") Return True End If Case Else Return MyBase.ProcessCmdKey(msg, keyData) End Select End Function
------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|