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
#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>
Opt("WinTitleMatchMode", 2)
Opt("OnExitFunc", "endscript")
Opt("GUIOnEventMode", 1)
Opt("GUICloseOnESC", 0)
Global $var2
Global $WinList
Global $ini = @scriptdir & "\ActiveWin.ini"
Global $ListView1, $B_DESCENDING
Global $tInfo
$dll = DllOpen("user32.dll")
[/autoit] [autoit][/autoit] [autoit]HotKeySet("^!0", "HiDE")
HotKeySet("{F9}","_ToggleOnTop")
$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)
_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
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
Func IsVisible($handle)
If BitAnd( WinGetState($handle), 2 ) Then
Return 1
Else
Return 0
EndIf
EndFunc
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
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
Func _ToggleOnTop()
WinSetOnTop("","",Not _WinIsOnTop(""))
_update()
EndFunc
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
Func _WinIsOnTop($WindowHandle)
Local $long = _WinAPI_GetWindowLong(WinGetHandle($WindowHandle),$GWL_EXSTYLE)
Return BitAND($long,8)=8 ; $WS_EX_TOPMOST = 8
EndFunc