ListViewItem mit Leertaste checken !?

  • Hallo! Ich möchte den Check-Event eines ListView-Elementes abfangen, das gelingt mir aber nur mittels Maustaste, aber nicht wenn ich das Element mit der Leertaste checke. Ich könnte zwar über einen zusätzlichen Button alle gecheckten Elemente auslesen, aber das will ich nicht unbedingt. Hab es bereits über WM_Notify und WM_Command ohne Erfolg getestet.
    Hat da jemand eine Lösung für mich?

    Danke im Voraus

    Spoiler anzeigen
    [autoit]

    Opt("GUIOnEventMode", 1)

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

    Global $hGui = GUICreate("Listview", 520, 600, -1, -1)
    GUISetOnEvent(-3, "_Exit")

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

    Global $hLV = GUICtrlCreateListView("Index|Alarmtext|Nummer", 10, 10, 500, 582, -1, 0x00000004)
    For $i = 1 To 100
    GUICtrlCreateListViewItem($i, $hLV)
    GUICtrlSetOnEvent(-1, "_CheckStatus")
    Next

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

    GUISetState()

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

    While 1
    Sleep(10000)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _CheckStatus()
    ConsoleWrite(@GUI_CtrlId & " - " & GUICtrlRead(@GUI_CtrlId, 1) & @CR)
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Das geht am Besten mit Hook auf die Leertaste:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #Include <WindowsConstants.au3>

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

    OnAutoItExitRegister('OnAutoItExit')
    Opt("GUIOnEventMode", 1)

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

    Global $hHookKeyboard, $pStub_KeyProc, $active = False, $ctrl2effect = 'SysListView321'
    $pStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
    $hHookKeyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), _WinAPI_GetModuleHandle(0), 0)

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

    Global $hGui = GUICreate("Listview", 520, 600, -1, -1)
    GUISetOnEvent(-3, "_Exit")

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

    Global $hLV = GUICtrlCreateListView("Index|Alarmtext|Nummer", 10, 10, 500, 582, -1, 0x00000004)
    For $i = 1 To 100
    GUICtrlCreateListViewItem($i, $hLV)
    GUICtrlSetOnEvent(-1, "_CheckStatus")
    Next

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

    GUISetState()

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

    While 1
    Sleep(100)
    If BitAND(WinGetState($hGui), 8) And ControlGetFocus($hGui) = $ctrl2Effect Then ; nur wirksam wenn GUI aktiv und Fokus auf Listview
    $active = True
    Else
    $active = False
    EndIf
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _CheckStatus()
    ConsoleWrite(@GUI_CtrlId & " - " & GUICtrlRead(@GUI_CtrlId, 1) & @CR)
    EndFunc

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

    Func OnAutoItExit()
    DllCallbackFree($pStub_KeyProc)
    _WinAPI_UnhookWindowsHookEx($hHookKeyboard)
    EndFunc ;==>OnAutoITExit

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

    Func _KeyProc($nCode, $wParam, $lParam)
    If $nCode < 0 Or Not $active Then Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    Local $vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
    If ($wParam = $WM_KEYDOWN) And ($vkCode = 0x20) Then
    _CheckStatus()
    EndIf
    Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    EndFunc ;==>_KeyProc

    [/autoit]