Montag, 9. August 2010

Das letzte Quäntchen ...

Wie bereits berichtet, bleibt als einziger Wehmuts-Tropfen der gelegentliche "Black Screen" nach dem Aufwachen aus dem Standby (S3). Da dies immer nur dann geschieht, wenn vor dem Standby das Windows MediaCenter im Vollbild-Modus war, könnte ein "Workaround" darin bestehen, vor dem Standby das MediaCenter zu beenden und beim Aufwecken wieder zu starten ...

Nun gibt es verschiedene Tools, die entsprechende Möglichkeiten bieten. Das wohl bekannteste, das MCE Standby Tool, kurz MST, wollte ich nicht einsetzen, da ich persönlich unter Windows 7 damit, auch mit der daran angepassten Version, keine guten Erfahrungen gesammelt habe.

Nach ein wenig Recherche im Internet, fanden sich ein paar gute Scriptvorlagen in VBScript, die das Monitoring des Standby/Resume Ereignisse beherrschten und zudem flexibel die Möglichkeit boten, Prozesse beim Ereigniseintritt zu terminieren bzw. zu starten.

Zugefügt habe ich noch die automatische Ermittlung des Windows/eHome-Verzeichnisses, die Abfrage, ob das Skript bereits ausgeführt wird, um mehrfaches Starten des Prozesses zu verhindern und die Bedingung, dass MediaCenter nur dann nach dem Aufwecken gestartet wird, wenn es vor dem Standby aktiv war.

Hier nun das fertige Script (ich bitte um Nachsicht, da ich kein wirklicher Experte auf dem Gebiet des Scriptings bin):


Option Explicit

Const cntResumefromSuspend = 7
Const cntEventEnteringSuspend = 4

Dim wmiPowerManagementEvent
Dim objProcess, colProcesses
Dim objShell, wshShell
Dim intEventType
Dim ehCounter : ehCounter = 0
Dim ehFolder : ehFolder = "C:\Windows"

On Error Resume Next

If AnzahlLaufendeVBS( WScript.ScriptFullName ) > 1 Then
  MsgBox "Script wird bereits ausgeführt!", , WScript.ScriptName
  WScript.Quit
End If

Set wshShell = CreateObject("WScript.Shell")
ehFolder = wshShell.ExpandEnvironmentStrings("%WINDIR%") & "\ehome"

Set wmiPowerManagementEvent = GetObject("winmgmts:").ExecNotificationQuery("Select * from Win32_PowerManagementEvent")

If Err = 0 Then
  Do
    intEventType = wmiPowerManagementEvent.NextEvent.EventType

    Select Case intEventType

    Case cntResumefromSuspend

      If ehCounter > 0 Then
        WScript.Sleep 5000
        Set objShell = CreateObject("Shell.Application")
        objShell.ShellExecute "ehshell.exe", "", ehFolder, "open", 10
      End If

      Set objShell = Nothing

    Case cntEventEnteringSuspend

      Set colProcesses = GetObject("winmgmts:").ExecQuery("select * from Win32_Process where name='ehshell.exe'")
      ehCounter = colProcesses.Count

      For Each objProcess in colProcesses
        objProcess.Terminate(0)
      Next

    End Select

    If Err <> 0 Then
      Wscript.Echo Now() & " Fehler bei der Verarbeitung! Fehler-Nr. " & Err & "(" & Err.Description & ")"
      Err.Clear
    End If
  Loop
else
  Wscript.Echo Now() & " Fehler beim Initialisieren! Fehler-Nr. " & Err & "(" & Err.Description & ")"
End If


Function AnzahlLaufendeVBS( VBScripts )
  'On Error Resume Next

  AnzahlLaufendeVBS = 0

  Const wbemFlagReturnImmediately = &h10
  Const wbemFlagForwardOnly = &h20

  Dim strComputer : strComputer = "."
  Dim objWMIService : Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
  Dim colItems : Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
  Dim objItem

  For Each objItem In colItems
    If InStr( LCase( objItem.CommandLine), LCase( VBScripts ) ) > 0 Then
      If InStr( LCase( objItem.CommandLine ), "script.exe" ) > 0 Then
        AnzahlLaufendeVBS = AnzahlLaufendeVBS + 1
      End If
    End If
  Next

End Function
Das Script wird einfach als "S3Monitor.vbs" abgespeichert und per Drag & Drop in den Autostart-Ordner kopiert. Nach dem Neustart des PCs läuft es brav im Hintergrund und wartet auf seinen Einsatz.

Da das Windows MediaCenter nun jedesmal nach dem Aufwecken mit einem Riesen-"Ta-ta" lautstark neu startet, habe ich kurzerhand die Startup-Effekte mittels folgender Registry-Tweaks abgestellt:


HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Media Center\Settings\MCE.PerUserSettings]
"enableStartupAnimation"=dword:00000000
"enableStartupSound"=dword:00000000
In Kombination mit dem Skript im Autostart habe ich bisher ein konstant werkelndes Windows 7 mit MediaCenter ohne die erneute, bittere Erfahrung eines "Black Screens" nach dem Aufwecken.
 
Zur Nachahmung empfohlen....

Keine Kommentare:

Kommentar veröffentlichen