aktive Fenster im TrayMenü anzeigen und Nicht-/OnTop setzen

  • aktive fenster auslesen
    PID der aktiven fenster auslesen
    prozessnamen der aktiven fenster auslesen
    prozessnamen in traymenü aufnehmen
    .. hab ich schon geschafft *g*

    wie mach ich es nun, dass ich über nen klick auf nen traymenü eintrag, ein fenster OnTop setze, den eintrag im traymenü "checke" und bei nem erneuten klick wieder alles rückgängig mache?
    iwie kann ich den einträgen keine variable zuordnen ($TrayEntry[$i] zB)

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <Process.au3>

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

    $var = WinList()

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

    For $i = 1 to $var[0][0]
    ; Only display visble windows that have a title
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    $ProcessName = _ProcessGetName(WinGetProcess($var[$i][0]))
    TrayCreateItem($ProcessName)
    EndIf
    Next

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

    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf

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

    EndFunc

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

    While 1
    Sleep(1000)
    WEnd

    [/autoit]
  • Habe eine Frage, Du schreibst rückgängig machen, was meinst Du damit genau?

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

    • Offizieller Beitrag

    So etwas?

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    Opt('TrayOnEventMode', 1)
    Opt("TrayMenuMode",1)

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

    Global $state = False
    $gui = GUICreate('TEST')

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

    $t_mnu = TrayCreateMenu('Mein Traymenü')
    $t_sub1 = TrayCreateItem('Fenster on/off', $t_mnu)
    TrayItemSetOnEvent(-1, 'Toggle')
    $t_sub2 = TrayCreateItem('Ende', $t_mnu)
    TrayItemSetOnEvent(-1, 'Ende')

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

    TraySetState()

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

    While True
    Sleep(100)
    WEnd

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

    Func Toggle()
    If $state Then
    GUISetState(@SW_HIDE, $gui)
    TrayItemSetState($t_sub1, $TRAY_UNCHECKED)
    Else
    GUISetState(@SW_SHOW, $gui)
    TrayItemSetState($t_sub1, $TRAY_CHECKED)
    EndIf
    $state = Not $state
    EndFunc

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

    Func Ende()
    Exit
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Hier mal, wie du die Fensterliste reinbekommst:

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    Opt('TrayOnEventMode', 1)
    Opt("TrayMenuMode",1)
    Opt('WinTitleMatchMode', 2)

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

    Global $aWin

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

    $gui1 = GUICreate('TEST 1')
    $gui2 = GUICreate('TEST 2')
    $gui3 = GUICreate('TEST 3')
    $gui4 = GUICreate('TEST 4')

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

    $aWin = WinList('TEST') ; alle Fenster mit TEST im Titel
    Global $aState[$aWin[0][0]][3] ; [0]= ID TrayItem, [1]= True/False (checked/unchecked), [2]= WinHandle
    For $i = 0 To UBound($aState) -1
    $aState[$i][1] = False
    $aState[$i][2] = $aWin[$i+1][1]
    Next

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

    $t_mnu = TrayCreateMenu('Mein Traymenü')
    For $i = 1 To UBound($aWin) -1
    $aState[$i-1][0] = TrayCreateItem($aWin[$i][0], $t_mnu)
    TrayItemSetOnEvent(-1, 'Toggle')
    Next
    $t_shape = TrayCreateItem('', $t_mnu)
    $t_end = TrayCreateItem('Ende', $t_mnu)
    TrayItemSetOnEvent(-1, 'Ende')

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

    TraySetState()

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

    While True
    Sleep(100)
    WEnd

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

    Func Toggle()
    For $i = 0 To UBound($aState) -1
    If $aState[$i][0] = @TRAY_ID Then
    If $aState[$i][1] Then
    GUISetState(@SW_HIDE, $aState[$i][2])
    TrayItemSetState($aState[$i][0], $TRAY_UNCHECKED)
    Else
    GUISetState(@SW_SHOW, $aState[$i][2])
    TrayItemSetState($aState[$i][0], $TRAY_CHECKED)
    EndIf
    $aState[$i][1] = Not $aState[$i][1]
    ExitLoop
    EndIf
    Next
    EndFunc

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

    Func Ende()
    Exit
    EndFunc

    [/autoit]


    Aktualisieren kannst du auch, WinList intervallmäßig durchführen und mit der bestehenden Liste(Array) vergleichen. Wenn Unterschiede neu erstellen. Das kriegst du schon hin. ;)

  • Spoiler anzeigen
    [autoit]

    $var = WinList()

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

    For $i = 1 to $var[0][0]
    ; Only display visble windows that have a title
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    $ProcessName = _ProcessGetName(WinGetProcess($var[$i][0]))
    TrayCreateItem($ProcessName)
    EndIf
    Next

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

    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf

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

    EndFunc

    [/autoit]

    das müsste da rein ... doch dazu müsste noch, dass die TrayItems ne Variable bekommen, damit ich diese nachher ansprechen kann.

    • Offizieller Beitrag

    Hi,
    es ist noch ein kleiner Bug drin - aber jetzt zu spät (oder früh :P) um danach zu suchen. Die Grundfunktionalität wird aber ersichtlich.

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <Process.au3>
    Opt('TrayOnEventMode', 1)
    Opt("TrayMenuMode",1)
    Opt('WinTitleMatchMode', 2)

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

    Global $aWin, $aComp, $aState[1][3]
    $aState[0][0] = -1

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

    $aWin = WinList()
    $t_mnu = TrayCreateMenu('Visible Windows')
    $t_shape = TrayCreateItem('')
    $t_end = TrayCreateItem('Ende')
    TrayItemSetOnEvent(-1, 'Ende')
    _CreateTrayItem()

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

    TraySetState()

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

    AdlibEnable('_CompareArrays', 10000)

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

    While True
    Sleep(100)
    WEnd

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

    Func Ende()
    Exit
    EndFunc

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

    Func Toggle()
    For $i = 0 To UBound($aState) -1
    If $aState[$i][0] = @TRAY_ID Then
    If $aState[$i][1] Then
    WinSetState($aState[$i][2], '', @SW_HIDE)
    TrayItemSetState($aState[$i][0], $TRAY_UNCHECKED)
    Else
    WinSetState($aState[$i][2], '', @SW_SHOW)
    TrayItemSetState($aState[$i][0], $TRAY_CHECKED)
    EndIf
    $aState[$i][1] = Not $aState[$i][1]
    ExitLoop
    EndIf
    Next
    EndFunc

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

    Func _CreateTrayItem()
    Local $i, $k
    For $i = 1 To UBound($aWin) -1
    If $aWin[$i][0] <> "" AND IsVisible($aWin[$i][1]) Then
    If $aState[0][0] = -1 Then ; [0]= ID TrayItem, [1]= True/False (checked/unchecked), [2]= WinTitle
    $k = 0
    Else
    ReDim $aState[UBound($aState)+1][3]
    $k = UBound($aState)-1
    EndIf
    $ProcessName = _ProcessGetName(WinGetProcess($aWin[$i][0]))
    $aState[$k][0] = TrayCreateItem($ProcessName, $t_mnu)
    TrayItemSetOnEvent(-1, 'Toggle')
    TrayItemSetState(-1, $TRAY_CHECKED)
    $aState[$k][1] = True
    $aState[$k][2] = $aWin[$i][0]
    EndIf
    Next
    $aComp = $aWin
    EndFunc

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

    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc

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

    Func _CompareArrays()
    $aWin = WinList()
    For $i = 0 To UBound($aWin) -1
    If $aWin[$i][0] <> $aComp[$i][0] Then
    _DelItems()
    _CreateTrayItem()
    EndIf
    Next
    EndFunc

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

    Func _DelItems()
    For $i = 0 To UBound($aState) -1
    TrayItemDelete($aState[$i][0])
    Next
    ReDim $aState[1][3]
    $aState[0][0] = -1
    EndFunc

    [/autoit]

    Edit:
    Du willst ja das jeweilige Fenster OnTop setzen. Insofern ist @SW_SHOW / @SW_HIDE nicht so passend.
    Mit WinSetOnTop läßt sich das realisieren - allerdings müßte man für den richtigen Status wissen, welches Fenster im Augenblick OnTop ist. Und das ist über WinGetState nicht ermittelbar. Mal sehen, ob es dafür eine Möglichkeit gibt.

    Hab nochmal ein wenig gesucht - aber keine Möglichkeit gefunden, das Fenster im Vordergrund zu identifizieren. Eine entsprechende WinApi-Funktion bringt auch nur das Vordergrundfenster, wenn es aktiv ist zurück.

  • hi bugfix,

    vielen dank für die hilfe. das sieht sehr gut aus, so wie ich es mir vorgestellt habe.

    das mit dem akiven fenster herausfinden könnte man doch über "checked" im traymenü rausfinden (wenn man davon ausgeht, dass nur diese fenster ON TOP sind und über das traymenü gesetzt wurden) ...

    jedoch bleibt das problem des users. wir arbeiten mit 19", bzw 22" monitoren ... da kann man auch mal mehrere fenster "sinnvoll" on top setzen.

    aber big thx, habe ich heute abend was zu tun +g*