Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  VBasic / vb.net / vbs / wsh
  VB.NET: form.KeyDown Abfrage klappt nicht

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  VB.NET: form.KeyDown Abfrage klappt nicht (4042 mal gelesen)
KMassler
Ehrenmitglied V.I.P. h.c.
CAD Admin + Mädchen für Alles...



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2657
Registriert: 06.11.2000

SolidWorks Start 1999
** CSWP 01/2008 **
Dell Precision 7540 mobile Workstation,
64GB, Quadro RTX 3000;
SWX2020 SP5;
SAP/PLM+ECTR;
DriveWorks Pro;
Programmierung: VBA, aktuell Visual Studio 2017/VB.Net

erstellt am: 01. Apr. 2014 11:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von mseufert an!   Senden Sie eine Private Message an mseufert  Schreiben Sie einen Gästebucheintrag für mseufert

Beiträge: 2624
Registriert: 18.10.2005

erstellt am: 01. Apr. 2014 12:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von mseufert an!   Senden Sie eine Private Message an mseufert  Schreiben Sie einen Gästebucheintrag für mseufert

Beiträge: 2624
Registriert: 18.10.2005

HP Z420
WIN7 64 Win 10
UG NX6-2212
3D Printer Prusa MK2 S

erstellt am: 01. Apr. 2014 12:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2657
Registriert: 06.11.2000

erstellt am: 01. Apr. 2014 13:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von RSchulz an!   Senden Sie eine Private Message an RSchulz  Schreiben Sie einen Gästebucheintrag für RSchulz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2657
Registriert: 06.11.2000

erstellt am: 01. Apr. 2014 15:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz