EnumWindows - ausgebremst durch FireFox

  • 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
    [autoit]

    #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

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

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

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

    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)

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

    Do
    DllCall($hUser32, "int", "EnumWindows", "ptr", DllCallbackGetPtr($pCallBackRegister), "lparam", 1)
    Sleep(350)
    Until False

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

    Func _EnumWindowsProc($hWin, $lParam)
    Local $aWinPos
    $hWin = HWnd($hWin)

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

    $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

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

    $aWinPos = WinGetPos($hWin)
    If @error Then Return 1

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

    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

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

    EndIf
    Return 1
    EndFunc

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

    Func Ende()
    DllClose($hUser32)
    DllCallbackFree($pCallBackRegister)
    Exit
    EndFunc

    [/autoit]

    Edit: Das Problem scheint _ProcessGetName zu hängen - ohne läufts problemlos.

    Einmal editiert, zuletzt von AspirinJunkie (22. April 2009 um 10:54)