- Offizieller Beitrag
Hallo!
Ich habe mal wider ein programm geschrieben^^ diese programm reduziert die Memoryauslastung des processes des momentan aktiven Fensters. Also z.b. wenn momentan der firefox gestartet ist und man das programm startet, wird die memorylast von firefox.exe kurzzeitig auf 0 gestellt (das geht natürlich sofort wider hoch, aber meist nie soweit wie am anfang (ausser beim firefox, da geht es rechtschnell wider in den anfangszustand))
vlt kanns ja jemmand gebrauchen (ich z.b. brauch es wenn ich google earth und firefox usw gleichzeitig gestartet hab..habs bei mir auch auf nem hotkey laufen (über die G15))
Hier nun das skript, beendet wird es mit ESC und 100% ist der Anfangs zustand(vor der Bereinigung)!
Spoiler anzeigen
;#################
;# Reduce Memory #
;# By Gtaspider #
;#################
;Includes
#include <process.au3>
#include <GUIConstants.au3>
;Optionen/Hotkeys
HotKeySet("{ESC}","_exit")
Opt("WinTitleMatchMode", 4)
$taskbar_pos = WinGetPos("classname=Shell_TrayWnd")
$taskbar_pos = $taskbar_pos[3]
Opt("WinTitleMatchMode", 1)
;Globals
Global $pid,$name,$startram,$Proggui
;Auslesen des Processes des momentanen Fensters
$title = WinGetTitle("")
$pid = WinGetProcess($title)
$name = _ProcessGetName($pid)
If $name = "explorer.exe" Then
$name = InputBox("", "process name:", "explorer.exe")
$pid = ProcessExists($name)
EndIf
If Not $pid Then Exit
;Den Anfangs ram (vor der Bereinigung) auslesen
$startram = _GetRam($pid)
;GUI
$Proggui = GUICreate("", 296, 50, @DesktopWidth - 296, @DesktopHeight- (50 + $taskbar_pos), $WS_POPUP,$WS_EX_TOOLWINDOW)
WinSetOnTop($Proggui, "", 1)
GUISetBkColor(0x004F4F)
$Progress = GUICtrlCreateProgress(8, 8, 278, 16)
GUICtrlSetData(-1, 100)
$lab = GUICtrlCreateLabel("100%", 132, 8, 30, 16, $SS_SUNKEN)
GUICtrlSetColor(-1, 0x00FFFF)
$kllab = GUICtrlCreateLabel($name & " Uses: " & $startram & "kb", 8, 32, 275, 17)
GUICtrlSetColor(-1, 0x00FFFF)
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Proggui, "int", 500, "long", 0x00040008);slide-in from bottom
WinSetOnTop($Proggui, "", 1)
;Bereinigung der Memoryauslastung des Prozesses
[/autoit] [autoit][/autoit] [autoit];Prozess PID zu Prozess Handle
$Pr_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $pid)
;Memory wird auf 0 gestellt
DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $Pr_Handle[0])
;Prozess Handle wird geschlossen
DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $Pr_Handle[0])
;Alle 750 ms nach dem RAM gucken
AdlibEnable("_UpdateRam", 750)
;Main While, damit das Skript nicht beendet wird
While 1
Sleep(1000)
WEnd
;_exit, beendet das Skript mit einem fade out der GUI
Func _exit()
DllCall ( "user32.dll", "int", "AnimateWindow", "hwnd", $Proggui, "int", 500, "long", 0x00090000 );fade-out
Exit
EndFunc
;_UpdateRam, gut sich alle 750ms an wieviel Memoryauslastung der Prozess hat
Func _UpdateRam()
If Not ProcessExists($pid) Then
AdlibDisable()
GUICtrlSetData($Progress,0)
For $i = 30 To 0 Step - 1
$set = $i
If StringLen($set) < 2 Then $set = "0" & $i
$set = StringLeft($set, 1) & "." & StringRight($set, 1)
GUICtrlSetData($kllab,$name&" was terminated! Exit in "&$set)
GUICtrlSetData($lab,$set)
Sleep(100)
Next
_exit()
EndIf
$ram = _GetRam($pid)
GUICtrlSetData($kllab, $name & " Uses: " & $ram & "kb")
$prog = (100 * $ram) / $startram
GUICtrlSetData($Progress, $prog)
GUICtrlSetData($lab, Round($prog) & "%")
Return 1
EndFunc ;==>_UpdateRam
;_GetRam($iProcPid), gibt die Memoryauslastung der angegebenden PID zurück
Func _GetRam($iProcPid)
Local $colItems = "",$Output = ""
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
$colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Process", "WQL", 0x30)
If IsObj($colItems) Then
For $objItem In $colItems
If $objItem.ProcessId = $iProcPid Then Return $objItem.WorkingSetSize / 1024
Next
Else
MsgBox(48, "WMI Output", "No WMI Objects Found for class: " & "Win32_Process")
Exit
EndIf
EndFunc ;==>_GetRam
Mfg Spider
Edit: nur eine kleine unschönheit.. unten in der taskleiste wird die gui angezeigt, das ist nun gefixt..
Edit2:Wenn der Prozess beendet wird, schließt sich das Programm nach 3 sekunden. Ausserdem Reduce im Thematitel geschrieben anstatt Reduze