VB.NET Abfrage Probleme Return mit Enter Vernünftige abfrage Methode finden

  • VB.NET
  • .NET (FX) 4.0

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Ach mist peinlich
    ich sollte den code auch in den Form Load ereignis packen. jetzt geht es besser. danke für den denk anstoss.
    Deine methode sieht auch gut aus.

    VB.NET-Quellcode

    1. Private Sub FormLoadEinstellung()
    2. KeyControll_Timer.Interval = 100
    3. End Sub
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. FormLoadEinstellung()
    6. End Sub

    Xiantrius schrieb:

    Herzlichen dank für die tollen hilfen an:
    Dafür gibt es den Hilfreich-Button.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mir fällt auf das nur das hier funktioniert.

    ReturnKeyDown = 1835009
    ReturnKeyHold = 1075576833
    EnterKeyDown = 18612225
    EnterKeyHold = 1092354049

    Das funktioniert nicht obwohl ich die tasten los lasse. Die Frage ist ob die Werte falsch sind? Mir fällt auch auf das es negative Werte sind.
    ReturnKeyUp = -1071906815
    EnterKeyUp = -1055129599

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Xiantrius“ ()

    Anscheinend wird beim Loslassen kein ProcessCmdKey aufgerufen. ProcessKeyPreview hingegen wohl.
    Dort sind die Werte allerdings auch noch in der Tat andere beim Loslassen.

    VB.NET-Quellcode

    1. Private EnterlParam As Long
    2. Protected Overrides Function ProcessKeyPreview(ByRef msg As Message) As Boolean
    3. If msg.WParam.ToInt32 <> 13 OrElse TextBox1.Handle <> msg.HWnd Then Return MyBase.ProcessKeyPreview(msg)
    4. EnterlParam = msg.LParam.ToInt64
    5. Return MyBase.ProcessKeyPreview(msg)
    6. End Function
    7. Private Sub TextBox1_KeyUp(eventSender As Object, e As KeyEventArgs) Handles TextBox1.KeyUp
    8. If e.KeyCode <> Keys.Enter Then Exit Sub
    9. TextBox1.Text = EnterlParam.ToString
    10. End Sub

    hab das jetzt so gelöst in der textbox werden alle varianten angezeigt.
    Enter down
    Enter hold
    Enter up
    ebenso die Return taste.
    Habe es wenigstens geschafft das auf die art alternativ zu lösen. ;)

    VB.NET-Quellcode

    1. Protected Overrides Function ProcessKeyPreview(ByRef msg As Message) As Boolean
    2. Dim CheckReturnTaste As String = ""
    3. Dim lParamValue As Long = msg.LParam.ToInt64()
    4. If CType(msg.WParam, Integer) = KeyAskEnterReturn.Return_Enter Then
    5. Select Case lParamValue
    6. Case KeyAskEnterReturn.EnterKeyDown
    7. CheckReturnTaste = "Enter down"
    8. Case KeyAskEnterReturn.EnterKeyHold
    9. CheckReturnTaste = "Enter hold"
    10. Case KeyAskEnterReturn.EnterKeyUp
    11. 'FUNKTIONIERT NICHT!
    12. 'CheckReturnTaste = "Enter up"
    13. Case KeyAskEnterReturn.ReturnKeyDown
    14. CheckReturnTaste = "Return down"
    15. Case KeyAskEnterReturn.ReturnKeyHold
    16. CheckReturnTaste = "Return hold"
    17. Case KeyAskEnterReturn.ReturnKeyUp
    18. 'FUNKTIONIERT NICHT!
    19. 'CheckReturnTaste = "Return up"
    20. End Select
    21. If CheckReturnTaste = Nothing Then
    22. TextBox01.Text = TextBox01.Text.Replace("down", "up")
    23. TextBox01.Text = TextBox01.Text.Replace("hold", "up")
    24. Else
    25. TextBox01.Text = CheckReturnTaste
    26. End If
    27. End If
    28. MyBase.WndProc(msg)
    29. Return False ' Change True to False
    30. End Function

    @Xiantrius Du nutzt IntPtr.ToInt64().
    Warum nicht auch IntPtr.ToInt32()?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ob es jetzt IntPtr.ToInt32(), oder IntPtr.ToInt64() tut ist doch egal, funktioniert bei beiden varianten.
    bin mir bewusst das ToInt32 sparsamer ist und statt 8 byte die 4 byte nur nutzt.
    Ich stelle um auf 32.

    Edit:
    Muss wieder auf 64 stellen. Sonst macht er mecker mecker wegen überlauf verursacht.

    Fehlermeldung bei Int32:

    Quellcode

    1. System.OverflowException
    2. HResult=0x80131516
    3. Nachricht = Die arithmetische Operation hat einen Überlauf verursacht.
    4. Quelle = mscorlib
    5. Stapelüberwachung:
    6. at System.IntPtr.ToInt32() in f:\dd\ndp\clr\src\BCL\system\intptr.cs:line 125
    7. at Valheim_Config.Form1.ProcessKeyPreview(Message& msg) in D:\Programme\Visual Studio\VS Projekte\Visual Studio 2019 Enterprise\Save Debug\Valheim_Config\Form1.vb:line 1748
    8. at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
    9. at System.Windows.Forms.Control.WmKeyChar(Message& m)
    10. at System.Windows.Forms.Control.WndProc(Message& m)
    11. at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
    12. at System.Windows.Forms.RichTextBox.WndProc(Message& m)
    13. at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    14. at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    15. at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    16. at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    17. at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    18. at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() in f:\dd\vb\runtime\msvbalib\ApplicationServices\WindowsFormsApplicationBase.vb:line 779
    19. at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() in f:\dd\vb\runtime\msvbalib\ApplicationServices\WindowsFormsApplicationBase.vb:line 1472
    20. at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) in f:\dd\vb\runtime\msvbalib\ApplicationServices\WindowsFormsApplicationBase.vb:line 500
    21. at Valheim_Config.My.MyApplication.Main(String[] Args) in :line 83




    Jo, weil du das hier nicht hast, das sollte die allererste Zeile sein

    VB.NET-Quellcode

    1. If msg.WParam.ToInt32 <> 13 OrElse TextBox1.Handle <> msg.HWnd Then Return MyBase.ProcessKeyPreview(msg)
    Dein ProcessKeyPreview springt auf alles, was nicht bei 3 aufm Baum is und liest den lParam und da können auch Werte bei sein die nem 32 bit Integer über sind

    Xiantrius schrieb:

    funktioniert bei beiden varianten.
    Ich meinte Deinen Code in Zeile 5. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    Jo, weil du das hier nicht hast, das sollte die allererste Zeile sein

    VB.NET-Quellcode

    1. If msg.WParam.ToInt32 <> 13 OrElse TextBox1.Handle <> msg.HWnd Then Return MyBase.ProcessKeyPreview(msg)
    Dein ProcessKeyPreview springt auf alles, was nicht bei 3 aufm Baum is und liest den lParam und da können auch Werte bei sein die nem 32 bit Integer über sind


    Der Fehler bleibt bestehen
    Ich hab keinen anderen weg gefunden als Int64 zu nehmen.

    Vielleicht wäre es besser den code auch selbst durchzutesten bevor ihr einfach was schreibt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xiantrius“ ()