Problem GUIRegisterMsg und $WM_KEYDOWN

  • Hi ihr alle

    Ich habe eines der "Matrix"-Scripte aus eurem kleinen Programmierwettbewerb aufgegriffen und wollte es dahingehend anpassen, das es mittels Mausbewegung und "Any Key" beendet werden kann.
    Das wäre als Bildschirmschoner ja angebracht.

    Hier nun mein Versuch:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode",1)

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

    Global $a = 48 ; Anzahl der Spalten
    Global $sp[$a+1], $w = @DesktopWidth, $h = @DesktopHeight
    GUICreate('Matrix', $w, $h, -1, -1, BitOr($WS_MAXIMIZE,$WS_POPUP))
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Ende") ; ESC-Taste beendet
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE,"_Ende") ; Mausbewegung beendet
    GUISetBKColor(0x000000)
    For $i = 0 To $a
    $sp[$i] = GUICtrlCreateLabel('', 10+$i*Ceiling($w/($a)), 0, 18, $h, $SS_RIGHT)
    GUICtrlSetFont(-1, 12, 800, 0, 'Verdana')
    GUICtrlSetColor(-1, 0x00ff00)
    Next
    GUISetState()
    GUISetCursor(16,1) ; Mauszeiger verstecken
    GUIRegisterMsg($WM_KeyDown,"_Ende") ; jeder Tastendruck soll beenden

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

    $f = 0
    While 1
    If $f = 0 Then
    $y = Random(0, $a, 1)
    $y1 = Random(0, $a, 1)
    $y2 = Random(0, $a, 1)
    EndIf
    If Not($y=$y1 And $y=$y2) Then
    $r = StringLeft(GUICtrlRead($sp[$y]), 160)
    Switch Mod($y, 2)
    Case 0
    $c = StringRegExpReplace(Chr(Random(32, 122, 1)), '[@]', ' ' & @LF & ' ')
    Case Else
    $c = StringMid('123 456 789', Random(1, 11, 1), 1)
    EndSwitch
    $x = $y
    Else
    $f += 1
    If $f = 160 Then $f = 0
    $c = ' '
    $x = Random(0, $a, 1)
    $r = StringLeft(GUICtrlRead($sp[$x]), 160)
    EndIf
    GUICtrlSetData($sp[$x], $c & @LF & $r)
    WEnd

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

    Func _Ende()
    GUISetCursor(2,0)
    Exit
    EndFunc

    [/autoit]

    Nun funktioniert aber das Beenden beim Tastendruck nicht. Nehme ich die "GUICtrlCreateLabel" (Zeilen 10-14) heraus, dann klappt es wie auch in folgendem kleinen Test:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode",1)

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

    GUICreate("AnyKey Test", 175, 150)
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Ende")
    ;GUISetOnEvent($GUI_EVENT_MOUSEMOVE,"_Ende")
    GUISetState()

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

    GUIRegisterMsg($WM_KeyDown,"_Ende")

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

    While 1
    Sleep(10)
    Wend

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

    Func _Ende()
    Exit
    EndFunc

    [/autoit]

    Hat jemand eine Lösung dafür ?
    Besten Dank für eure Hilfe

    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hi Micha,

    ich schätze mal, dass einer der Labels auf Focus gesetzt ist (automatisch) und somit die 'WM_KEYDOWN'-Message an den Label gesendet wird, der wiederum eine WM_NOTIFY and das Parent-Fenster sendet ...

    Setze den Focus auf das Parent-Fenster nachdem Du die Steuerelemente erstellt hast, oder setze $GUI_NOFOCUS für jedes Steuerelement.


    Gruß
    Greenhorn


    • Offizieller Beitrag

    Ich habe keine Erklärung, warum das so ist, aber ich habe eine Lösung für das Problem:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    Opt("GUIOnEventMode",1)

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

    Global $a = 48 ; Anzahl der Spalten
    Global $sp[$a+1], $w = @DesktopWidth, $h = @DesktopHeight
    GUICreate('Matrix', $w, $h, -1, -1, BitOr($WS_MAXIMIZE,$WS_POPUP))
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Ende") ; ESC-Taste beendet
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE,"_Ende") ; Mausbewegung beendet
    Global $key = GUICtrlCreateInput('',0,-30,0,0)
    GUISetBKColor(0x000000)
    For $i = 0 To $a
    $sp[$i] = GUICtrlCreateLabel('', 10+$i*Ceiling($w/($a)), 0, 18, $h, $SS_RIGHT)
    GUICtrlSetFont(-1, 12, 800, 0, 'Verdana')
    GUICtrlSetColor(-1, 0x00ff00)
    Next
    GUISetState()
    GUISetCursor(16,1) ; Mauszeiger verstecken
    $f = 0
    While 1
    If GUICtrlRead($key) <> '' Then _Ende()
    If $f = 0 Then
    $y = Random(0, $a, 1)
    $y1 = Random(0, $a, 1)
    $y2 = Random(0, $a, 1)
    EndIf
    If Not($y=$y1 And $y=$y2) Then
    $r = StringLeft(GUICtrlRead($sp[$y]), 160)
    Switch Mod($y, 2)
    Case 0
    $c = StringRegExpReplace(Chr(Random(32, 122, 1)), '[@]', ' ' & @LF & ' ')
    Case Else
    $c = StringMid('123 456 789', Random(1, 11, 1), 1)
    EndSwitch
    $x = $y
    Else
    $f += 1
    If $f = 160 Then $f = 0
    $c = ' '
    $x = Random(0, $a, 1)
    $r = StringLeft(GUICtrlRead($sp[$x]), 160)
    EndIf
    GUICtrlSetData($sp[$x], $c & @LF & $r)
    WEnd

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

    Func _Ende()
    GUISetCursor(2,0)
    Exit
    EndFunc

    [/autoit]

    Einfach ein unsichtbares Input-Control abfragen... :)
    Einziger Nachteil: Die Controltasten (SHIFT, STRG etc.) werden nicht berücksichtigt.

  • Es könnte sein, dass Du die GUIRegisterMsg vor dem erzeugen der Labels registrieren musst.
    Hast Du das schon probiert ?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode",1)

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

    Global $a = 48 ; Anzahl der Spalten
    Global $sp[$a+1], $w = @DesktopWidth, $h = @DesktopHeight
    ; besser hier registrieren ...
    GUIRegisterMsg($WM_KeyDown,"_Ende") ; jeder Tastendruck soll beenden
    GUICreate('Matrix', $w, $h, -1, -1, BitOr($WS_MAXIMIZE,$WS_POPUP))
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Ende") ; ESC-Taste beendet
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE,"_Ende") ; Mausbewegung beendet
    GUISetBKColor(0x000000)
    For $i = 0 To $a
    $sp[$i] = GUICtrlCreateLabel('', 10+$i*Ceiling($w/($a)), 0, 18, $h, $SS_RIGHT)
    GUICtrlSetFont(-1, 12, 800, 0, 'Verdana')
    GUICtrlSetColor(-1, 0x00ff00)
    Next
    GUISetState()
    GUISetCursor(16,1) ; Mauszeiger verstecken

    [/autoit]

    Gruß
    Greenhorn


  • Hier die Möglichkeit mit CallBack

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Misc.au3>
    ;=============================================
    ;Example only for AutoIt v3.2.10.0 and higher:
    ; Keyhook-Code from http://www.autoitscript.com/forum/index.ph…ndpost&p=439185

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

    $struct = "DWORD vkCode;" _
    &"DWORD scanCode;" _
    &"DWORD flags;" _
    &"DWORD time;" _
    &"ULONG_PTR dwExtraInfo"

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

    Global $hWinHook, $hMouseHook, $CTRL_ESC_Pressed = False

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

    $CallBackProc = TogglePlugKeyBoard()

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

    Opt("GUIOnEventMode",1)

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

    Global $a = 48 ; Anzahl der Spalten
    Global $sp[$a+1], $w = @DesktopWidth, $h = @DesktopHeight
    GUICreate('Matrix', $w, $h, -1, -1, BitOr($WS_MAXIMIZE,$WS_POPUP))
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Ende") ; ESC-Taste beendet
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE,"_Ende") ; Mausbewegung beendet
    GUISetBKColor(0x000000)
    For $i = 0 To $a
    $sp[$i] = GUICtrlCreateLabel('', 10+$i*Ceiling($w/($a)), 0, 18, $h, $SS_RIGHT)
    GUICtrlSetFont(-1, 12, 800, 0, 'Verdana')
    GUICtrlSetColor(-1, 0x00ff00)
    GUICtrlSetState(-1,@SW_DISABLE)
    Next
    GUISetState()
    GUISetCursor(16,1) ; Mauszeiger verstecken
    ;~ GUIRegisterMsg($WM_KeyDown,"_Ende") ; jeder Tastendruck soll beenden

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

    $f = 0
    While 1
    If $f = 0 Then
    $y = Random(0, $a, 1)
    $y1 = Random(0, $a, 1)
    $y2 = Random(0, $a, 1)
    EndIf
    If Not($y=$y1 And $y=$y2) Then
    $r = StringLeft(GUICtrlRead($sp[$y]), 160)
    Switch Mod($y, 2)
    Case 0
    $c = StringRegExpReplace(Chr(Random(32, 122, 1)), '[@]', ' ' & @LF & ' ')
    Case Else
    $c = StringMid('123 456 789', Random(1, 11, 1), 1)
    EndSwitch
    $x = $y
    Else
    $f += 1
    If $f = 160 Then $f = 0
    $c = ' '
    $x = Random(0, $a, 1)
    $r = StringLeft(GUICtrlRead($sp[$x]), 160)
    EndIf
    GUICtrlSetData($sp[$x], $c & @LF & $r)
    If $CTRL_ESC_Pressed Then _Ende()
    WEnd

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

    Func _Ende()
    GUISetCursor(2,0)
    TogglePlugKeyBoard($CallBackProc)
    Exit
    EndFunc

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

    Func TogglePlugKeyBoard($hCallProc=0)
    If IsArray($hWinHook) Then
    DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hWinHook[0])
    DllCallbackFree($hCallProc)
    Return 0
    EndIf

    Local Const $WH_KEYBOARD_LL = 13
    Local $hKeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
    Local $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
    $hWinHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", _
    "int", $WH_KEYBOARD_LL, _
    "ptr", DllCallbackGetPtr($hKeyProc), _
    "hwnd", $hMod[0], _
    "dword", 0)
    Return $hKeyProc
    EndFunc

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

    Func _KeyProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then
    Local $iRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hWinHook[0], _
    "int", $nCode, _
    "ptr", $wParam, _
    "ptr", $lParam)
    Return $iRet[0]
    EndIf
    $CTRL_ESC_Pressed = True
    Return 0
    EndFunc

    [/autoit]
  • Greenhorn: Mit "GUICtrlSetState([label],$GUI_NOFOCUS)" haut es nicht hin und den Fokus auf das GUI setzen, wie soll das gehen ?

    Ich werde mir die Möglichkeit mit CallBack mal ansehen. Ich habe nicht damit gerechnet, das das so kompliziert wird.
    Wenn ich die Label auf "$GUI_DISABLE" stelle, dann funktioniert die "ANYKEY" Taste wieder, nur sieht das nicht mehr gut aus !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    2 Mal editiert, zuletzt von Micha_he (21. März 2008 um 19:50)

  • Hier die Erklärung aus der Hilfe:


    Also hast du einfach Pech. Es geht nicht.

    Das habe ich schon irgendwo gelesen, nur wird doch im GUI gar kein "Edit-Control" benutzt ! Sind doch alles "Labels"...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"