Unverträglichkeit von Msg & State

  • Guten Tag.
    Sorry wegen dem Titel - ich kann das Problem leider gar nicht mit einem Einzeiler beschreiben.

    Es sieht folgendermaßen aus:
    Im Script benutze ich einen Accelerator, um eine Funktion aufzurufen, in der ein Control versteckt und deaktiviert wird ($GUI_HIDE + $GUI_DISABLE).
    Das Problem ist dann, dass danach die WM_MOUSEWHEEL-Funktion nicht mehr funktioniert, bis das Fenster minimiert und wieder geöffnet wird.

    Nutze ich dafür keinen Accelerator, sondern einen gewöhnlichen Button o. ä., dann gibt es das Problem nicht.
    Es funktioniert auch, wenn ich das Control lediglich verstecke ($GUI_HIDE) - aber für das Endprodukt kommen diese beiden Optionen nicht in Frage...

    Der Wunsch ist also, per Accelerator das Control verstecken und deaktivieren und danach trotzdem noch das Mausrad nutzen zu können.

    Spoiler anzeigen

    Hier ist ein stark vereinfachtes Script. Bekommt das jemand zum Laufen? :D

    [autoit]

    Global $h_Gui, $h_Input, $h_Dummy
    Global $a_Accel[1][2] = [['{enter}']]

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

    $h_Gui = GUICreate('')
    $h_Input = GUICtrlCreateInput('', 10, 10, 100, 20)
    $h_Dummy = GUICtrlCreateDummy()
    $a_Accel[0][1] = $h_Dummy

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

    GUISetAccelerators($a_Accel, $h_Gui)
    GUISetState(@SW_SHOW, $h_Gui)
    GUIRegisterMsg(0x020A, 'WM_MOUSEWHEEL') ; $WM_MOUSEWHEEL = 0x020A

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $h_Dummy
    ; $GUI_HIDE = 32
    ; $GUI_DISABLE = 128

    GUICtrlSetState($h_Input, 160)
    ;GUICtrlSetState($h_Input, 32)
    EndSwitch
    WEnd

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

    Func WM_MOUSEWHEEL($h_Wnd, $n_Msg, $w_Param)
    If $w_Param = 0x00780000 Then
    ConsoleWrite('up' & @CRLF)
    ElseIf $w_Param = 0xFF880000 Then
    ConsoleWrite('down' & @CRLF)
    EndIf
    EndFunc ;==> WM_MOUSEWHEEL

    [/autoit]

    LG

    Einmal editiert, zuletzt von $var (19. Dezember 2012 um 23:57)

    • Offizieller Beitrag

    Das Problem scheint daran zu liegen, dass es kein Scroll-Control mehr gibt.
    Wenn man ein zusätzliches (nicht sichtbares) Inputfeld erstellt und diesem den Focus zuweist, dann funktioniert es:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    Global $h_Gui, $h_Input, $h_Dummy
    Global $a_Accel[1][2] = [['{enter}']]

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

    $h_Gui = GUICreate('')
    $h_Input = GUICtrlCreateInput('', 10, 10, 100, 20)
    $h_Dummy_Input = GUICtrlCreateInput('', 0, 0, 1, 1)
    $h_Dummy = GUICtrlCreateDummy()
    $a_Accel[0][1] = $h_Dummy
    GUISetAccelerators($a_Accel, $h_Gui)
    GUISetState(@SW_SHOW, $h_Gui)
    GUIRegisterMsg(0x020A, 'WM_MOUSEWHEEL') ; $WM_MOUSEWHEEL = 0x020A

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $h_Dummy
    ; $GUI_HIDE = 32
    ; $GUI_DISABLE = 128
    GUICtrlSetState($h_Input, 160)
    GUICtrlSetState($h_Dummy_Input, $GUI_FOCUS)
    ;GUICtrlSetState($h_Input, 32)
    EndSwitch
    WEnd

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

    Func WM_MOUSEWHEEL($h_Wnd, $n_Msg, $w_Param)
    If $w_Param = 0x00780000 Then
    ConsoleWrite('up' & @CRLF)
    ElseIf $w_Param = 0xFF880000 Then
    ConsoleWrite('down' & @CRLF)
    EndIf
    EndFunc ;==> WM_MOUSEWHEEL

    [/autoit]

    Edit: Es spielt keine Rolle, was das für ein Dummy-Control ist (kann auch ein Label sein). Der Eingabe-Focus muss nur auf einem anderen Control liegen, dann funktioniert auch das MouseWheel wieder.