Discussion:
VBA 2002: Application.Wait vs. Application.OnTime
(zu alt für eine Antwort)
Peter Schleif
2008-02-23 16:04:58 UTC
Permalink
Hallo.

Ich habe hier ein Verhalten in VBA, dass ich nicht verstehe und wollte
mal fragen, ob mir das jemand erklären kann:

Drei Funktionen liefern den Status der Steuerungstasten. Jeweils eine
für Shift, Ctrl und Alt.

0 = keine gedrückt
1 = nur links
2 = nur rechts
3 = beide

Zum Überprüfen gibt es die Prozedur status(), welche die drei Status
im Debug-Fenster ausgibt. Damit genug Zeit ist, die Taste(n) zu
drücken, gibt es eine Verzögerung von zwei Sekunden mit
Application.Wait. Aber das funktioniert zumindest für Links-Alt
_nicht_ korrekt.

Shift Ctrl Alt
Soll: 0 0 1
Ist: 0 0 0

Wenn ich die Prozedur status() aber von einer anderen Prozedur
(status2) mit Application.OnTime (auch 2 sec Verzögerung) aufrufe,
dann klappt es.

Woran kann das wohl liegen?

Hier das komplette Modul. Vielen Dank im voraus.

Peter

----------------------- Code --------------------------------
Option Explicit


Private Declare Function GetKeyState Lib "user32" ( _
ByVal nVirtKey As Long) As Integer


Sub status()
Application.Wait Now + 2 / 86400
Debug.Print StatusShift, StatusCtrl, StatusAlt
End Sub


Sub status2()
Application.OnTime Now + 2 / 86400, "status"
End Sub


Public Function StatusShift() As Integer
StatusShift = IIf(GetKeyState(&HA0) And &HFF80, 1, 0) _
+ IIf(GetKeyState(&HA1) And &HFF80, 2, 0)
End Function


Public Function StatusCtrl() As Integer
StatusCtrl = IIf(GetKeyState(&HA2) And &HFF80, 1, 0) + _
IIf(GetKeyState(&HA3) And &HFF80, 2, 0)
End Function


Public Function StatusAlt() As Integer
StatusAlt = IIf(GetKeyState(&HA4) And &HFF80, 1, 0) + _
IIf(GetKeyState(&HA5) And &HFF80, 2, 0)
End Function
-------------------------------------------------------------
Dr. Eckehard Pfeifer
2008-02-23 16:18:06 UTC
Permalink
Hallo, Peter, das Verhalten kann ich nicht erklären. Aber ich habe
sowas mal mit GetAsyncKeyState statt GetKeyState umgesetzt. Vielleicht
ist das eine Alternative? Noch ein Tipp: Etwas übersichtlicher kann es
mit Verwendung von Konstanten werden, die findest Du in der
win32api.txt, falls die noch irgendwo rum liegt.
--
MfG EP
Entwicklung - Beratung - Training (www.dr-e-pfeifer.net)
XL-Funktionsverzeichnis (ISBN: 3860636898)
MS Office 2003 - Das Entwicklerbuch (ISBN 3-86063-688-X)
Peter Schleif
2008-02-24 09:53:56 UTC
Permalink
Post by Dr. Eckehard Pfeifer
GetAsyncKeyState statt GetKeyState
Super. Damit klappt's. Vielen Dank.
Post by Dr. Eckehard Pfeifer
Noch ein Tipp: Etwas übersichtlicher kann es
mit Verwendung von Konstanten werden
Meinst Du VK_LSHIFT, VK_RSHIFT, etc.?

Die müsste ich dann ja alle mit Const definieren, obwohl sie nur
einmal verwendet werden und sich ja auch nicht mehr ändern. Ist zwar
aussagekräftiger, aber IMHO nicht übersichtlicher. Trotzdem vielen
Dank auch für diesen Tipp.
Post by Dr. Eckehard Pfeifer
win32api.txt, falls die noch irgendwo rum liegt.
Hmmmmm. Ich müsste irgendwo noch eine uralte win32hlp.chm haben. Die
war damals mal beim LCC-Compiler dabei. Ob ich die noch finde....


Peter
Dr. Eckehard Pfeifer
2008-02-24 10:13:29 UTC
Permalink
Hallo, ist zwar nicht die neueste, aber manchmal brauchbar:

http://www.mcfedries.com/books/vba2000unleashed/Win32API.txt

VK_LSHIFT, VK_RSHIFT ist so schlecht nicht, da man die Dinge auch noch
nach einem Monat versteht :-)
--
MfG EP
Entwicklung - Beratung - Training (www.dr-e-pfeifer.net)
XL-Funktionsverzeichnis (ISBN: 3860636898)
MS Office 2003 - Das Entwicklerbuch (ISBN 3-86063-688-X)
unknown
2008-02-24 14:44:59 UTC
Permalink
Hallo Peter,
ausserdem gibt es ja noch in VBA die KeyCodeConstanten!

Mit freundlichem Gruß aus der Rattenfängerstadt Hameln
Frank Arendt-Theilen

--
(ehem. MVP für Excel)
Website: www.xl-faq.de

Loading...