MouseDown-Zeit stoppen un auswerten

Hi ho Freaks,

ich möchte bei einem MouseDown-Event, dass der dortige Code erst ausgeführt wird, wenn die Maustaste eine bestimmte Zeit, sagen wir 100 ms, gedrückt gehlten wurde.

Wurde sie weniger lange gedrückt soll - im MouseDown-Event - nix passieren, sondern lediglich der Code im MouseUp-Event ausgeführt werden.

Hintergrund:

Über 200 Labels, die per Drag&Drop die Captions tauschen können. Das D&D wird mit der LMT ausgeführt. Alternativ dazu wird bei einem Klick mit der LMT die Caption des aktuellen Labels geändert.
Darum brauche ich eine Art Weiche, welche dem Klick den Vorang gibt.

Hat da jemand von Euch eine gute Idee?

Hier mal mein MouseDown-Event, passiert wirklich nix weltbewegendes, es wird lediglich das D&D „vorbereitet“…

Private Sub myLabel_MouseDown( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)

'mein Teil (kann man erkennen, dass es ne Art Stopp-Uhr sein soll) *g*
intSTime = Format(Now, „ss,000“)
Do Until Format(Now, „ss,000“) > intSTime + 0.1
intETime = Format(Now, „ss,000“)
Loop
MsgBox intETime - intSTime

'Drag&Drop-Teil
myLabel.Parent.Tag = myLabel.Name
End Sub

Hier noch meine - zeit-kram-bezogenen - Deklarationen im Modul…

Private Declare Function GetTickCount Lib „kernel32“ () As Long
Private Declare Sub Sleep Lib „kernel32“ (ByVal dwMilliseconds As Long)
Private Declare Sub GetLocalTime Lib „kernel32.dll“ (lpSystemTime As SYSTEMTIME)

Private Declare Function SetTimer Lib „user32.dll“ (ByVal hWnd As Long, _
ByVal nIDEvent As Long, ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib „user32.dll“ (ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long

Const WM_TIMER = &H113 ’ Timer-Ereignis trifft ein

Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Private hEvent As Long

…und die dazu gehörigen Subs/Functions:

Sub Warten(ByVal Pause As Long)
Sleep (Pause) 'Angabe in Millisekunden
DoEvents
End Sub

Public Sub GibVergangeneZeit1()
Dim iStart As Long, i As Long, b As Boolean
iStart = GetTickCount
For i = 1 To 65534
Sheets(2).Cells(i, 1).Value = i
Next i
MsgBox „Die Schleife brauchte " & (GetTickCount - iStart) / 1000 & " Sekunden“
End Sub

’ Timer-Prozedur, welche im Abstand der festgelegten
’ Millisekunden ein Ereignis sendet
Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long)

Dim ST As SYSTEMTIME

If uMsg = WM_TIMER Then
beep
End If
End Sub

’ Startet den Timer
Public Function EnableTimer(ByVal msInterval As Long)
If hEvent 0 Then Exit Function
hEvent = SetTimer(0&, 0&, msInterval, AddressOf TimerProc)
End Function

’ Beendet den Timer
Public Function DisableTimer()
If hEvent = 0 Then Exit Function
KillTimer 0&, hEvent
hEvent = 0
End Function

Ich würd mich echt freuen, wenn jemand, vielleicht sogar recht bald, eine einfache Lösung dafür für mich hat!

Vielen Dank schon einmal jetzt an alle Hilfsbereiten,

liebe Grüße und eine gute Nacht aus Berlin,

Murphy2ooo

Hallo Murphy,

wie wäre es mit einer Kombination von MouseDown und MouseUp. Hier mal als Beispiel einfach mit der Now-Funktion (leider nur auf die Sekunde genau, da ein Klick auch mal genau auf den Sekundenwechsel fallen kann, würde das erst ab 2 Sekunden einigermassen zuverlässig klappen, sicherlich etwas zu lang. Aber mit einer anderen Zeitermittlung vielleicht einen Versuch wert:

Option Explicit

Private Downtime As Double

Private Sub Label1\_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 Downtime = Time
 Debug.Print "Down: " + CStr(Downtime)
End Sub

Private Sub Label1\_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 Dim Uptime As Double
 Uptime = Time
 Debug.Print "Up: " + CStr(Uptime)
 If Uptime - Downtime \> 0.000011574074074 Then
 MsgBox "Drag"
 Else
 MsgBox "Click"
 End If
End Sub

Viele Grüße,
Daniel

Hallo,

wenn Du wissen willst, wie lange die Maustaste gedrückt war, dann nimm mal den Code …

Option Explicit
Dim tm As Double

Private Sub Command1\_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
 tm = Timer
End Sub

Private Sub Command1\_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
 Me.Caption = Timer - tm
End Sub

… der sollte helfen.

Gruß, Rainer

Hi,

vieleicht hilft ein anderer Gedankengang als Ansatz: Den MouseMove-Event als Trigger zu verwenden und ewt. dort einen Timer zu starten, oder einfach nur nachzuschauen ob die Mouse bewegt wurde?

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]