Disable Windows XP Screen Saver through Policies

4 02 2011

Today I had to fix a problem on a Windows XP Embedded system where it was not possible to disable the Windows screensaver. The Windows XP Embedded device has a custom (touchscreen) GUI for modifying the screensaver timeout and enabling/disabling the screensaver. Enabling/disabling the screensaver was implemented through the following Win32 API call:

SetSystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0 | 1, null, SPIF_UPDATEINIFILE| SPIF_SENDCHANGE);

This worked on an Windows XP Professional development system, but it failed to disable the screensaver on the Windows XP Embedded target device. The API call succeeded, but the screensaver was still activated by the system.

During analysis of this problem I opened the screensaver configuration page (desk.cpl, Screen Saver tab) and found that the screensaver selection dropdown combobox was disabled. My first idea was that this dropdown was disabled because there was only a single screensaver (.scr file) installed. I checked the C:\Windows\system32 directory for *.scr files and found that there were two screensavers available. So why was the dropdown combobox disabled?

Googling for “screen saver selection disabled” revealed this very helpful blog post: Screen Saver Selection is Grayed Out or Disabled

From this blog post I learned that you can control (overwrite!) the availability of screensaver options through system policies stored in the following registry key:

HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Control Panel\Desktop

If you add a ScreenSaveActive=1 value here, this forces the screensaver to be always active, no matter what API the user calls. (You can also e. g. enforce one specific screensaver by adding a SCRNSAVE.EXE=<path> value.)

Note: When the ScreenSaveActive=1 policy is set, the ScreenSaveActive entry at

HKEY_CURRENT_USER\Control Panel\Desktop

is always 0 and ignored.





Enable/disable hibernation programmatically

20 05 2009

Die Hibernate-Funktionalität lässt sich interaktiv über das „Power Options“ Control Panel Applet (powercfg.cpl) ein-/ausschalten.

Die Hibernate-Funktionalität lässt sich folgendermaßen per Kommdozeile  ein-/ausschalten:

powercfg.exe /H ON|OFF

Um die Hibernate-Funktion per Programm (API) ein-/auszuschalten, ist die Win32 API Funktion CallNtPowerInformation mit dem Parameter InformationLevel=10 (SystemReserveHiberFile) zu verwenden. Der Parameter lpInputBuffer muss dazu auf einen bool’schen Wert zeigen, für die Länge von nInputBufferSize genügt 1.

Beispiel:

bool bOnOff = true;
CallNtPowerInformation(10, &bOnOff, sizeof(bOnOff), NULL, 0);

Hinweis: Das kurzzeitige Aus- und wieder Einschalten der Hibernate-Funktion kann verwendet werden, um zu Verhindern, dass Windows nach dem Aufwecken aus dem Hibernate-Zustand nach 5 Minuten wieder schlafen geht wenn keine Benutzereingaben (Maus, Tastatur) erfolgen. Dieses „Feature“ ist hier beschrieben.





.NET Micro Framework 3.0 SP1 Flaws

13 05 2009

Ich arbeite seit einiger Zeit mit dem .NET Micro Framework 3.0 SP1 auf einem Embedded Master Development System von GHI Electronics. Dabei musste ich feststellen, dass einige der dokumentierten Methoden des .NET Micro Frameworks entweder gar nicht vorhanden sind, oder nur teilweise funktionieren weil z. B. bestimmte Parameter ignoriert werden. Teilweise gibt es auch undokumentierte Methoden. Das ist insofern besonders ärgerlich, als dass bereits das .NET Micro Framework SDK 3.0 February 2009 Documentation Update installiert ist.

Wohlgemerkt handelt es sich hier um Schwächen des .NETMF, nicht jedoch des Embedded Master Modules. Bei dieser Gelegenheit möchte ich den ausgezeichneten Support von GHI Electronics loben, den sie über ihr Forum leisten.

Folgende Fehler habe ich bisher festgestellt:

  1. Die Methode RotateBlt ist nicht (mehr) vorhanden. Es gibt keine alternative Möglichkeit, Bitmaps oder andere Objekte zu drehen.
  2. Die Füllfarbe (Brush, Gradienten) wird mit Ausnahme von Rectangles bei allen übrigen Shapes ignoriert. Auch die Methoden DrawEllipse und DrawRectangle ignorieren die Brush. In der Praxis bedeutet das, dass ausgefüllte Formen derzeit ausschließlich über Rechtecke (ohne abgerundete Ecken!) oder Bitmaps dargestellt werden können.
  3. Die Füllung mit einem linearen Gradienten funktioniert nur bei Rechtecken. Im Gegensatz zur WPF des „großen“ .NET Frameworks beziehen sich dabei die Koordinaten des Gradienten nicht relativ auf die Koordinaten des zu füllenden Rechtecks, sondern absolut auf die linke obere Ecke des Bildschirms und sind somit abhängig von der Position des zu füllenden Rechtecks. Radiale Gradienten sowie GradientStops werden derzeit nicht unterstützt.
  4. Die Methode Bitmap.GetBitmap() ist vorhanden, jedoch nicht dokumentiert. Sie wird z. B. zum Setzen eines BootImage’s beim Embedded Master benötigt.