Zeit zwischen $GUI_EVENT_PRIMARYDOWN und $GUI_EVENT_PRIMARYUP global auslesen

  • Hi zusammen,

    Ganz kurze Frage: Wie fange ich $GUI_EVENT_PRIMARYDOWN und $GUI_EVENT_PRIMARYUP ab, wenn sich das Event nicht auf die GUI bezieht sondern Global, egal wo gedrückt wird ?

    Steh da grad mal wieder total auf´m Schlauch. Alles was ich finde verlangt ein handle wie von GUICreate zurückgegeben wird.

    Kann mir da einer mal grad auf die Sprünge helfen.

    LG
    MrB

    Einmal editiert, zuletzt von MrB (10. August 2013 um 07:05)

    • Offizieller Beitrag

    Dazu musst du einen Mouse-Hook anwenden, die Zeitabfrage kannst du dir sicher selbst einbauen:

    Spoiler anzeigen
    [autoit]


    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    OnAutoItExitRegister('OnAutoItExit')
    HotKeySet('^+q', '_Exit') ; Strg+Shift+Q

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $HC_ACTION = 0
    Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Sleep(50)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _MouseProc($nCode, $wParam, $lParam)
    Local $event, $info, $iX, $iY, $mouseData = "", $wheelData = "", $wheelCount
    $info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    $iX = DllStructGetData($info, 1)
    $iY = DllStructGetData($info, 2)
    $mouseData = DllStructGetData($info, 3)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $nCode = $HC_ACTION Then
    Switch $wParam
    Case $WM_MOUSEMOVE
    $event = "Mouse Move"
    Case $WM_MOUSEWHEEL
    $event = "Mouse Wheel"
    If _WinAPI_HiWord($mouseData) > 0 Then
    $wheelData = " Forward"
    Else
    $wheelData = " Backward"
    EndIf
    $wheelCount = _WinAPI_HiWord($mouseData)/120
    Case $WM_LBUTTONDOWN
    $event = "Left Down"
    Case $WM_LBUTTONUP
    $event = "Left Up"
    Case $WM_RBUTTONDOWN
    $event = "Right Down"
    Case $WM_RBUTTONUP
    $event = "Right Up"
    Case $WM_MBUTTONDOWN
    $event = "Wheel Down"
    Case $WM_MBUTTONUP
    $event = "Wheel Up"
    EndSwitch
    EndIf
    ConsoleWrite($iX & ', ' & $iY & ' ' & $event & $wheelData & ' count: ' & $wheelCount & @CRLF)
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
    EndFunc ;==>OnAutoItExit

    [/autoit]
  • Warum nicht einfach mit _IsPressed?

    [autoit]


    #include <Misc.au3>

    [/autoit][autoit][/autoit][autoit]

    $hUser32 = DllOpen("user32.dll")

    [/autoit][autoit][/autoit][autoit]

    While Sleep(10) ; <-- CPU-Auslastung
    If _IsPressed("01", $hUser32) Then
    $hTimer = TimerInit()
    Do
    Sleep(10)
    Until Not _IsPressed("01", $hUser32)
    $iDownTime = Round(TimerDiff($hTimer), 2)
    ToolTip("DownTime: " & $iDownTime & " ms", 0, 0)
    EndIf
    WEnd

    [/autoit]

    lg

  • chesstiger
    Weil ich stumpf davon ausgegangen bin, dass _IsPressed erst auf PRIMARYUP reagiert. Sag ja - Schlauch
    Reicht mir völlig so.

    BugFix

    Deine Methode werd ich mir aber auch mal ablegen. Allein schon aus dem Grund mit dem Hook. Hab damit noch nie was gemacht. Aber demnächst ^^

    THX@ALL
    LG
    MrB