Habe ein kleines Skriptchen erstellt welches als einzige Funktion haben soll den rechten Bildschirmrand von allen Fenstern (außer selbstdefinierte Ausnahmen) freizuhalten. Nach mehreren Versionen mit WinList und GetWindow basiert der jetzige Stand auf der API-Funktion EnumWindows.
Der Grund für dieses experimentieren ist die CPU-Auslastung:
Das ganze arbeitet laut Process-Explorer bei einer Auslastung nahezu 0 - die Fensteranzahl beträgt rund 115.
Öffne ich jedoch zusätzlich noch den FireFox (damit sind es dann rund 125 Fenster) sind auf einmal Auslastungsspitzen bis 10% da und ansonsten bewegt es sich die ganze Zeit zwischen 2 und 10% - also nicht zufriedenstellend.
Kann mir irgendjemand auf die Sprünge helfen warum nur durch zuschalten des FireFox das ganze dermaßen durcheinander kommt? - danke euch schonmal.
Hier das Skriptchen:
Spoiler anzeigen
#RequireAdmin
#Region Benutzerdefnierte Angaben
Global $DPI = 116 ;geometrische Auflösung des Bildschirms in Dots/Inch
Global $Randdicke = 5 ;Angabe in cm
Global $Ausnahmen[2] = ["rainlendar2.exe", "notepad.exe"] ;Prozesse deren Fenster ignoriert werden sollen
#EndRegion Benutzerdefnierte Angaben
#include <Process.au3>
Opt("TrayMenuMode", 1)
Opt("TrayOnEventMode", 1)
TrayItemSetOnEvent(TrayCreateItem("Beenden"), "Ende")
[/autoit] [autoit][/autoit] [autoit]Global $hUser32 = DllOpen("user32.dll")
Global $pCallBackRegister = DllCallbackRegister("_EnumWindowsProc", "int", "hwnd;lparam")
Global $iRandPixel = Int(($Randdicke / 2.54) * $DPI)
Do
DllCall($hUser32, "int", "EnumWindows", "ptr", DllCallbackGetPtr($pCallBackRegister), "lparam", 1)
Sleep(350)
Until False
Func _EnumWindowsProc($hWin, $lParam)
Local $aWinPos
$hWin = HWnd($hWin)
$bVisible = DllCall($hUser32, "int", "IsWindowVisible", "hwnd", $hWin)
[/autoit] [autoit][/autoit] [autoit]If $bVisible[0] Then
Sleep(1)
For $sProcName In $Ausnahmen
If _ProcessGetName(WinGetProcess($hWin)) = $sProcName Then Return 1
Next
$aWinPos = WinGetPos($hWin)
If @error Then Return 1
If BitAND(WinGetState($hWin), 32) Then
WinSetState($hWin, '', @SW_RESTORE)
DllCall($hUser32, "int", "MoveWindow", "hwnd", $hWin, "int", 0, "int", 0, "int", @DesktopWidth - $iRandPixel, "int", @DesktopHeight, "int", False)
ElseIf $aWinPos[0] >= (@DesktopWidth - $iRandPixel) Then
DllCall($hUser32, "int", "MoveWindow", "hwnd", $hWin, "int", @DesktopWidth - $iRandPixel - $aWinPos[2] - 1, "int", $aWinPos[1], "int", $aWinPos[2], "int", $aWinPos[3], "int", False)
ElseIf ($aWinPos[0] + $aWinPos[2]) > (@DesktopWidth - $iRandPixel) Then
DllCall($hUser32, "int", "MoveWindow", "hwnd", $hWin, "int", $aWinPos[0], "int", $aWinPos[1], "int", @DesktopWidth - $aWinPos[0] - $iRandPixel, "int", $aWinPos[3], "int", False)
EndIf
EndIf
Return 1
EndFunc
Func Ende()
DllClose($hUser32)
DllCallbackFree($pCallBackRegister)
Exit
EndFunc
Edit: Das Problem scheint _ProcessGetName zu hängen - ohne läufts problemlos.