Problem mit "GetAsyncKeyState"

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem mit "GetAsyncKeyState"

    Hallo

    DP: Normalerweise sollte die Nachricht nur angezeigt werden, wenn die linke Maustaste gedrückt wird, allerdings wird die Nachricht auch angezeigt wenn die Taste "Umschalt" oder "Tab" gedrückt wird. Warum?

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
    3. Private Const VK_LBUTTON = &H1
    4. Private Const VK_RBUTTON = &H2
    5. Private Const VK_MBUTTON = &H4
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Timer1.Start()
    8. End Sub
    9. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    10. If GetAsyncKeyState(VK_LBUTTON) Then
    11. MessageBox.Show("Die linke Maustaste wurde gedrückt!")
    12. End If
    13. End Sub
    14. End Class


    Virtual-Key Codes: msdn.microsoft.com/de-de/library/windows/desktop/dd375731


    Ich hoffe auf euren Rat! :)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Jo, das ist nämlich ein ​Short (16 Bit), kein ​Integer (32 Bit).

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Dann halt, dass es auch kein Boolean ist. :P Habe mich da sehr schlecht ausgedrückt, weil ich eig. nur auf das ​Short rauswollte.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade - Danke, mit Short funktioniert es.

    Ich habe Option Strict On nun drin aber die Fehlermeldung verstehe ich nicht ganz: "Option Strict On" lässt keine impliziten Konvertierungen von Integer in Boolean zu.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Was also ist daran unklar?
    Dir ist doch klar, dass If einen Boolean - Ausdruck benötigt, oder?
    Ja, und welchen Datentyp gibt deine GetAsyncKeyState() - Methode zurück? - Short.

    Ja, und ein Short ist kein Boolean, und man kann ihn auch nicht implizit in einen Boolean konvertieren.
    Du könntest ihn aber zb explizit konvertieren:

    VB.NET-Quellcode

    1. if cbool(GetAsyncKeyState(bla))


    Übrigens dein Strict On ist ja hübsch, aber ich täte dringend empfehlen, das zum Prinzip zu machen, und VS auch so einzurichten: Visual Studio - Empfohlene Einstellungen

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

    ErfinderDesRades schrieb:

    Du könntest ihn aber zb explizit konvertieren:
    wäre falsch, da dort nur Null oder Nicht Null getestet würde.
    @Vultrax Du musst explizit den Rückgabewert testen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim b1 As Boolean = ((GetAsyncKeyState(Keys.ShiftKey) And &H8000) <> 0)
    3. Dim b2 As Boolean = ((GetAsyncKeyState(Keys.ControlKey) And &H8000) <> 0)
    4. If b1 AndAlso b2 Then
    5. MessageBox.Show("Shift + Control")
    6. End If
    7. End Sub
    Und deklariere die Funktion so, dass Du die .NET-Tasten-Codes übergeben kannst:

    VB.NET-Quellcode

    1. <DllImport("user32.dll")> _
    2. Private Shared Function GetAsyncKeyState(ByVal vKey As Keys) As Int16
    3. End Function

    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!