Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: GetKeyState: Taste abfragen

GetKeyState: Taste abfragen
born
Liebe VBA-Experten,
ich hab das wunderschöne untenstehende Script hier bei Herber gefunden, damit ich
die Linke und rechte Maustaste abfragen kann. Leider erkennt er die Maustaste, sobald
das Skript gestartet ist, nur, wenn innerhalb VBA gedrückt wurde. Nicht im ExcelSheet.
Wenn im Excel-Sheet linke Maustaste gedrückt, passiert goar nix. Kann mir da jemand
helfen?
Herzlichen Dank,
Born
Zweck: Ich habe ein kleines Spielchen programmiert und möchte jetzt während der
Prozedur die Linke und Rechte Maustaste abfragen. Also so:
Sub MeinSpiel
gehe ins Sheet("Play")
Do (Loop) WarteAufKey
warte ab, bis linke oder rechte Maustaste gedrückt wurde
wenn linke Maustaste: Stop Loop, Tue X
wenn rechte Maustaste: Stop Loop, Tue Y
Loop Ende
End Sub

DIESE WaitForKey-Prozedur habe ich bei Herber gefunden:
Private Declare

Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Sub WaitForKey()
Dim strKey As String
strKey = ""
Sheets("Main").Activate
Do
If Abs(GetKeyState(1) 

Anzeige
hier ein Beispiel...
28.12.2009 17:51:25
Tino
Hallo,
hier ein Beispiel, die linke und rechte Maus kannst Du so aber nicht mehr benutzen.
Msgbox mit Esc oder Enter bestätigen.
Um damit etwas anfangen zu können, muss anstatt der Msgbox was gescheites stehen.
https://www.herber.de/bbs/user/66848.xls
Gruß Tino
Anzeige
AW: LinksKlick bei Prozedurstart.. ja, und aber...
28.12.2009 18:18:03
born
Hallo Tino,
danke sehr für das Beispiel, das mir sehr schwierigt vorkam. Einigermaßen habe ich es nun
trotzdem verstanden.
Mein Problem damit ist, daß (fast) jedesmal, wenn die Prozedur gestartet wird, sofort die
Meldung mit der linken Maustaste kommt. Also, AsycnKeyState gibt wieder, was seit der
letzten Abfrage gedrückt wurde und protokolliert jeden Linksklick, auch wenn nur die Prozedur gestartet wurde. Das ist aber natürlich völlig überflüssig. Es soll doch angezeigt werden, was NACH Prozedurstart
geklickt wird und nicht davor!
Da nur EINMAL die rechte oder linke Maustaste gedrückt wird, hab ich danach ein Exit Sub
eingefügt. Aber trotzdem: Wie schafft man, daß AsyncKey erst NACH Prozedurstart die
Mausklicks abfragt?
Ich danke dir sehr,
Born
Anzeige
verstehe nicht was Du meinst?
28.12.2009 18:30:55
Tino
Hallo,
die Prozedur wird doch erst nach dem linksklick ausgeführt.
Natürlich wenn Du die Msgbox mit der linken Maus bestädigst, wird diese auch wieder ausgeführt.
Gruß Tino
AW: verstehe nicht was Du meinst?
28.12.2009 19:47:06
born
Hallo Tino,
um die Endlosschleife auszuschalten habe ich Exit

Sub eingefügt:

Sub MausUeberwachen()
Dim Result%
KillTimer 0, hTimer
Result = GetAsyncKeyState(VK_LBUTTON)
If Result  0 Then
Call LinkeMaus
Exit Sub
hTimer = SetTimer(0, 0, 50, AddressOf Modul1.MausUeberwachen)
End If
End Sub
Jetzt wird nur noch die rechte Maustaste überwacht. Aber die läßt sich nicht
abschalten. Kannst Du mir helfen? Die linke oder rechte MaustasteMsgbox soll nur
einmal aufgehen. Dann die

Sub beenden. Ich weiß, das sind jetzt wirklich Anfänger-
fragen, aber sorry... that's what we are...
Danke,
Born

Anzeige
ok. nur einmal rechts u. einmal links
28.12.2009 20:04:32
Tino
Hallo,
ok. hier ein Beispiel um die aktion nur einmal für rechte Maus und einmal für linke Maus auszuführen.
https://www.herber.de/bbs/user/66853.xls
Gruß Tino
AW: ok. noch nicht ganz...
29.12.2009 13:01:53
born
Hallo Tino,
ich weiß, das ist etwas nervig, wenn man so lange an einer Sache hängt, und
es tut mir auch leid, aber ich habs einfach noch nicht.
Ich habe versucht, mir das Leben etwas leichter zu machen und Deine Timer, mit
denen ich mich gar nicht auskenne zu umgehen. Es ist ein Loop draus geworden.
(Warum eigentlich Timer? Ist der besser als Loop?)
Das Problem, das nach wie vor besteht, beschreibt ein Artikel im Internet:
"Bei einigen Projekten zur Tastaturüberwachung, die im Internet als Quellcode verfügbar sind, tritt das Problem auf, dass beim initialisieren des Aufzeichnungsvorhangs, also wenn die oben genannten Funktionen für eine Taste zum ersten Mal aufgerufen werden, ermittelt wird, dass diese gedrückt ist, obwohl dies nicht der Fall ist. Dies liegt daran, dass der Tastaturpuffer vor dem ersten Durchlauf der Tasten nicht leer ist."
(In unserem Beispiel, wenn die Prozedur das letzte Mal nicht mit der Enter-Taste
sondern durch Linksklick auf OK beendet wurde).
Dort schlägt der Autor etwas mit "CBool(GetAsyncKeyState(VK_MENU) And &H1)" vor.
Bekommt man das noch irgendwie in den Griff?
Do
ResultL = GetAsyncKeyState(VK_LBUTTON)
ResultR = GetAsyncKeyState(VK_RBUTTON)
If ResultL 0 Then
Call LinkeMaus
Exit Do
ElseIf ResultR 0 Then
Call RechteMaus
Exit Do
End If
Loop
Anzeige
AW: ok. noch nicht ganz...
29.12.2009 13:56:13
Tino
Hallo,
für die rechte Maus gibt es im Excel ein Event, dies braucht man nicht ständig abfragen.
Für die Linke, kannst Du eine Variable (Public oder Static, behalten die Werte) definieren
die auf True gesetzt wird wenn einmal die linke Taste gedrückt wurde.
Excel macht einen ständigen Dauerlauf auf längere Zeit nicht mit,
daher einen Timer der dieses Makro alle 50ms aufruft.
Gruß Tino
Anzeige
AW: ok. noch nicht ganz...
29.12.2009 16:18:36
born
Danke, Tino,
Du scheinst Dich wirklich auszukennen. Mein Können stößt hier schon an seine Grenzen.
Es bleibt immer noch die Frage, wie man verhindert, daß bei Prozedurstart, nicht die Mausklicks
VOR Prozedurstart ausgelesen werden. Wie gesagt, ich bekomme immer, wenn ich die Prozedur
mit Linksklick beende, beim nächsten Prozeduraufruf gleich die Meldung "Linke Maustaste", die
sich auf ein Ereignis VOR Prozedurbeginn bezieht. Weißt Du wie das verhindert werden kann?
Bin ich nervig? Richtig nervig?
Gruß,
Born
Anzeige
AW: ok. noch nicht ganz...
30.12.2009 09:09:16
Tino
Hallo,
kann ich nicht nachvollziehen in der Beispieldatei.
https://www.herber.de/bbs/user/66881.xls
Auskennen ist etwas übertrieben, ich fummle so lang bis es funktioniert.
Gruß Tino
AW: ok. noch nicht ganz...
30.12.2009 13:31:35
born
Danke, Tino,
hast mir sehr geholfen. Und Du warst sehr geduldig.
Born
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Tastendruck in Excel VBA abfragen: So funktioniert's


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.

  2. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeinWorkbookName)", wähle "Einfügen" und dann "Modul".

  3. Code einfügen: Füge den folgenden Code ein, um die linke und rechte Maustaste abzufragen.

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    
    Sub MausUeberwachen()
       Do
           If GetAsyncKeyState(1) <> 0 Then
               MsgBox "Linke Maustaste gedrückt"
               Exit Do
           ElseIf GetAsyncKeyState(2) <> 0 Then
               MsgBox "Rechte Maustaste gedrückt"
               Exit Do
           End If
           DoEvents ' Um die Anwendung nicht zu blockieren
       Loop
    End Sub
  4. Prozedur ausführen: Führe die MausUeberwachen-Prozedur aus, um die Maustasten zu überwachen.

  5. Beenden: Um die Überwachung zu beenden, kannst Du Exit Sub verwenden, wenn eine Maustaste gedrückt wird.


Häufige Fehler und Lösungen

  • Problem: Die Maustasten werden nicht erkannt, wenn die Prozedur gestartet wird.

    • Lösung: Stelle sicher, dass das Skript nicht bereits eine Maustaste registriert hat, bevor die Prozedur gestartet wird. Verwende DoEvents, um die Anwendung nicht zu blockieren.
  • Problem: Meldungen erscheinen sofort nach Prozedurstart.

    • Lösung: Setze eine Variable, die speichert, ob die Prozedur bereits gestartet wurde, und ignoriere vorherige Klicks.

Alternative Methoden

Wenn Du eine einfachere Lösung suchst, kannst Du auch die Excel-Events verwenden:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        MsgBox "Zelle A1 wurde ausgewählt."
    End If
End Sub

Diese Methode überwacht Zellenauswahlen anstelle von Mausklicks.


Praktische Beispiele

Hier sind zwei praktische Beispiele, die zeigen, wie Du GetAsyncKeyState verwenden kannst, um Tastenanschläge in Excel VBA zu überwachen.

  1. Einfache Überwachung:

    Sub TastendruckÜberwachen()
       Do
           If GetAsyncKeyState(vbKeyEscape) <> 0 Then
               MsgBox "Escape-Taste gedrückt"
               Exit Do
           End If
           DoEvents
       Loop
    End Sub
  2. Für ein Spiel: In einem Spiel kannst Du die linke und rechte Maustaste verwenden, um Aktionen auszulösen:

    Sub MeinSpiel()
       Do
           If GetAsyncKeyState(1) <> 0 Then
               MsgBox "Linke Maustaste: Aktion X"
               Exit Do
           ElseIf GetAsyncKeyState(2) <> 0 Then
               MsgBox "Rechte Maustaste: Aktion Y"
               Exit Do
           End If
           DoEvents
       Loop
    End Sub

Tipps für Profis

  • Verwende Timer: Timer sind effizienter als Schleifen, da sie die CPU nicht unnötig belasten. Verwende Application.OnTime, um den Code periodisch auszuführen.

  • Events nutzen: Nutze die Excel-Events, um Aktionen besser zu steuern, anstatt ständig die Tasten abzufragen.

  • Debugging: Verwende Debug.Print, um die Ergebnisse während der Entwicklung zu protokollieren, anstatt eine MsgBox zu verwenden.


FAQ: Häufige Fragen

1. Wie kann ich die Tasteneingaben in Excel VBA abfragen?
Du kannst die Funktion GetAsyncKeyState verwenden, um Tasteneingaben abzufragen. Achte darauf, dass Du die richtigen Tasten-Codes verwendest.

2. Funktioniert das auch in Excel 365?
Ja, diese Methode funktioniert in allen Versionen von Excel, die VBA unterstützen, einschließlich Excel 365.

3. Was ist der Unterschied zwischen GetAsyncKeyState und GetKeyState?
GetAsyncKeyState gibt den Status einer Taste zurück, unabhängig davon, ob die Taste gedrückt wird oder nicht, während GetKeyState den aktuellen Status der Taste zurückgibt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige