Keyup erst NACH KeyDown.Problem!

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Keyup erst NACH KeyDown.Problem!

    Hallo leute :D

    ich hab ein problemchen ..

    undzwar benutz ich keydown und keyup in einem timer sieht so aus :

    VB.NET-Quellcode

    1. Select Case True
    2. Case GetAsyncKeyState(&H41) 'A
    3. SendMessage(lhWnd, WM_KEYDOWN, &H41, vbNullString)
    4. Case GetAsyncKeyState(&H42) 'B
    5. SendMessage(lhWnd, WM_KEYDOWN, &H42, vbNullString)
    6. Case Else
    7. End Select


    und mein problem ist das ich kein keyup einbinden kann zu jeder taste...
    ich habs schon einmal so probiert:

    VB.NET-Quellcode

    1. Select Case True
    2. Case GetAsyncKeyState(&H41) 'A
    3. SendMessage(lhWnd, WM_KEYDOWN, &H41, vbNullString)
    4. Case Else
    5. SendMessage(lhWnd, WM_KEYUP, &H41, vbNullString)
    6. End Select
    7. Select Case True
    8. Case GetAsyncKeyState(&H42) 'B
    9. SendMessage(lhWnd, WM_KEYDOWN, &H42, vbNullString)
    10. Case Else
    11. SendMessage(lhWnd, WM_KEYUP, &H42, vbNullString)
    12. End Select

    hat auch mit 2-3 tasten super funtioniert aber wenn dann alle buchstaben drinne sind wird der timer ziemlich langsam und die tasten kommen sehr spät an..

    so ich habs auch mal so probiert.:

    VB.NET-Quellcode

    1. If GetAsyncKeyState(&H41) Then 'A
    2. SendMessage(lhWnd, WM_KEYDOWN, &H41, vbNullString)
    3. Else
    4. SendMessage(lhWnd, WM_KEYUP, &H41, vbNullString)
    5. End If
    6. If GetAsyncKeyState(&H42) Then 'B
    7. SendMessage(lhWnd, WM_KEYDOWN, &H42, vbNullString)
    8. Else
    9. SendMessage(lhWnd, WM_KEYUP, &H42, vbNullString)
    10. End If

    funzt super aber mit mehreren tasten wirds wieder langsam...

    und jetz wollt ich euch fragen wie ich es machen kann das die keydown taste solange aktiv bleibt wie ich auch die taste drücke und nach dem loslassen die keyup aktiv ist für die zu letztgedrückte taste..oder halt ein keyup für jedes keydown da es mal sein kann das man auch 2 tasten gleichzeitig drückt..

    ich hoffe jemand kann mir helfen und ich hoffe ich hab mein problem gründlich genug erklärt ..
    wenn nicht sagt bescheid ;)


    mfg
    Resk

    VB.NET-Quellcode

    1. If GetAsyncKeyState(&H41) Then 'A
    2. SendMessage(lhWnd, WM_KEYDOWN, &H41, vbNullString)
    3. Else
    4. SendMessage(lhWnd, WM_KEYUP, &H41, vbNullString)
    5. End If
    6. If GetAsyncKeyState(&H42) Then 'B
    7. SendMessage(lhWnd, WM_KEYDOWN, &H42, vbNullString)
    8. Else
    9. SendMessage(lhWnd, WM_KEYUP, &H42, vbNullString)
    10. End If

    Also wenn A gedrückt war sendest du hiermit KeyDown-A und KeyUp-B. War A garnicht gedrückt, sendest du KeyUp-A und KeyUp-B.
    Wenn du so mit allen ca. 100 Tasten verfährst - was soll das arme Control machen, dass fast wie beiner DDOS-Attacke pausenlos mit KeyUps bombardiert wird?
    Zudem gibt GetAsyncKeyState() keine boolschen Variable zurück sondern einen Tristate Integer welcher angibt

    1. Wurde die Taste seit dem letzten Aufruf gedrückt?
    2. Wurde die Taste seit dem letzten Aufruf nicht gedrückt?
    3. Ist die Taste noch gedrückt.

    Geprüft wird das mittels einer And Verknüpfung

    VB.NET-Quellcode

    1. Dim ret As Integer = GetAsyncKeyState(Keys.A)
    2. If ret And &H8000 Then
    3. ' Taste "A" ist momentan gedrückt
    4. ElseIf ret And &H1 Then
    5. ' Taste "A" ist momentan gedrückt
    6. else
    7. ' Taste "A" wurde seit dem letzten Aufruf nicht gedrückt
    8. End If
    Danke für eure antwortetn :D

    stimmt mit dem else da wird da programm wirklich mit keups bombadiert das hab ich garnicht gemerkt^^


    VB.NET-Quellcode

    1. 2
    2. Dim ret As Integer = GetAsyncKeyState(Keys.A)
    3. If ret And &H8000 Then
    4. ' Taste "A" ist momentan gedrückt
    5. ElseIf ret And &H1 Then
    6. ' Taste "A" ist momentan gedrückt
    7. else
    8. ' Taste "A" wurde seit dem letzten Aufruf nicht gedrückt
    9. End If


    das hab ich gerad auf anhieb nicht richtig verstanden was ist die &H8000 da und die &H1 sind die bei jedem buchstabe da?

    und muss ich "ret" für jeden buchstabe machen? also "retA" retB" retC" usw...
    unnd

    VB.NET-Quellcode

    1. If ret And &H8000 Then
    2. ' Taste "A" ist momentan gedrückt
    3. ElseIf ret And &H1 Then
    4. ' Taste "A" ist momentan gedrückt


    hier ist ja auch irgendwie was falsch oder? bewirken beide fragen auf "momentan gedrückt"?





    mfg
    Resk

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

    Resk schrieb:

    und muss ich "ret" für jeden buchstabe machen?

    für jede Taste - das sind nochn bischen mehr.

    Aber jetzt nicht 102 Variablen deklarieren, sondern denk dir was aus, um es in einer Schleife zu lösen.

    Was willst du ühaupt machen? - vlt. wärest du ja mit einer Hotkeyregistrierung besser bedient.
    ich habs jetz mal auf paar buchstaben übernommen ist genau das selbe problem das das control sehr langsam wird...
    oder hab ich vllt was falsch gemacht?

    aber nicht in einer schleife sondern einfach als if abfragen...if retA, if retB und anscheinend ist das falsch ^^

    wie meinst du das mit ner schleife?


    edit:
    was ich machen will ist die tasten die gedrückt werden an einen inativen fenster zu senden^^...
    Mach die eine Klasse wodrin alle Tasten abspeicherst, in der Klasse gibts eine Variable IsPressed True/False. Mit der API Funktion prüfst du in einer Schleife jedes Klassenobjekt ändert sich der Status der Taste zu "gedrückt" wird die SendMessage für KeyDown übermittelt und gleichzeitig die Boolsche Variable gesetzt.
    Ändert sich der Status der Taste zu "nicht gedrückt" UND ist die boolsche Variable True, dann übermittle die SendMessage KeyUp.

    Ist doch nicht so schwierig, wobei sich Picos Vorschlag mit der GetKeyboardState für dein Vorhaben besser anhört

    pinvoke.net/default.aspx/user32.getkeyboardstate
    okey das mit der boolean funktion funktioniert..

    aber sagen wir nach keydown wirds auf true gesetzt und bei keyup wird nach gefragt ob es auf true gesetzt ist und dann wird keyup ausgeführt..

    aber dann wird doch jedes keyup auch wieder ausgeführt oder nicht? :O oder liege ich falsch?
    Du hast es Falsch verstanden. Es kann nur Geprüft werden

    - ist die Taste gedrückt
    - wurde die Taste gedrückt

    Eine Prüfung "wurde die Taste losgelassen" gibt es nicht, also musst du sie selbst bauen. Eine Taste kann nur dann losgelassen werden nachdem man sie gedrückt hat. Also wird die Variable auf True gesetzt wenn die Taste gedrückt IST. Beim nächsten Aufruf der Funktion wird geprüft ist die Taste immernoch gedrückt? Wenn nein, ist die Variable "Gedrückt" auf True? Wenn ja war die Taste beim letzten Aufruf gedrückt und wurde nun losgelassen, folglich wird das KeyUp gesendet und die Variable Gedrückt wieder aus False gesetzt.

    Aber nochmals, löse dich vom GetAsyncKeyState, das wird für die gesamten Tasten zulange dauern, wieso nutzt du nicht die von mir genannte Methode??
    tut mir leid dodo...das DU SO gut bist in vb...aber mich kotzt das echt an das das hier manche gibt (AUCH DU) die ALLE die fragen haben in einen topf stecken und dann heist es "OHHH tut mir leid kein copy und paste code.." "lern vb" usw...

    ich hab auch echt keine lust mehr hier nachzufragen...
    angeblich nette community....NIX, wo ist die nette community hier...


    ICH sage doch selber ICH VERSTEH NICHTS!!heist ja eig ...ich hab versucht mich einzulesen was aber nicht so funktioniert hat..
    ich MÖCHTE KEIN copy und paste code ich komm auch gut ohne zu recht....NUR EIN BISSCHEN HILFE kann man verlangen warum ich auch HIER mein problem gepostet habe...ich sitz jetz schon ne woche an dieser mist sache ...

    mfg
    Resk