Tastenanschläge Hoch/Runter abfangen (ohne Hotkeyset)

  • Hallo zusammen,

    ich habe ein kleines Problem.
    Und zwar möchte ich das mein GUI Fenster mitbekommt sobald die Hoch oder Runter Pfieltaste gedrückt wird.

    Skript:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <WinAPI.au3>
    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <Misc.au3>

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

    Global $HA = @DesktopHeight * 3 / 4
    Global $VA = @DesktopWidth / 3

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

    Global $Farbe = 0x00BFFF
    Global $Fokusfarbe = 0x4169E1

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

    global $a_buttons[5]=["1","2","3","4","5"]

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

    #region HauptGUI
    Global $binfo = "1|2|3|4|5" ;Buttonbeschriftung für jeden Button mit | getrennt eingeben -> Anzahl der Beschriftungen bestimmt gleichzeitig die Anzahl der Buttons
    Global $abfinfo = StringSplit($binfo, '|')
    Global $banzahl = $abfinfo[0]
    Global $babstandleft = 50 ;Abstand links und rechts zur HauptGUI
    Global $babstandtop = 10 ;Abstand zwischen den Buttons
    Global $bwidth = $VA - 2 * $babstandleft ;Button Left ausrechnen
    Global $bheight = $HA / $banzahl - $babstandtop * ($banzahl + 1) / $banzahl ;Button Höhe in Abhängigkeit zur Auflösung ausrechnen
    Global $HauptGUI = GUICreate("HTPC", $VA, $HA, -1, -1, BitOR($WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS))

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

    ;Buttons erstellen und Button TOP ausrechnen
    For $i = 1 To $banzahl
    Global $Button = GUICtrlCreateButton($abfinfo[$i], $babstandleft, $i * $babstandtop + ($i - 1) * $bheight, $bwidth, $bheight, $BS_BITMAP)
    GUICtrlSetFont(-1, 20)
    GUICtrlSetBkColor(-1, $Farbe)
    Next
    #endregion HauptGUI

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

    Global $last_focus = GUICtrlGetHandle(-1)
    Global $fokusGUI = $HauptGUI
    GUIRegisterMsg($WM_User, "MY_WM_USER")

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

    GUISetState(@SW_SHOW, $HauptGUI)
    WinSetOnTop($HauptGUI, "", 1)

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

    While 1

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

    $msg = GUIGetMsg()
    Switch $msg
    case 5
    _Exit()

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

    EndSwitch
    WEnd

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

    Func _Exit()
    Exit
    endfunc

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

    Func MY_WM_USER($hwnd, $msg, $wParam, $lParam)
    $low_word = BitAND($wParam, 0xFFFF)
    $high_word = BitShift($wParam, 16)
    ConsoleWrite("wparam: "&$low_word & @crlf)
    ConsoleWrite("lparam: "&$high_word & @crlf)
    Setbuttontext()
    _SetBKColor()
    EndFunc ;==>MY_WM_USER

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

    Func _SetBKColor()
    Local $Button = WinGetHandle(_WinAPI_GetFocus())
    GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($last_focus), $Farbe)
    GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($Button), $Fokusfarbe)
    $last_focus = $Button
    EndFunc ;==>_SetBKColor

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

    Func Setbuttontext($left=0)
    GUICtrlSetState(5, $GUI_FOCUS)
    _ArrayPush($a_buttons, $a_buttons[0], $left)
    for $i =1 to $banzahl
    GUICtrlSetData($i+2, $a_buttons[$i-1])
    Next
    endfunc

    [/autoit]


    Ich habe ein Array mit sagen wir 100 Namen drin und möchte davon immer 5 Stück verwenden um die Buttons zu benennen (ich denke durch ausführen des Skriptes wird klarer was ich vorhabe).
    Das klappt mit _Arraypush auch einwandfrei.
    Allerdings kann ich nicht erkennen ob jetzt Pfeiltste-Hoch oder Pfeiltaste-Runter gedrückt wurde und so stimmt die Funktion nur in eine Richtung.

    Gibt es dafür eine Lösung ohne Hotkeyset oder _Ispressed?
    WM_User bringt mir leider nicht verwertbares. ?(

    Gruß nuts

    2 Mal editiert, zuletzt von nuts (9. Februar 2013 um 17:02)

  • Vielleicht hilft dir das hier weiter:

    [autoit]

    GUISetAccelerators()

    [/autoit]

    Die Tasten die du bräuchtest wären wohl:

    [autoit]

    {DOWN}
    {UP}

    [/autoit]


    Mfg

    P.S.: Wir könnten dein Script nichtmal ausführen wegen den fehlenden Includes.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ah sorry die eigenen includes hab ich von einem anderern Skript kopiert.
    Die werden nicht benötigt und sind nun im Startpost rausgelöscht.

    edit\ Hm GUISetAccelerators
    Gute Idee. Damit scheint es zu gehen - danke :thumbup:

    Einmal editiert, zuletzt von nuts (9. Februar 2013 um 14:43)

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2013-02-09 14:46:41
    #EndRegion

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

    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <WinAPI.au3>
    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <Misc.au3>
    ;#include <DVBViewer.au3>
    ;#include <myscripts_constants.au3>

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

    Global $HA = @DesktopHeight * 3 / 4
    Global $VA = @DesktopWidth / 3

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

    Global $Farbe = 0x00BFFF
    Global $Fokusfarbe = 0x4169E1

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

    global $a_buttons[5]=["1","2","3","4","5"]

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

    #region HauptGUI
    Global $binfo = "1|2|3|4|5" ;Buttonbeschriftung für jeden Button mit | getrennt eingeben -> Anzahl der Beschriftungen bestimmt gleichzeitig die Anzahl der Buttons
    Global $abfinfo = StringSplit($binfo, '|')
    Global $banzahl = $abfinfo[0]
    Global $babstandleft = 50 ;Abstand links und rechts zur HauptGUI
    Global $babstandtop = 10 ;Abstand zwischen den Buttons
    Global $bwidth = $VA - 2 * $babstandleft ;Button Left ausrechnen
    Global $bheight = $HA / $banzahl - $babstandtop * ($banzahl + 1) / $banzahl ;Button Höhe in Abhängigkeit zur Auflösung ausrechnen
    Global $HauptGUI = GUICreate("HTPC", $VA, $HA, -1, -1, BitOR($WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS))

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

    ;Buttons erstellen und Button TOP ausrechnen
    For $i = 1 To $banzahl
    Global $Button = GUICtrlCreateButton($abfinfo[$i], $babstandleft, $i * $babstandtop + ($i - 1) * $bheight, $bwidth, $bheight, $BS_BITMAP)
    GUICtrlSetFont(-1, 20)
    GUICtrlSetBkColor(-1, $Farbe)
    Next
    Global $Dummyup= GUICtrlCreateDummy()
    Global $DummyDown= GUICtrlCreateDummy()
    Dim $AccelKeys[2][2] = [["{UP}", $Dummyup],["{DOWN}", $DummyDown]]
    GUISetAccelerators($AccelKeys)

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

    #endregion HauptGUI

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

    Global $last_focus = GUICtrlGetHandle(-1)
    Global $fokusGUI = $HauptGUI
    ;GUIRegisterMsg($WM_User, "MY_WM_USER")

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

    GUISetState(@SW_SHOW, $HauptGUI)
    WinSetOnTop($HauptGUI, "", 1)

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

    While 1

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

    $msg = GUIGetMsg()
    Switch $msg
    case 5
    _Exit()
    Case $DummyDown
    Setbuttontext(0)
    _SetBKColor()
    Case $DummyUp
    Setbuttontext(1)
    _SetBKColor()
    EndSwitch
    WEnd

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

    Func _Exit()
    Exit
    endfunc

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

    Func MY_WM_USER($hwnd, $msg, $wParam, $lParam)
    $low_word = BitAND($wParam, 0xFFFF)
    $high_word = BitShift($wParam, 16)
    ConsoleWrite("wparam: "&$low_word & @crlf)
    ConsoleWrite("lparam: "&$high_word & @crlf)
    Setbuttontext()
    _SetBKColor()
    EndFunc ;==>MY_WM_USER

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

    Func _SetBKColor()
    Local $Button = WinGetHandle(_WinAPI_GetFocus())
    GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($last_focus), $Farbe)
    GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($Button), $Fokusfarbe)
    $last_focus = $Button
    EndFunc ;==>_SetBKColor

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

    Func Setbuttontext($left=0)
    GUICtrlSetState(5, $GUI_FOCUS)
    If $left = 0 Then _ArrayPush($a_buttons, $a_buttons[0], $left)
    If $Left=1 Then _ArrayPush($a_buttons, $a_buttons[UBound($a_buttons)-1], $left)
    for $i =1 to $banzahl
    GUICtrlSetData($i+2, $a_buttons[$i-1])
    Next
    endfunc

    [/autoit]


    Für _ArrayPush mußt du dir noch was einfallen lassen. ;)

    Edit: Na toll, FF ist so ein Dreck. Das Scheißteil zeigt keine Posts an, obwohl ich aktualisiere. :cursing: