• WinSetOnTop V2

    -listet alle aktiven fenster auf
    -setz ein oder mehrere fenster "On Top" bzw. zurück
    -auf knopfdruck "F9" setzt es das zZ aktive fenster "On Top" bzw. zurück (thx propagandy)
    -kann immer per ALT Gr + 0 angezeigt/minimiert werden
    -sofern fenster aktiv, kann es per ESC angezeigt/minimiert werden
    -schließen mit "x"
    -liste wird auf knopfdruck "update" erneuert, fenster attribute bleiben erhalten (On Top)
    -fenster die "On Top" sind, werden in der liste mit "x" gekennzeichnet
    -beim schließen werden alle "On Top" attribute gelöscht

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon

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

    #include <WINAPI.au3>
    #include <array.au3>
    #include <Process.au3>
    #include <File.au3>
    #include <GUIConstants.au3>
    #Include <GuiListView.au3>
    #include <GuiConstantsEx.au3>

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

    Opt("WinTitleMatchMode", 2)
    Opt("OnExitFunc", "endscript")
    Opt("GUIOnEventMode", 1)
    Opt("GUICloseOnESC", 0)

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

    Global $var2
    Global $WinList
    Global $ini = @scriptdir & "\ActiveWin.ini"
    Global $ListView1, $B_DESCENDING
    Global $tInfo

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

    $dll = DllOpen("user32.dll")

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

    HotKeySet("^!0", "HiDE")
    HotKeySet("{F9}","_ToggleOnTop")

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

    $Form1 = GUICreate("WinSetOnTop - Set active Window with F9 on Top", 300, 290, 0, 0, -1, $WS_EX_TOOLWINDOW )
    GUISetOnEvent($GUI_EVENT_CLOSE, "endscript")
    $Button1 = GUICtrlCreateButton("Set on Top or Back", 0,0,300,20)
    GUICtrlSetOnEvent(-1, "_SetOnTop")
    $ListView1 = _GUICtrlListView_Create ($Form1, "", 0, 20, 300, 250, $LVS_REPORT + $LVS_SINGLESEL + $LVS_SHOWSELALWAYS + $WS_CHILD + $WS_VISIBLE)
    GUICtrlSetOnEvent(-1, "_SetOnTop")
    _GUICtrlListView_SetExtendedListViewStyle ($ListView1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_TWOCLICKACTIVATE, $LVS_EX_HEADERDRAGDROP, $LVS_EX_GRIDLINES, $LVS_EX_BORDERSELECT ))
    _GUICtrlListView_InsertColumn ($ListView1, 0, "Process", 80)
    _GUICtrlListView_InsertColumn ($ListView1, 1, "Window", 180)
    _GUICtrlListView_InsertColumn ($ListView1, 2, "Top", 40)
    $Button2 = GUICtrlCreateButton("Update", 0, 271, 300, 20, 0)
    GUICtrlSetOnEvent(-1, "_Update")

    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount ($ListView1) ]

    GUISetState(@SW_SHOW)
    WinSetOnTop($Form1,'',1)
    WinSetTrans($Form1,'', 220)

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

    _update()

    While 1
    Sleep(10)
    If _IsPressed("1B") Then
    $WinGetState = WinGetState("WinSetOnTop - Set active Window with F9 on Top")
    If $WinGetState = 15 or $WinGetState = 31 Then HiDE()
    EndIf
    WEnd

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

    Func _Update()
    If FileExists($ini) Then
    $Sections = IniReadSectionNames($ini)
    If Not @error Then
    For $i = 1 To $Sections[0]
    IniDelete($ini, $Sections[$i])
    Next
    EndIf
    EndIf

    _GUICtrlListView_DeleteAllItems($ListView1)

    $var = WinList()
    For $i = 1 to $var[0][0]
    If Not @error Then
    ; Only display visble windows that have a title
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    $ProcessName = _ProcessGetName(WinGetProcess($var[$i][0]))
    If $ProcessName = @ScriptName Then
    Else
    IniWriteSection($ini, $ProcessName, "")
    IniWrite($ini, $ProcessName, $var[$i][0], "")
    $true = _WinIsOnTop($var[$i][0])
    If $true = True Then IniWrite($ini, $ProcessName, $var[$i][0], "x")
    EndIf
    EndIf
    EndIf
    Next

    $Sections = IniReadSectionNames($ini)
    If Not @error Then
    For $i = 1 To $Sections[0]
    $Section = IniReadSection($ini, $Sections[$i])
    If Not @error Then
    For $e = 1 To $Section[0][0]
    _GUICtrlListView_AddItem($ListView1, $Sections[$i])
    _GUICtrlListView_AddSubItem($ListView1, _GUICtrlListView_GetItemCount($ListView1) - 1, $Section[$e][0], 1)
    _GUICtrlListView_AddSubItem($ListView1, _GUICtrlListView_GetItemCount($ListView1) - 1, IniRead($ini, $Sections[$i], $Section[$e][0], ""), 2)
    Next
    EndIf
    Next
    EndIf

    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount ($ListView1) ]
    _GUICtrlListView_SimpleSort ($ListView1, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))

    WinSetOnTop($Form1,'',1)

    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 _SetOnTop()
    For $i = 1 To _GUICtrlListView_GetItemCount($ListView1)
    $Checked = _GUICtrlListView_GetItemChecked($ListView1, $i - 1)
    If $Checked = True Then
    $Sec = _GUICtrlListView_GetItemText($ListView1, $i - 1)
    $key = _GUICtrlListView_GetItemText($ListView1, $i - 1, 1)
    $ReadOnTop = IniRead($ini, $Sec, $key, "")
    If $ReadOnTop = "" Then
    WinActivate($key)
    WinSetOnTop($key, "", 1)
    IniWrite($ini, $Sec, $key, "x")
    _GUICtrlListView_AddSubItem($ListView1, $i -1, "x", 2)
    Else
    WinSetOnTop($key, "", 0)
    WinSetState($key, "", @sw_minimize)
    IniWrite($ini, $Sec, $key, "")
    _GUICtrlListView_AddSubItem($ListView1, $i -1, "", 2)
    EndIf
    EndIf
    Next
    For $i = 1 To _GUICtrlListView_GetItemCount($ListView1)
    _GUICtrlListView_SetItemChecked($ListView1, $i - 1, False)
    Next

    WinSetOnTop($Form1,'',1)

    EndFunc

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

    Func endscript()
    If FileExists($ini) Then
    $Sections = IniReadSectionNames($ini)
    If Not @error Then
    For $i = 1 To $Sections[0]
    $ReadOnTop = IniReadSection($ini, $Sections[$i])
    If Not @error Then
    For $e = 1 To $ReadOnTop[0][0]
    WinSetOnTop($ReadOnTop[$e][0], "", 0)
    Next
    EndIf
    IniDelete($ini, $Sections[$i])
    Next
    EndIf
    EndIf
    DllClose($dll)
    Exit
    EndFunc

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

    Func _ToggleOnTop()
    WinSetOnTop("","",Not _WinIsOnTop(""))
    _update()
    EndFunc

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

    Func HiDE()
    $State = WinGetState($Form1)
    If $State = 15 Or $State = 7 Then
    WinSetState($Form1, "", @sw_minimize)
    ElseIf $State = 23 Then
    WinSetState($Form1, "", @SW_RESTORE)
    Else
    WinSetState($Form1, "", @SW_RESTORE)
    EndIf
    EndFunc

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

    Func _WinIsOnTop($WindowHandle)
    Local $long = _WinAPI_GetWindowLong(WinGetHandle($WindowHandle),$GWL_EXSTYLE)
    Return BitAND($long,8)=8 ; $WS_EX_TOPMOST = 8
    EndFunc

    [/autoit]
  • Hi sc4ry,
    cooles Script. Vorallem der durchsichtige Hintergrund. COOL. Funzt einwandfrei, solltest nur das X in der Kopfleiste wieder reinnehmen.
    Einfacher wie ESC und braucht keine Erklärung.
    MfG
    Der_Doc

  • Schönes Script. Wie wärs mit nem Hotkey zum Vertecken und anzeigen?
    Der_Doc: ALT-F4 geht auch :)
    [angeb]Meine Tastatur hat sogar ne X- Taste :P[/angeb]

  • OnTop-Windows bekommen:

    [autoit]

    #include-once
    #include <WINAPI.au3>
    ;===============================================================================
    ;
    ; Function Name: _WinIsOnTop
    ; Description:: Gets the OnTop State of a window
    ; Parameter(s): $WindowHandle : Handle or Title of Window
    ; Requirement(s): WinAPI.au3
    ; Return Value(s): Window OnTop: True, otherwise False
    ; Author(s): Prog@ndy
    ;
    ;===============================================================================
    ;

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

    Func _WinIsOnTop($WindowHandle)
    Local $long = _WinAPI_GetWindowLong(WinGetHandle($WindowHandle),$GWL_EXSTYLE)
    Return BitAND($long,8)=8 ; $WS_EX_TOPMOST = 8
    EndFunc

    [/autoit]
  • OnTop ändern:

    Spoiler anzeigen
    [autoit]

    #include <WINAPI.au3>
    HotKeySet("{F9}","_ToggleOnTop")
    HotKeySet("{ESC}","_Exit")
    While 1
    ToolTip("Is On Top: " & _WinIsOnTop("") &@CRLF & "Toggle with {F9}"&@CRLF & "Exit with {ESC}",0,0,WinGetTitle(""))
    Sleep(10)
    WEnd

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

    Func _ToggleOnTop()
    WinSetOnTop("","",Not _WinIsOnTop(""))
    EndFunc
    Func _Exit()
    Exit
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _WinIsOnTop
    ; Description:: Gets the OnTop State of a window
    ; Parameter(s): $WindowHandle : Handle or Title of Window
    ; Requirement(s): WinAPI.au3
    ; Return Value(s): Window OnTop: True, otherwise False
    ; Author(s): Prog@ndy
    ;
    ;===============================================================================
    ;

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

    Func _WinIsOnTop($WindowHandle)
    Local $long = _WinAPI_GetWindowLong(WinGetHandle($WindowHandle),$GWL_EXSTYLE)
    Return BitAND($long,8)=8 ; $WS_EX_TOPMOST = 8
    EndFunc

    [/autoit]
  • Manche Fenster wie TaskMgr, sind aber schon vor dem Programm TopMost :) Würde also noch machen, dass solche Fenster das TopMost nicht verlieren z.B. das Handle speichern und am Schluss wiederherstellen :)

  • hmm, guter einwand, wär mir garnicht aufgefallen, da ich zum einem den taskmanager nicht nutze und zum anderen, früher schon beim taskmanager und heute beim ersatz, on top schon von anfang an deaktiviere =)

    aber da müsste ja einfach nur vorher noch ne prüfung laufen.

    wie schauts denn mit ner automatischen aktualisierung aus? wie könnte man das bewerkstelligen? oder in nem zeitlichen intervall updaten?
    und ich wollte die dritte spalte entfernen, dafür die zeilen farblich, oder fett, hervorheben, die ON TOP sind ... wie bekommt man das hin?

  • need help, komm echt nicht weiter.
    und zwar oben angesprochenes prob ... am ende des programms werden ALLE on top-attribute entfernt.
    da es aber fenster gibt, die nicht durch dieses programm ON TOP gesetzt wurden, sollen diese natürlich auch nicht am ende entzogen werden.

    es reicht aber nicht, beim programmstart zu prüfen, sondern müsste dies bei jeder aktualisierung machen (ob das fenster manuell on top gesetzt, oder vom system so gestartet wurde)

    jmd ne idee wie man das mit dem code von oben umsetzten kann?