OnEvent reagiert bei Pic nicht...

  • Also, ich hab n merkwürdiges Problem...
    und nen komplizierten Skriptcode mit nem möchtegern-OOP
    leider konnte ich nach längerer Zeit den Fehler nicht killen, jetzt brauchts Verstärkung :D

    Ich habe versucht die Taskliste nachzubauen
    habs auch geschafft :D
    also das Aussehen ist nachgebaut, die Funktion will ich lieber nicht nachbeuen :P

    Also ich hoste mal das Skript, das Problem lautet:
    Skript reagiert nicht wenn man auf ein Pic im Startmenü clickt (Sperren & Ausschalten)

    Spoiler anzeigen
    [autoit]

    #Region initialize
    #NoTrayIcon
    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    Opt("WinTitleMatchMode", 4)
    Global $mpar = "go"
    _onEvent("start")
    configuration("start")
    taskbar("create")
    programm("start")
    desklock("start")
    Icons("start")
    #EndRegion
    While True
    taskbar()
    sleep(300)
    programm("work")
    WEnd
    Func taskbar($mpar="work", $par1="")
    Switch $mpar
    Case "work"
    $taskbar_pos = WinGetPos($taskbar_shellgui)
    WinMove($taskbar_gui, "", @DesktopWidth-$taskbar_pos[2]-$taskbar_pos[0], @DesktopHeight-$taskbar_pos[3]-$taskbar_pos[1], $taskbar_pos[2], $taskbar_pos[3], 1)
    If $taskbar_pos[2] = @DesktopWidth And $taskbar_align = 0 Then
    GUICtrlDelete($taskbar_b1)
    GUICtrlDelete($taskbar_b2)
    GUISwitch($taskbar_gui)
    $taskbar_b1 = GUICtrlCreatePic("blue_b3.bmp", 102, 0, @DesktopWidth-102, 22)
    $taskbar_b2 = GUICtrlCreatePic("blue_b4.bmp", 0, $taskbar_pos[3]-14, @DesktopWidth, 14)
    $taskbar_align = 1
    GUICtrlSetImage($programm_start, "blue_start2.bmp")
    ElseIf $taskbar_pos[3] = @DesktopHeight And $taskbar_align = 1 Then
    GUICtrlDelete($taskbar_b1)
    GUICtrlDelete($taskbar_b2)
    GUISwitch($taskbar_gui)
    $taskbar_b1 = GUICtrlCreatePic("blue_b1.bmp", 0, 33, 13, @DesktopHeight-33)
    $taskbar_b2 = GUICtrlCreatePic("blue_b2.bmp", $taskbar_pos[2]-13, 0, 13, @DesktopHeight)
    $taskbar_align = 0
    GUICtrlSetImage($programm_start, "blue_start1.bmp")
    EndIf
    $wins = WinList()
    If $taskbar_pos[2] = @DesktopWidth Then
    $width = @DesktopWidth
    $wpos = 0
    Else
    $width = @DesktopWidth-$taskbar_pos[2]-$taskbar_pos[2]
    $wpos = $taskbar_pos[2]
    EndIf
    If $taskbar_pos[3] = @DesktopHeight Then
    $height = @DesktopHeight
    $hpos = 0
    Else
    $height = @DesktopHeight-$taskbar_pos[3]-$taskbar_pos[3]
    $hpos = $taskbar_pos[3]
    EndIf
    For $c = 1 To $wins[0][0]
    If BitAND(WinGetState($wins[$c][1]), 32) Then
    $pos2 = WinGetPos($wins[$c][1], "")
    If $pos2[0] > -7 And $pos2[0] < @DesktopWidth-7 And $pos2[1] > -7 And $pos2[1] < @DesktopHeight-7 Then
    WinMove($wins[$c][1], "", $wpos-4, $hpos-4, $width+8, $height+8, 1)
    EndIf
    EndIf
    Next
    Case "create"
    Global $taskbar_shellgui = WinGetHandle("classname=Shell_TrayWnd")
    Global $taskbar_pos = WinGetPos($taskbar_shellgui)
    Global $taskbar_gui = GUICreate("Taskbar 2", $taskbar_pos[2], $taskbar_pos[3], @DesktopWidth-$taskbar_pos[2]-$taskbar_pos[0], @DesktopHeight-$taskbar_pos[3]-$taskbar_pos[1], $WS_POPUP, $WS_EX_TOOLWINDOW)
    If $taskbar_pos[2] = @DesktopWidth Then
    Global $taskbar_b1 = GUICtrlCreatePic("blue_b3.bmp", 102, 0, @DesktopWidth-102, 22)
    Global $taskbar_b2 = GUICtrlCreatePic("blue_b4.bmp", 0, $taskbar_pos[3]-14, @DesktopWidth, 14)
    Global $taskbar_align = 1
    ElseIf $taskbar_pos[3] = @DesktopHeight Then
    Global $taskbar_b1 = GUICtrlCreatePic("blue_b1.bmp", 0, 33, 13, @DesktopHeight-33)
    Global $taskbar_b2 = GUICtrlCreatePic("blue_b2.bmp", $taskbar_pos[2]-13, 0, 13, @DesktopHeight)
    Global $taskbar_align = 0
    EndIf
    Global $taskbar_contextmenu = GUICtrlCreateContextMenu()
    GUISetBkColor(0x235BDD, $taskbar_gui)
    WinSetOnTop($taskbar_gui, "", 1)
    Global $taskbar_show = True
    GUISetState(@SW_SHOW, $taskbar_gui)
    EndSwitch
    EndFunc
    Func icons($mpar="save", $par1="")
    Switch $mpar
    Case "save"
    IniDelete(@ProgramFilesDir&"\TimBlo\Tasklist\Icon0.icn", "Icons")
    For $c = 0 To _GUICtrlListView_GetItemCount($icons_mhandle) - 1
    $sIconText = _GUICtrlListView_GetItemText($icons_mhandle, $c)
    $aPos = _GUICtrlListView_GetItemPosition($icons_mhandle, $c)
    IniWrite(@ProgramFilesDir&"\TimBlo\Tasklist\Icon0.icn", "Icons", $sIconText, $aPos[0] & ";" & $aPos[1])
    Next
    Case "load"
    For $c = 0 To _GUICtrlListView_GetItemCount($icons_mhandle) - 1
    $sIconText = _GUICtrlListView_GetItemText($icons_mhandle, $c)
    $aPos = StringSplit(IniRead(@ProgramFilesDir&"\TimBlo\Tasklist\Icon0.icn", "Icons", $sIconText, "0"), ";")
    If $aPos[0] == 2 Then
    _GUICtrlListView_SetItemPosition($icons_mhandle, $c, $aPos[1], $aPos[2])
    EndIf
    Next
    Case "start"
    Global $icons_mhandle = ControlGetHandle("Program Manager", "", "SysListView321")
    $Icons_menu = GUICtrlCreateMenu("Icons", $taskbar_contextmenu)
    $Icons_load = GUICtrlCreateMenuItem("Icons ausrichten", $Icons_menu)
    _onEvent("create", $taskbar_gui, $Icons_load, "icons", "load")
    $Icons_save = GUICtrlCreateMenuItem("Icons speichern", $Icons_menu)
    _onEvent("create", $taskbar_gui, $Icons_save, "icons", "save")
    EndSwitch
    EndFunc
    Func programm($mpar="go", $par1="")
    Switch $mpar
    Case "start"
    If $taskbar_pos[2] = @DesktopWidth Then
    Global $programm_start = GUICtrlCreatePic("blue_start2.bmp", 0, 0, 102, 33)
    ElseIf $taskbar_pos[3] = @DesktopHeight Then
    global $programm_start = GUICtrlCreatePic("blue_start1.bmp", 0, 0, 102, 33)
    EndIf
    _onEvent("create", $taskbar_gui, $programm_start, "programm", "startmenu")
    Global $programm_startgui = GUICreate("Startmenu2", 470, 650, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW)
    GUISetBkColor(0x1B6BD1, $programm_startgui)
    GUICtrlCreatePic("blue_header.bmp", 0, 0, 470, 65)
    GUICtrlCreatePic("blue_footer.bmp", 0, 610, 470, 41)
    Global $programm_exit = GUICtrlCreatePic("blue_exit.bmp", 371, 616, 92, 29)
    _onEvent("create", $programm_startgui, $programm_exit, "OnAutoItExit")
    WinSetOnTop($programm_startgui, "", 1)
    Global $programm_menu_show = False
    Case "startmenu"
    $left = @DesktopWidth-$taskbar_pos[2]-$taskbar_pos[0]
    $top = @DesktopHeight-$taskbar_pos[3]-$taskbar_pos[1]+32
    $right = $left+470
    $bottom = $top+650
    If $right > @DesktopWidth Then
    $left -= 470
    EndIf
    If $bottom > @DesktopHeight Then
    $top -= 650
    EndIf
    WinMove($programm_startgui, "", $left, $top, 470, 650, 0)
    If $taskbar_align = 0 Then
    GUICtrlSetImage($programm_start, "blue_start3.bmp")
    Else
    GUICtrlSetImage($programm_start, "blue_start4.bmp")
    EndIf
    GUISetState(@SW_SHOW, $programm_startgui)
    $programm_menu_show = True
    Case "work"
    If $programm_menu_show Then
    If not WinActive($programm_startgui) Then
    GUISetState(@SW_HIDE, $programm_startgui)
    If $taskbar_align = 0 Then
    GUICtrlSetImage($programm_start, "blue_start1.bmp")
    Else
    GUICtrlSetImage($programm_start, "blue_start2.bmp")
    EndIf
    $programm_menu_show = False
    EndIf
    EndIf
    EndSwitch
    EndFunc
    Func configuration($mpar="go", $par1="", $par2="", $par3="", $par4=1)
    Switch $mpar
    Case "go"
    return IniRead($configuration_files[$par4], $par1, $par2, $par3)
    Case "save"
    IniWrite($configuration_files[$par4], $par1, $par2, $par3)
    Case "start"
    Global $configuration_files[2]
    $configuration_files[1] = @ProgramFilesDir&"\TimBlo\Tasklist\configuration.ini"
    EndSwitch
    EndFunc
    Func desklock($mpar="unlock", $par1="", $par2="")
    Switch $mpar
    Case "start"
    Global $programm_lock = GUICtrlCreatePic("blue_lock.bmp", 285, 616, 73, 31)
    _onEvent("create", $programm_startgui, $programm_lock, "desklock", "lock")
    $pos2 = WinGetPos("Program Manager")
    $desklock_gui = GUICreate("Desklocker", $pos2[2], $pos2[3], $pos2[0], $pos2[1], $WS_POPUP, $WS_EX_TOOLWINDOW)
    Case "lock"
    $desklock_password = configuration("go", "desklock", "password", "none")
    If $desklock_password <> "none" Then
    $pos2 = WinGetPos("Program Manager")
    WinMove($desklock_gui, "", $pos2[0], $pos2[1], $pos2[2], $pos2[3], 0)
    GUISetState(@SW_SHOW, $desklock_gui)
    WinSetOnTop($desklock_gui, "", 1)
    Else
    MsgBox(48, "Fehler", "Der Desktop kann nicht ohne Passwort gesperrt werden.")
    EndIf
    EndSwitch
    EndFunc
    Func _onEvent($mpar="go", $par0="0x0", $par1="0x0", $par2="", $par3="", $par4="")
    Switch $mpar
    Case "go"
    For $c = 1 To $_onEvent_events[0][0]
    If $_onEvent_events[$c][0] = @GUI_CtrlId Then
    Call($_onEvent_events[$c][1], $_onEvent_events[$c][2], $_onEvent_events[$c][3])
    MsgBox(0, "function endet", $_onEvent_events[$c][1]&"("&$_onEvent_events[$c][2]&", "&$_onEvent_events[$c][3]&")")
    Return 1
    EndIf
    Next
    MsgBox(0, "Fehler", "GuiControl nicht erkannt")
    Case "create"
    $_onEvent_events[0][0] += 1
    ReDim $_onEvent_events[$_onEvent_events[0][0]+1][4]
    $_onEvent_events[$_onEvent_events[0][0]][0] = $par1 ;ControlId
    $_onEvent_events[$_onEvent_events[0][0]][1] = $par2 ;Funktion
    $_onEvent_events[$_onEvent_events[0][0]][2] = $par3 ;Par1
    $_onEvent_events[$_onEvent_events[0][0]][3] = $par4 ;Par2
    GUISwitch($par0)
    GUICtrlSetOnEvent($par1, "_onEvent")
    Case "start"
    Global $_onEvent_events[1][4]
    $_onEvent_events[0][0] = 0
    EndSwitch
    EndFunc
    Func OnAutoItExit($mpar=0, $par1=0)
    Exit
    EndFunc

    [/autoit]


    Da die entsprechenden Grafiken vllt auch da sein sollten hab ich ne zip gemacht und angehängt

    Dateien

    Dies ist ein Arzeneimittel.
    Bei Risiken und Haluzinationen fressen sie die Packungsbeilage und schlagen Sie ihren Arzt oder Apotheker.
    Jede Haftung wird abgelent.

    Vielen Dank für Ihre Kundentreue.
    mfg. TimBlo

    Aperture Science

    http://www.youtube.com/watch?v=Y6ljFaKRTrI

    • Offizieller Beitrag

    Ich hab nix getestet - aber deine Funktion _onEvent arbeitet rekursiv. Kann mir nicht richtig vorstellen, wie das funktionieren soll. :rolleyes:
    Vielleicht liegt da das Problem? (oder ich hab nur grad 'nen Knoten im Hirn :P )

    Edit: Hast recht, nix Rekursion. ;) Da lag ich voll daneben. Also entweder Fernsehen oder Fragen beantworten ;)

  • Rekursiv = Sie ruft sich selber auf oder??
    wenn du das meinst, dann kann ich dir leider nicht glauben, sowas würde dann den CPU auslasten...
    passiert aber nie, es muss irgendwie an der Guieinrichtung liegen... ich hab doch keine ahnung was ich tun muss
    EDIT: ausserdem muss ich eigentlich sagen: ich kann da nirgends ne rekursion finden... aber ich hab gesagt es is kompliziert -> ne möchtegern OOP

    Dies ist ein Arzeneimittel.
    Bei Risiken und Haluzinationen fressen sie die Packungsbeilage und schlagen Sie ihren Arzt oder Apotheker.
    Jede Haftung wird abgelent.

    Vielen Dank für Ihre Kundentreue.
    mfg. TimBlo

    Aperture Science

    http://www.youtube.com/watch?v=Y6ljFaKRTrI