'Fenster' - Auflistung in Menüleiste

    • Offizieller Beitrag

    Alle gängigen Windowsprogramme haben den Menüpunkt "Fenster" in der Menüleiste um zwischen den geöffneten Fenstern zu switchen.
    Habe es bisher in der Form nicht als fertige Funktion bei Autoit entdeckt. Da ich es gerade benötigte, habe ich eine entsprechende Lösung erstellt.
    Vielleicht könnt ihr es auch mal brauchen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Dim $ItemKundenExist = 0, $ItemArtikelExist = 0, $ItemSerienExist = 0
    Dim $stat_Kunden, $stat_Artikel, $stat_Serien
    Dim $itemKunden, $itemArtikel, $itemSerien

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

    $MainGUI = GUICreate("Main", Default, Default, Default, Default, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_MAXIMIZE))
    $menu0 = GUICtrlCreateMenu("Datei")
    $m0_item1 = GUICtrlCreateMenuItem("Beenden", $menu0)
    $menu1 = GUICtrlCreateMenu("Stammdaten")
    $m1_item1 = GUICtrlCreateMenuItem("Kunden Strg+K", $menu1)
    $m1_item2 = GUICtrlCreateMenuItem("Artikel Strg+A", $menu1)
    $m1_item3 = GUICtrlCreateMenuItem("Seriennummern Strg+S", $menu1)
    $menu2 = GUICtrlCreateMenu("Fenster")
    $menu3 = GUICtrlCreateMenu("?")
    $m2_item1 = GUICtrlCreateMenuItem("Hilfe", $menu3)
    $m2_item2 = GUICtrlCreateMenuItem("Über", $menu3)

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

    $KundenGUI = GUICreate("Kunden", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
    $ArtikelGUI = GUICreate("Artikel", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
    $SerienGUI = GUICreate("Serien-Nr", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)

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

    GUISetState(@SW_SHOW,$MainGUI)
    HotKeySet("^k", "_StrgK")
    HotKeySet("^a", "_StrgA")
    HotKeySet("^s", "_StrgS")

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

    While 1
    _SetEntryFensterMenu()
    $msg = GuiGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE
    Select
    Case $msg[1] = $MainGUI
    ExitLoop
    Case $msg[1] = $KundenGUI
    GUISetState(@SW_HIDE,$KundenGUI)
    Case $msg[1] = $ArtikelGUI
    GUISetState(@SW_HIDE,$ArtikelGUI)
    Case $msg[1] = $SerienGUI
    GUISetState(@SW_HIDE,$SerienGUI)
    EndSelect
    Case $msg[1] = $MainGUI
    Select
    Case $msg[0] = $m0_item1
    ExitLoop
    Case $msg[0] = $m1_item1
    GUISetState(@SW_SHOW,$KundenGUI)
    Case $msg[0] = $m1_item2
    GUISetState(@SW_SHOW,$ArtikelGUI)
    Case $msg[0] = $m1_item3
    GUISetState(@SW_SHOW,$SerienGUI)
    Case $msg[0] = $itemKunden
    WinActivate("Kunden")
    Case $msg[0] = $itemArtikel
    WinActivate("Artikel")
    Case $msg[0] = $itemSerien
    WinActivate("Serien")
    Case $msg[0] = $m2_item1
    ;~ Hilfe
    Case $msg[0] = $m2_item2
    ;~ Über
    EndSelect
    EndSelect
    WEnd

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

    Func _StrgK()
    GUISetState(@SW_SHOW,$KundenGUI)
    EndFunc

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

    Func _StrgA()
    GUISetState(@SW_SHOW,$ArtikelGUI)
    EndFunc

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

    Func _StrgS()
    GUISetState(@SW_SHOW,$SerienGUI)
    EndFunc

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

    Func _SetEntryFensterMenu()
    $stat_Kunden = WinGetState("Kunden")
    If $stat_Kunden = 7 Or $stat_Kunden = 15 Then
    If $ItemKundenExist = 0 Then
    $itemKunden = GUICtrlCreateMenuItem("Kunden", $menu2)
    $ItemKundenExist = 1
    EndIf
    Else
    If $ItemKundenExist = 1 Then
    GUICtrlDelete($itemKunden)
    $ItemKundenExist = 0
    EndIf
    EndIf
    $stat_Artikel = WinGetState("Artikel")
    If $stat_Artikel = 7 Or $stat_Artikel = 15 Then
    If $ItemArtikelExist = 0 Then
    $itemArtikel = GUICtrlCreateMenuItem("Artikel", $menu2)
    $ItemArtikelExist = 1
    EndIf
    Else
    If $ItemArtikelExist = 1 Then
    GUICtrlDelete($itemArtikel)
    $ItemArtikelExist = 0
    EndIf
    EndIf
    $stat_Serien = WinGetState("Serien")
    If $stat_Serien = 7 Or $stat_Serien = 15 Then
    If $ItemSerienExist = 0 Then
    $itemSerien = GUICtrlCreateMenuItem("Serien", $menu2)
    $ItemSerienExist = 1
    EndIf
    Else
    If $ItemSerienExist = 1 Then
    GUICtrlDelete($itemSerien)
    $ItemSerienExist = 0
    EndIf
    EndIf
    EndFunc

    [/autoit]

    Edit 24.11.2008:
    Habe eine erweiterte Version erstellt.

    Edit 29.09.2011
    Ich habe mich nach langer Zeit mal wieder an dieses Skript gemacht und aus diesem doch recht umständlich in andere Skripte zu integrierenden Bsp. eine UDF erstellt.
    Etwas aufwändig, da ich die WM-Messages "belauschen" muß :D. Letztlich klappt es, wie gewünscht. Nur das automatische Aktivieren des zuletzt genutzten Fensters habe ich noch nicht gemanagt bekommen. Da kommen sich einige Messages in die Quere ;).
    Zur Benutzung:
    - Includieren der "MenuWindows.au3"
    - Das "Fenster"-Menü erstellen mit: _GUICtrlWindowsList_MenuCreate().
    - Registrieren der Fenster, die in diesem Menü verwaltet werden sollen mit: _GUICtrlWindowsList_Register.
    - Bei Bedarf kann man auch wieder die Registrierung mit: _GUICtrlWindowsList_UnRegister aufheben.

    Ich habe jedoch in völlig undifferenzierten Zeiträumen den Fall, dass beim Aktivieren oder Schließen eines registrierten Fensters das Hauptfenster "einfriert". Da es jedoch ohne Systematik geschieht, konnte ich den Fehler bisher nicht eingrenzen. Vielleicht kann jemand von euch das nachvollziehen und hat eine zündende Idee. :rolleyes:

    MenuWindows (v0.2)
    [autoit]

    #Region - TimeStamp
    ; 2011-09-29 19:08:13 v 0.2
    #EndRegion - TimeStamp

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

    ;===============================================================================
    ; Script Name......: MenuWindows
    ; Description......: Erstellen eines Menüs "Fenster" um im Main-Window aktivierte Fenster zu verwalten
    ; AutoIt version...: 3.3.6.1
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;
    ; Funktionen
    ; _GUICtrlWindowsList_MenuCreate Erstellen des Menüs "Fenster" und Registrierung des Main-Windows
    ; _GUICtrlWindowsList_Register Registrieren der Fenster, die im Menü Fenster verwaltet werden sollen
    ; Bis zu 20 Fenster können in einem Aufruf registriert werden
    ; _GUICtrlWindowsList_UnRegister Fenster von der Registration entfernen
    ;===============================================================================

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

    #include-once
    #include <Array.au3>
    #include <Constants.au3>
    #include <GUIConstantsEx.au3>
    #include <MenuConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

    OnAutoItExitRegister('__GUICtrlWindowsList_ShutDown')

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

    Global Const $MAXNUMBER_WINDOWS = 256 ; == inkl. Hauptfenster (Main immer an Index 0)
    Global $Buffer_Empty = ''
    For $i = 1 To 256
    $Buffer_Empty &= ' '
    Next
    Global $DefMenuTitle = 'Windows'
    If StringInStr("0407 0807 0c07 1007 1407", @OSLang) Then $DefMenuTitle = 'Fenster'

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

    Global $hProc_MnuWnd = DllCallbackRegister('__WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
    Global $aWndCollection[$MAXNUMBER_WINDOWS][3] ; <== [[hWnd, $hHook, Mnu-ID]]
    Global $hWnd_Main, $hHook_Main, $ID_MainMenu

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

    ;===============================================================================
    ; Function Name....: _GUICtrlWindowsList_MenuCreate
    ; Description......: Erstellen des Menüs "Fenster" und Registrierung des Main-Windows
    ; Parameter(s).....: $hGui Handle des Fensters,in dem das Menü erstellt wird
    ; optional $sTitle Menütitel, Standard: 'Fenster'
    ; Return Value(s)..: ID des erstellten Menüs
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlWindowsList_MenuCreate($hGui, $sTitle='') ; == Menü "Fenster" erstellen und Main-Window registrieren
    Switch $sTitle
    Case Default, -1, ''
    $sTitle = $DefMenuTitle
    EndSwitch
    $hHook_Main = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProc_MnuWnd))
    $hWnd_Main = $hGui
    $aWndCollection[0][0] = $hWnd_Main
    $aWndCollection[0][1] = $hHook_Main
    $ID_MainMenu = GUICtrlCreateMenu($sTitle)
    Return $ID_MainMenu
    EndFunc ;==>_GUICtrlWindowsList_MenuCreate

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

    ;===============================================================================
    ; Function Name....: _GUICtrlWindowsList_Register
    ; Description......: Registrieren der Fenster, die im Menü Fenster verwaltet werden sollen
    ; Parameter(s).....: $hGui_1 Fensterhandle das registriert werden soll
    ; optional $hGui_2 ..20 weitere Fensterhandle (bis zu 20 gesamt pro Aufruf)
    ; Requirement(s)...: Ein mit _GUICtrlWindowsList_MenuCreate() erstelltes Menü
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlWindowsList_Register($hGui_1, $hGui_2=0, $hGui_3=0, $hGui_4=0, $hGui_5=0, $hGui_6=0, $hGui_7=0, $hGui_8=0, $hGui_9=0, $hGui_10=0, _
    $hGui_11=0, $hGui_12=0, $hGui_13=0, $hGui_14=0, $hGui_15=0, $hGui_16=0, $hGui_17=0, $hGui_18=0, $hGui_19=0, $hGui_20=0)
    Local $aParam[2], $tmpHwnd
    For $i = 1 To 20
    $tmpHwnd = Eval('hGui_' & $i)
    If $tmpHwnd = 0 Then ExitLoop
    $aParam[0] = $tmpHwnd
    $aParam[1] = _WinAPI_SetWindowLong($tmpHwnd, $GWL_WNDPROC, DllCallbackGetPtr($hProc_MnuWnd))
    __GUICtrlWindowsList_Manage('add', $aParam)
    Next
    EndFunc ;==>_GUICtrlWindowsList_Register

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

    ;===============================================================================
    ; Function Name....: _GUICtrlWindowsList_UnRegister
    ; Description......: Fenster von der Registration entfernen
    ; Parameter(s).....: $hGui_1 erstes Fensterhandle das entfernt werden soll
    ; optional $hGui_2 ..20 weitere Fensterhandle (bis zu 20 gesamt pro Aufruf)
    ; Requirement(s)...: Ein mit _GUICtrlWindowsList_MenuCreate() erstelltes Menü
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlWindowsList_UnRegister($hGui_1, $hGui_2=0, $hGui_3=0, $hGui_4=0, $hGui_5=0, $hGui_6=0, $hGui_7=0, $hGui_8=0, $hGui_9=0, $hGui_10=0, _
    $hGui_11=0, $hGui_12=0, $hGui_13=0, $hGui_14=0, $hGui_15=0, $hGui_16=0, $hGui_17=0, $hGui_18=0, $hGui_19=0, $hGui_20=0)
    Local $aParam[2], $tmpHwnd
    For $i = 1 To 20
    $tmpHwnd = Eval('hGui_' & $i)
    If $tmpHwnd = 0 Then ExitLoop
    $aParam[0] = $tmpHwnd
    $aParam[1] = _WinAPI_SetWindowLong($tmpHwnd, $GWL_WNDPROC, DllCallbackGetPtr($hProc_MnuWnd))
    __GUICtrlWindowsList_Manage('del', $aParam)
    Next
    EndFunc ;==>_GUICtrlWindowsList_UnRegister

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

    #region - Helperfunktionen
    ;===============================================================================
    ; Function Name....: __GUICtrlWindowsList_ShutDown
    ; Description......: für alle Fenster __GUICtrlWindowsList_Clear() aufrufen
    ;===============================================================================
    Func __GUICtrlWindowsList_ShutDown()
    For $i = __GUICtrlWindowsList_Manage('getCount') To 0 Step -1
    __GUICtrlWindowsList_Clear($aWndCollection[$i][0], $aWndCollection[$i][1])
    Next
    EndFunc ;==>__GUICtrlWindowsList_ShutDown

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

    ;===============================================================================
    ; Function Name....: __GUICtrlWindowsList_Clear
    ; Description......: original WinProc für das Fenster wiederherstellen
    ;===============================================================================
    Func __GUICtrlWindowsList_Clear($hGui, $hHook)
    _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook)
    EndFunc ;==>__GUICtrlWindowsList_Clear

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

    ;===============================================================================
    ; Function Name....: __GUICtrlWindowsList_Manage
    ; Description......: Verwaltung
    ; - Registrieren /Lösche Registrierung der Fenster
    ; - Item Erstellen /Löschen
    ; - Anzahl registrierter Fenster zurückgeben
    ;===============================================================================
    Func __GUICtrlWindowsList_Manage($sCommand, $vParam='')
    Local Static $iCountWnd = 0
    Switch $sCommand
    Case 'add' ; == neues Fenster zur Menüverwaltung "Fenster" hinzufügen (bei Fensterregistrierung) [Parameterarray: hWnd, hHook]
    If $iCountWnd = $MAXNUMBER_WINDOWS Then Return SetError(1,0,$MAXNUMBER_WINDOWS)
    $iCountWnd += 1
    $aWndCollection[$iCountWnd][0] = $vParam[0] ; hWnd
    $aWndCollection[$iCountWnd][1] = $vParam[1] ; hHook
    $aWndCollection[$iCountWnd][2] = '' ; ID MenüItem

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

    Case 'del' ; == Fenster von Menüverwaltung "Fenster" entfernen [Parameter: Fensterhandle]
    Local $index = _ArraySearch($aWndCollection, $vParam)
    If @error Then Return
    __GUICtrlWindowsList_Clear($vParam, $aWndCollection[$index][1])
    _ArrayDelete($aWndCollection, $index)
    ReDim $aWndCollection[$MAXNUMBER_WINDOWS][3]
    $iCountWnd -= 1

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

    Case 'item_make' ; == Menüeintrag erstellen [Parameter: ArrayIndex]
    $aWndCollection[$vParam][2] = GUICtrlCreateMenuItem(WinGetTitle($aWndCollection[$vParam][0]), $ID_MainMenu, Default, 1)
    Return $aWndCollection[$vParam][2]

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

    Case 'item_del' ; == Menüeintrag entfernen [Parameter: Fensterhandle]
    Local $index = _ArraySearch($aWndCollection, $vParam, 1)
    If @error Then Return
    GUICtrlDelete($aWndCollection[$index][2])
    $aWndCollection[$index][2] = ''

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

    Case 'getCount' ; == Anzahl registrierter Fenster [Parameter: OHNE]
    Return $iCountWnd

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

    EndSwitch
    EndFunc ;==>__GUICtrlWindowsList_Manage

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

    ;===============================================================================
    ; Function Name....: __setChecked
    ; Description......: Menüeintrag für aktives Fenster markieren
    ;===============================================================================
    Func __setChecked($iIndex)
    For $i = 1 To __GUICtrlWindowsList_Manage('getCount')
    If $i = $iIndex Then
    GUICtrlSetState($aWndCollection[$i][2], $GUI_CHECKED)
    Else
    If BitAND(GUICtrlRead($aWndCollection[$i][2]), $GUI_CHECKED) Then GUICtrlSetState($aWndCollection[$i][2], $GUI_UNCHECKED)
    EndIf
    Next
    EndFunc ;==>__setChecked

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

    ;===============================================================================
    ; Function Name....: __WinProc
    ; Description......: Callbackfunktion, Messageverwaltung
    ;===============================================================================
    Func __WinProc($hWnd, $iMsg, $iwParam, $ilParam)
    Local Static $iLastMenuID = -1, $sLastMenuTxt = '', $tMENUITEMINFO = DllStructCreate($tagMENUITEMINFO)
    Local $index = _ArraySearch($aWndCollection, $hWnd)
    Local $currHook = $aWndCollection[$index][1], $menuID, $iLast
    If $index = -1 Then Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam) ; == nicht Main oder registriertes Fenster

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

    Switch $iMsg
    Case $WM_ACTIVATE ; == wenn Item nicht existiert ==> Erstellen
    Local $iIndexMatch = -1
    For $i = 1 To __GUICtrlWindowsList_Manage('getCount')
    If $aWndCollection[$i][0] = $hWnd Then
    $iIndexMatch = $i
    ExitLoop
    EndIf
    Next
    If $iIndexMatch = -1 Then Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam)
    If $aWndCollection[$iIndexMatch][2] = '' Then ; == MenüItem existiert noch nicht
    $menuID = __GUICtrlWindowsList_Manage('item_make', $iIndexMatch)
    __setChecked($iIndexMatch)
    EndIf

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

    Case $WM_SETFOCUS ; == Fenster hat Fokus ==> Checked setzen
    Local $index = _ArraySearch($aWndCollection, $hWnd, 1)
    If $index <> -1 Then __setChecked($index)

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

    Case $WM_KILLFOCUS ; == Fenster verliert Fokus (wurde geschlossen oder HIDE gesetzt)
    Local $index = _ArraySearch($aWndCollection, $hWnd, 1)
    If $index <> -1 Then
    Local $iState = WinGetState($hWnd)
    If $iState = 5 Then ; == Fenster geschlossen (@SW_HIDE gesetzt)
    __GUICtrlWindowsList_Manage('item_del', $hWnd)
    EndIf
    EndIf

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

    Case $WM_MENUSELECT
    Local $ID_Menu = BitAND($iwParam, 0xFFFF) ; == ID des Menüeintrags
    Local $aRet = DllCall('User32.dll', 'int', 'GetMenu', 'hwnd', $hWnd)
    Local $hWndMenu = $aRet[0] ; == Handle des Menüs
    ; $tMENUITEMINFO: 'Size','Mask','Type','State','ID','SubMenu','BmpChecked','BmpUnchecked','ItemData','ptr TypeData','CCH','BmpItem'
    Local $TypeData = DllStructCreate('char[256]')
    DllStructSetData($TypeData, 1, $Buffer_Empty & Chr(0))
    Local $fMask = BitOR($MIIM_ID,$MIIM_DATA,$MIIM_TYPE,$MIIM_SUBMENU)
    DllStructSetData($tMENUITEMINFO, 1, DllStructGetSize($tMENUITEMINFO)) ; == Size
    DllStructSetData($tMENUITEMINFO, 2, $fMask) ; == Mask
    DllStructSetData($tMENUITEMINFO, 3, $MF_STRING) ; == Type
    DllStructSetData($tMENUITEMINFO, 4, $MFS_DEFAULT) ; == State
    DllStructSetData($tMENUITEMINFO,10, DllStructGetPtr($TypeData)) ; == TypeData
    DllStructSetData($tMENUITEMINFO,11, 256) ; == CCH
    $aRet = DllCall('User32.dll', 'int', 'GetMenuItemInfo', 'hwnd', $hWndMenu, 'uint', $ID_Menu, 'bool', 0, 'ptr', DllStructGetPtr($tMENUITEMINFO))
    If $aRet[0] = 1 Then
    $iLastMenuID = $ID_Menu ; == ID speichern falls Item angeklickt wird (Event: WM_UNINITMENUPOPUP)
    $sLastMenuTxt = DllStructGetData($TypeData, 1)
    EndIf

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

    Case $WM_UNINITMENUPOPUP ; == MenüItem wurde angeklickt
    Local $index = _ArraySearch($aWndCollection, $iLastMenuID, 1, 0, 0, 0, 1, 2)
    If $index <> -1 Then
    WinActivate($aWndCollection[$index][0])
    __setChecked($index)
    EndIf

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

    Case Else
    Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam)
    EndSwitch
    Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam)
    EndFunc ;==>_WinProc
    #endregion - Helperfunktionen

    [/autoit]

    Und hier ein Bsp.:

    Bsp_MenuWindows
    [autoit]

    #Region - TimeStamp
    ; 2011-09-29 19:08:02 v 0.1
    #EndRegion - TimeStamp

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

    #include-once
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include 'MenuWindows.au3'

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

    Opt('GUIOnEventmode', 1)
    Opt("GUIEventOptions",1)

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

    ; Deklaration der Sub-GUI
    Global $hWnd_Kunden = GUICreate("Kunden" , 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
    Global $hWnd_Artikel = GUICreate("Artikel" , 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
    Global $hWnd_Serien = GUICreate("SerienNr", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_closeWnd', $hWnd_Kunden)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_closeWnd', $hWnd_Artikel)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_closeWnd', $hWnd_Serien)
    _GUICtrlWindowsList_Register($hWnd_Kunden, $hWnd_Artikel, $hWnd_Serien) ; == Alle Subwindows für das "Fenster"-Menü registrieren

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

    ; Deklaration der Main-GUI
    $MainGUI = GUICreate("Main", -1, -1, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_MAXIMIZE))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_closeMain')
    $menu0 = GUICtrlCreateMenu("Menü")
    $m0_item1 = GUICtrlCreateMenuItem("Ende", $menu0)
    GUICtrlSetOnEvent(-1, '_closeMain')
    $menu1 = GUICtrlCreateMenu("Stammdaten")
    $m1_item1 = GUICtrlCreateMenuItem("Kunden Strg+K", $menu1)
    GUICtrlSetOnEvent(-1, '_StrgK')
    $m1_item2 = GUICtrlCreateMenuItem("Artikel Strg+A", $menu1)
    GUICtrlSetOnEvent(-1, '_StrgA')
    $m1_item3 = GUICtrlCreateMenuItem("SerienNr Strg+S", $menu1)
    GUICtrlSetOnEvent(-1, '_StrgS')
    $menu2 = _GUICtrlWindowsList_MenuCreate($MainGUI) ; == registriert Main-GUI und erstellt Menü: "Fenster"
    $menu3 = GUICtrlCreateMenu("?")
    $m2_item1 = GUICtrlCreateMenuItem("Hilfe", $menu3)
    $m2_item2 = GUICtrlCreateMenuItem("Über", $menu3)
    GUISetState(@SW_SHOW, $MainGUI)

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

    While 1
    Sleep(100)
    WEnd

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

    ; Hauptfenster schließen
    Func _closeMain()
    Exit
    EndFunc

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

    ; Unterfenster schließen
    Func _closeWnd()
    GUISetState(@SW_HIDE, @GUI_WinHandle)
    EndFunc

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

    #region - Shortcut Funktionen
    Func _StrgK()
    _RunShortcuts($hWnd_Kunden)
    EndFunc

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

    Func _StrgA()
    _RunShortcuts($hWnd_Artikel)
    EndFunc

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

    Func _StrgS()
    _RunShortcuts($hWnd_Serien)
    EndFunc
    ; per Shortcut gewähltes Fenster einblenden und aktivieren
    Func _RunShortcuts($hWnd)
    GUISetState(@SW_SHOW, $hWnd)
    WinActivate($hWnd)
    EndFunc
    #endregion - Shortcut Funktionen

    [/autoit]
    • Offizieller Beitrag

    Freut mich, wenn's gefällt.
    Ich hatte eigentlich vermutet, dass dieses Problem entweder in einer Autoit-Funktion oder zumindest im engl. Forum bereits behandelt wurde.
    Also entweder war ich wirklich der erste, der das durchführen wollte (kann ich mir eigentlich nicht vorstellen) oder es hat einfach noch nie jemand reingestellt.

    Die Suchfunktion im engl. Forum ist allerdings ziemlich unnütz. Nur eine sehr geringe Trefferquote. Ich hab als Bsp. " 'menu bar item window' " in die Suche eingegeben. Ergebnis: 54 Seiten (limitiert auf 1000 Treffer) und nur 1 !! Beitrag zu diesem Thema - nämlich meiner. :schild4:
    Das Problem besteht eigentlich bei jeder Suche dort. :(

  • Die Suche auf dem englischen Board ist eigentlich doch ganz in Ordnung - man muss bloß den Trick kennen ;)

    Bei einem Invision Power Board muss man in der Suche mehrere Wörter mit einem "+" verbinden - ansonsten sucht er nach jedem Wort einzeln.
    Also in dem Fall alle Threads in denen entweder "menu" vorkommt oder "bar" etc...

    so solltest du bessere Ergebnisse erzielen:

    Code
    menu +bar +item +window

    Einmal editiert, zuletzt von AspirinJunkie (28. Oktober 2006 um 23:57)

  • Hallo.

    Genau so ein Menü gefällt mir schon sehr gut. Ich möchte ja selber eine solche Oberfläche haben, nur sollen keine POPUP-Fenster aufgehen, sondern das was ich anklicke soll im großen grauen Feld geöffnet werden.

    Habe ich dann im großen grauen Feld zum Beispiel ein AutoIt erstelltes Programm laufen, kann ich zusätzlich noch über die Navigation oben POPUP-Fenster anrufen um mir zum Beispiel weitere Informationen zu erhalten.

    Mein Problem ist es einfach, das ich nicht weiß, wie ich das eine oder andere Programm im grauen Feld erscheinen lassen kann.

    Habe in Therend "Arebitsfenster" bereits meine Dateistruktur aufgeschrieben.

    Liebe Grüße an alle und morgen einen schönen ersten Mai.

    Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    Hi,
    habe das nochmals aufgegriffen und etwas erweitert.
    - Das jeweils aktive Fenster wird im Fenstermenü angehakt
    - Beim Schließen eines Fensters, wird das zuletzt aktive erneut aktiviert

    Spoiler anzeigen
    [autoit]


    #include<WindowsConstants.au3>
    #include <GUIConstants.au3>
    Opt('GUIOnEventmode', 1)
    Opt("GUIEventOptions",1)

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

    ; Deklaration der Sub-GUI
    Global $arWindow[3][3] = [ _ ; ID,State,PosShow
    [Execute('GUICreate("Kunden" , 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)'),1,0], _
    [Execute('GUICreate("Artikel" , 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)'),1,0], _
    [Execute('GUICreate("SerienNr", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)'),1,0]]
    For $i = 0 To UBound($arWindow) -1
    GUISetOnEvent($GUI_EVENT_CLOSE, '_closeSub', $arWindow[$i][0])
    Next

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

    ; Hotkeys zum Einblenden der Sub-GUI
    HotKeySet("^k", "_StrgK")
    HotKeySet("^a", "_StrgA")
    HotKeySet("^s", "_StrgS")

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

    ; Erstellen Array für ID im Menü 'Fenster' -- Reihenfolge identisch mit erstellten Fenstern, identische Titel!!
    Global $arWndItem[3][3] = [ _ ; ID,Title,Exists
    [0,'Kunden' ,0], _
    [0,'Artikel' ,0], _
    [0,'SerienNr',0]]

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

    ; Deklaration der Main-GUI
    $MainGUI = GUICreate("Main", -1, -1, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_MAXIMIZE))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_closeMain')
    $menu0 = GUICtrlCreateMenu("Menü")
    $m0_item1 = GUICtrlCreateMenuItem("Ende", $menu0)
    GUICtrlSetOnEvent(-1, '_closeMain')
    $menu1 = GUICtrlCreateMenu("Stammdaten")
    $m1_item1 = GUICtrlCreateMenuItem("Kunden Strg+K", $menu1)
    GUICtrlSetOnEvent(-1, '_StrgK')
    $m1_item2 = GUICtrlCreateMenuItem("Artikel Strg+A", $menu1)
    GUICtrlSetOnEvent(-1, '_StrgA')
    $m1_item3 = GUICtrlCreateMenuItem("SerienNr Strg+S", $menu1)
    GUICtrlSetOnEvent(-1, '_StrgS')
    $menu2 = GUICtrlCreateMenu("Fenster")
    $menu3 = GUICtrlCreateMenu("?")
    $m2_item1 = GUICtrlCreateMenuItem("Hilfe", $menu3)
    $m2_item2 = GUICtrlCreateMenuItem("Über", $menu3)
    GUISetState(@SW_SHOW, $MainGUI)

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

    GUIRegisterMsg($WM_SETFOCUS, 'WM_SETFOCUS')

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

    While 1
    Sleep(100)
    WEnd

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

    #region - Shortcut Funktionen
    Func _StrgK()
    _RunShortcuts(0)
    EndFunc

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

    Func _StrgA()
    _RunShortcuts(1)
    EndFunc

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

    Func _StrgS()
    _RunShortcuts(2)
    EndFunc
    ; per Shortcut gewähltes Fenster einblenden und aktivieren
    Func _RunShortcuts($i)
    GUISetState(@SW_SHOW,$arWindow[$i][0])
    WinActivate($arWindow[$i][0])
    _byWinActivate($arWindow[$i][0])
    _checkState()
    _SetEntryWindowMenu()
    EndFunc
    #endregion - Shortcut Funktionen

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

    ; Hauptfenster schließen
    Func _closeMain()
    Exit
    EndFunc

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

    ; Unterfenster schließen
    Func _closeSub()
    For $i = 0 To UBound($arWindow) -1
    If WinGetHandle($arWindow[$i][0]) = @GUI_WinHandle Then
    GUISetState(@SW_HIDE, $arWindow[$i][0])
    _byWinHide($arWindow[$i][0])
    ExitLoop
    EndIf
    Next
    _checkState()
    _SetEntryWindowMenu()
    EndFunc

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

    ; ein Fenster wird aktiviert - Reihenfolge speichern
    Func _byWinActivate($ID)
    Local $pos, $max = 0
    For $i = 0 To UBound($arWindow) -1
    If $arWindow[$i][0] = $ID Then $pos = $i
    If $arWindow[$i][2] > $max Then $max = $arWindow[$i][2]
    Next
    If $arWindow[$pos][2] = 0 Then
    $arWindow[$pos][2] = $max +1
    ElseIf $arWindow[$pos][2] = $max Then
    Return
    Else
    For $i = 0 To UBound($arWindow) -1
    If $arWindow[$i][0] = $ID Then
    $arWindow[$i][2] = $max
    ElseIf $arWindow[$i][2] > 0 Then
    $arWindow[$i][2] = $arWindow[$i][2] -1
    EndIf
    Next
    EndIf
    EndFunc

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

    ; Fenster wird Hide gesetzt - das zuvor aktive Fenster aktivieren
    Func _byWinHide($ID)
    Local $pos, $max = 0
    For $i = 0 To UBound($arWindow) -1
    If $arWindow[$i][0] = $ID Then $arWindow[$i][2] = 0
    If $arWindow[$i][2] > $max Then
    $max = $arWindow[$i][2]
    $pos = $i
    EndIf
    Next
    If $max > 0 Then
    WinActivate($arWindow[$pos][0])
    _checkState()
    _setChecked()
    EndIf
    EndFunc

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

    ; Fenstereintrag geklickt
    Func _WindowItem()
    For $i = 0 To UBound($arWndItem) -1
    If $arWndItem[$i][0] = @GUI_CtrlId Then
    WinActivate($arWindow[$i][0])
    _byWinActivate($arWindow[$i][0])
    ExitLoop
    EndIf
    Next
    _checkState()
    _setChecked()
    EndFunc

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

    ; Fensterstatus prüfen
    Func _checkState()
    For $i = 0 To UBound($arWindow) -1
    $arWindow[$i][1] = WinGetState($arWindow[$i][0])
    Next
    EndFunc

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

    ; Fenster-Menü-Eintrag setzen
    Func _SetEntryWindowMenu()
    For $i = 0 To UBound($arWindow) -1
    If $arWindow[$i][1] = 7 Or $arWindow[$i][1] = 15 Then
    If $arWndItem[$i][2] = 0 Then
    $arWndItem[$i][0] = GUICtrlCreateMenuItem($arWndItem[$i][1], $menu2)
    GUICtrlSetOnEvent($arWndItem[$i][0], '_WindowItem')
    $arWndItem[$i][2] = 1
    EndIf
    Else
    If $arWndItem[$i][2] = 1 Then
    GUICtrlDelete($arWndItem[$i][0])
    $arWndItem[$i][2] = 0
    EndIf
    EndIf
    Next
    _setChecked()
    EndFunc

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

    ; Menüeintrag für aktives Fenster markieren
    Func _setChecked()
    For $i = 0 To UBound($arWindow) -1
    If $arWindow[$i][1] = 15 Then
    GUICtrlSetState($arWndItem[$i][0], $GUI_CHECKED)
    Else
    GUICtrlSetState($arWndItem[$i][0], $GUI_UNCHECKED)
    EndIf
    Next
    EndFunc

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

    ; wenn ein Fenster den Fokus bekommt
    Func WM_SETFOCUS($hWnd)
    Local $match = False
    For $i = 0 To UBound($arWindow) -1
    If WinGetHandle($arWindow[$i][0]) = $hWnd Then
    _byWinActivate($arWindow[$i][0])
    $match = True
    ExitLoop
    EndIf
    Next
    If $match Then
    _checkState()
    _setChecked()
    EndIf
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Coole sache des Script. Bei deinem Script interessiert mich vorallem wie du die Menüeinträge im Fenster/Menü erstellst. Hab mich schon öfter mal damit befaßt aber bin immer gescheitert. Irgendwie habe ich des nicht richtig kapiert wie ich Dynamische Menüeinträge erstelle . Bis heute. Darf ich einige Functionen aus deinem Script in mein Script übernehmen ?

    • Offizieller Beitrag

    Aus dem Skript-Bsp. habe ich jetzt eine UDF erstellt. s. Post #1
    Aber.. noch ein kleines Problem:
    Ohne erkennbaren Grund friert manchmal beim Schließen von registrierten Fenstern oder beim Fokuswechsel zwischen diesen das Skript ein. Ich konnte bisher die Ursache nicht ausmachen - vielleicht hat jemand von euch den zündenden Gedanken.