Bildschirmschoner entfernen

    • Offizieller Beitrag

    Hi,
    ich habe häufiger das Problem, dass Kunden an ihren PC's sinnlose Spielereien mit dem Bildschirmschoner betreiben. Der Folgenutzer weiß davon nix und ruft dann in Panik den Service (also mich ;( ) an, weil plötzlich seine Anwendung verschwindet.
    Also habe ich jetzt ein Script erstellt, dass den momentanen Bildschirmschoner abschaltet und gleichzeitig den Reiter "Bildschirmschoner" von den Anzeigeeinstellungen entfernt.
    Somit ist nur noch über Registryzugriff ein Bildschirmschoner aktivierbar.

    [autoit]

    Dim $CurrSvrKey = "HKEY_CURRENT_USER\Control Panel\Desktop"
    Dim $CurrSvr = "SCRNSAVE.EXE"
    Dim $IsActive = "ScreenSaveActive"
    Dim $key = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System"
    Dim $valname = "NoDispScrSavPage"
    Dim $type = "REG_SZ"
    Dim $val = 1

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

    ; aktuellen Bildschirmschoner deaktivieren
    RegWrite($CurrSvrKey, $IsActive, $type, 0)
    RegDelete($CurrSvrKey, $CurrSvr)

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

    ; Reiter "Bildschirmschoner" entfernen
    RegRead($key, $valname)
    If @error = 0 Then
    MsgBox(0,"","Registry Schlüssel ist bereits vorhanden")
    Else
    If RegWrite($key, $valname, $type, $val) = 1 Then
    MsgBox(0,"","Registry Schlüssel erfolgreich aktualisiert.")
    Else
    MsgBox(0,"","Aktualisierung Registry Schlüssel fehlgeschlagen.")
    EndIf
    EndIf

    [/autoit]
  • Reicht dir

    [autoit]

    ;toggle monitor On/Off
    ; Author greenmachine

    MonitorToggle(1)
    Sleep (20000)
    MonitorToggle(0)

    Func MonitorToggle($Off = 1)
    $opt = Opt("WinTitleMatchMode", 4)

    $WM_SYSCommand = 274
    $SC_MonitorPower = 61808
    $Power_Off = 2
    $Power_On = -1

    $HWND = WinGetHandle("classname=Progman")
    If $Off Then
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND, "int", $WM_SYSCommand, _
    "int", $SC_MonitorPower, "int", $Power_Off)
    Else
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND, "int", $WM_SYSCommand, _
    "int", $SC_MonitorPower, "int", $Power_On)
    EndIf
    Opt ("WinTitleMatchMode", $opt)
    EndFunc

    [/autoit]

    Denn nicht?

    • Offizieller Beitrag

    Hallo Gun,
    ich denke, für dich ist das hier von Interesse. Daraus kannst du das Script komplettieren und hast alles, was du brauchst.

    Guten Rutsch wünsch ich noch.

    Edit:

    Ich hab gleich mal das Script für "Monitor aus nach 5 Minuten" erstellt.
    Sollte bereits ein nutzerspezifisches Schema bestehen wäre dieses Schlüssel "....\6" und würde hiermit überschrieben. Wenn du das nicht möchtest, kannst du ja vorher abfragen, welches Schema das letzte ist, und dann einen neuen Schlüsselnamen erzeugen.

    [autoit]

    Dim $EnergyKey = "HKEY_CURRENT_USER\Control Panel\PowerCfg\PowerPolicies\6"
    Dim $EnergyKeyActiv = "HKEY_CURRENT_USER\Control Panel\PowerCfg"
    Dim $EnergySchema = "CurrentPowerPolicy"
    Dim $Energy_Name1 = "(Standard)"
    Dim $Energy_Name2 = "Description"
    Dim $Energy_Val2 = "Abschalten Monitor nach 5 Minuten. Andere Komponenten immer aktiv."
    Dim $Energy_Name3 = "Name"
    Dim $Energy_Val3 = "Monitor_out_5min"
    Dim $Energy_Name4 = "Policies"
    Dim $Energy_Val4 = "01000000000000000100000000000000020000000500000000000000000000007800000032320302020000000200000000003A772EF207002C0100003C00000000000000B4000000000064646464927C"
    Dim $type = "REG_SZ"
    Dim $type2 = "REG_BINARY"

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

    ; Energieschemaeintrag setzen
    RegWrite($EnergyKey, $Energy_Name1)
    RegWrite($EnergyKey, $Energy_Name2, $type, $Energy_Val2)
    RegWrite($EnergyKey, $Energy_Name3, $type, $Energy_Val3)
    RegWrite($EnergyKey, $Energy_Name4, $type2, $Energy_Val4)
    ; Eintrag aktivieren
    RegWrite($EnergyKeyActiv, $EnergySchema, $type, 6)

    [/autoit]
  • Hallo,

    sorry, wenn ich ein wenig vom Thema abweiche:

    Kann jemand von Euch mir sagen, wie ich auf diese Weise anstatt den Bildschirmschoner zu entfernen, eher die Zeit für den automatischen Ruhezustand auf einen bestimmten Wert setzen kann, oder diese automatik so per Script deaktivieren kann?

    Grüße

    Zoli

    • Offizieller Beitrag

    Hi,
    das wird ebenfalls im Schlüssel: "HKEY_CURRENT_USER\Control Panel\PowerCfg\PowerPolicies\aktives_Schema" eingestellt.

    Tipp:
    Setze an einem PC alle Einstellungen für das Powermanagment, wie du es willst. Dann lies in der Registry den Binäwert des aktiven Schemas aus.
    In dieserm Wert sind jetzt alle Einstellungen hinterlegt. Du kannst ihn also in das Schema in anderen PC's schreiben. Ich empfehle aber, wie bei dem vorab eingestellten Bsp., die Voreinstellungen nicht zu ändern, sondern ein neues Schema anzulegen und zu aktivieren.

  • Vielen Dank.

    Gibt es dazu auch irgendwo Beschreibungen, welcher Teil dieses Binärwertes was genau bewirkt? Würde mir das Erstellen solcher Profile nämlich gerne sparen, und stattdessen einfach eines der bereits vorhandenen per AutoIt-Funktion RegWrite() entsprechend verändern.

    Dabei würde mich interessieren, ob nach so einer Änderung ein re-Logon des Benutzers oder sogar ein Windows-Neustart zwingend durchgeführt werden muß, oder ob Windows irgendwie zur automatischen Übernahme der Änderungen "überredet" werden kann? (ich glaube eher ersteres) Das was ich nämlich vor habe, sollte ohne Neustart oder re-Logon funzen.

    Zoli

    • Offizieller Beitrag

    Ich hab bisher keine Beschreibung dazu gefunden.
    Ich halte zwei Varianten für möglich:
    1. Die Binärzahl besteht aus mehreren verketteten Teilbinären, wobei jedes einzelne Binär einen Parameter im Powerschema reflektiert
    2. Die Binärzahl ist ein Bitsummenbildung aus den Hexwerten, die jeder Parameter annehmen kann

    Um das festzustellen, müßtest du mehrfach Änderungen an einem einzigen Parameter ausführen und vergleichen, welche Änderungen im Registrywert stattgefunden haben.
    Die Einstellungen des Powerschemas benötigen keinen Neustart um aktiviert zu werden. Das merkst du, wenn du von Hand in den Energieoptionen Änderungen vornimmst. Diese sind sofort und ohne Neustart wirksam.

  • Eigentlich wäre somit alles klar, wenn ich das Problem nicht hätte kein Informatikstudium gemacht zu haben ;)

    Ich bin was das angeht, leider fast schon ein "Laihe mit vertiefter Kenntnis in der Registry/in Autoit", der hier versucht, seinem PC etwas beizubringen. Kannst Du mir deshalb bitte folgende Begriffe erklären?

    -Was ist ein Teilbinär?
    -Was ist die Bitsummenbildung aus einem Hexwert. (was ein Hexwert ist, weiß ich ;) )

    Eigentlich geht es mir darum, daß mein Win2k-Rechner nicht andauernd in Ruhezustand geht, wenn bestimmte Proggies laufen. Die Proggies, um die es geht, brauchen fast keine CPU-Last, somit meint mein PC ständig, "idle" zu sein, was dann nach der voreingestellten Zeit den Ruhezustand zufolge hat. Mein Script soll das Vorhandensein der Proggies checken, und dann in Abhängigkeit davon für die Laufzeit der Proggies die Einstellungen des aktuellen Energieschemas so anpassen, daß kein Ruhezustand stattfindet. Nachher soll das Script die Einstellungen wieder so setzen, wie sie vorher waren. Das Script wäre soweit schon fertig. Mir fehlt jetzt nur noch der Teil mit dem RegRead/RegWrite für die Änderung.

    Zoli

    • Offizieller Beitrag

    Also ein Schlüssel sieht z.B. so aus:
    "01000000000000000100000000000000020000000500000000000000000000007800000032320302020000000200000000003A772EF207002C0100003C00000000000000B4000000000064646464927C"
    Stell dir das vor wie einen Satz. "01000000000000000" könnte dann das erste Teilelement(Wort) sein, "1000000000000000" wäre das zweite. usw.
    Um das festzustellen, muß man halt immer nur einen Parameter verändern und den neuen Schlüssel unter den alten legen und dann schauen wo die Änderungen stattgefunden hanen. Sind sie immer an bzw. ab derselben Position, kann man so den Bereich der Kette, der für einen bestimmten Parameter zuständig ist eingrenzen. Einfach mal probieren.
    Variante 2 halte ich eigentlich aufgrund der Länge des Wertes für wenig wahrscheinlich. Eher eine Kombination aus Variante 1 und 2:
    Ein bestimmter Teil des Wertes verkörpert einen Parameter. Die Werte die der Parameter annehmen kann werden durch Bitoperationen verändert. Schau mal in das Bit-Tutorial in meiner Signatur. Das erklärt, wie Bitoperationen ausgeführt werden.

    Übrigens kannst du ja auch mal prüfen, ob sogar sinnvoller Text in dem Wert enthalten ist (glaub ich eher nicht). Nützlich dafür: Funktion _RegReadBinary()

    Also nicht verzagen ;) und viel Spaß noch.