Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1124to1128
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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) 

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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge