Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

GetKeyState: Taste abfragen | Herbers Excel-Forum


Betrifft: GetKeyState: Taste abfragen von: born
Geschrieben am: 28.12.2009 17:25:30

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) < 0) Then
      strKey = "LeftMouse"
      Exit Do
    End If
    
    If Abs(GetKeyState(2) < 0) Then
      strKey = "RightMouse"
      Exit Do
    End If
   
    DoEvents
  Loop
  
  Select Case strKey
    Case "LeftMouse"
    MsgBox "Left Mouse gedrückt"
    Case "RightMouse"
    MsgBox "Right Mouse gedrückt"
  End Select
End Sub

  

Betrifft: hier ein Beispiel... von: Tino
Geschrieben am: 28.12.2009 17:51:25

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


  

Betrifft: AW: LinksKlick bei Prozedurstart.. ja, und aber... von: born
Geschrieben am: 28.12.2009 18:18:03

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


  

Betrifft: verstehe nicht was Du meinst? von: Tino
Geschrieben am: 28.12.2009 18:30:55

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


  

Betrifft: AW: verstehe nicht was Du meinst? von: born
Geschrieben am: 28.12.2009 19:47:06

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



  

Betrifft: ok. nur einmal rechts u. einmal links von: Tino
Geschrieben am: 28.12.2009 20:04:32

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


  

Betrifft: AW: ok. noch nicht ganz... von: born
Geschrieben am: 29.12.2009 13:01:53

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


  

Betrifft: AW: ok. noch nicht ganz... von: Tino
Geschrieben am: 29.12.2009 13:56:13

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


  

Betrifft: AW: ok. noch nicht ganz... von: born
Geschrieben am: 29.12.2009 16:18:36

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


  

Betrifft: AW: ok. noch nicht ganz... von: Tino
Geschrieben am: 30.12.2009 09:09:16

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


  

Betrifft: AW: ok. noch nicht ganz... von: born
Geschrieben am: 30.12.2009 13:31:35

Danke, Tino,

hast mir sehr geholfen. Und Du warst sehr geduldig.

Born


Beiträge aus den Excel-Beispielen zum Thema "GetKeyState: Taste abfragen"