Desktophintergrund per SBScript ändern

Alles über SongBeamer, das sonst nirgendwo hineinpaßt
Antworten
kex
Beiträge: 155
Registriert: Mo Mai 19, 2008 11:00 am
Wohnort: Heidenheim a. d. Brenz
Kontaktdaten:

Desktophintergrund per SBScript ändern

Beitrag von kex »

Hallo,

es geht mal wieder um SBScript.
Und zwar suche ich eine Möglichkeit vom Songbeamer aus, das Desktop-Hintergrundbild zu ändern. Kennt da jemand was?

Warum will ich das machen? Der grund ist unser nächster Jugendgottesdienst. Thema: Wähle! (Und wir machen alles im Matrix-Style). Dafür will ich jetzt auf dem Desktophintergrund die Matrix laufen lassen (Das geht mit ZMatrix) und diese noch mit dem eigentlichen Hintergrundbild OR verknüpfen.
Darüber wird dann der Songbeamer mit transparentem Hintergrund angezeigt.

Gruß Kex
Und so zerbröselt der Kex nun mal ...
(frei nach Bruce Allmächtig)
Sebastian
SongBeamer Team
Beiträge: 6019
Registriert: Fr Nov 14, 2003 11:31 pm

Beitrag von Sebastian »

Dafür mußt du die Funktion SystemParametersInfo von Windows importieren.

Hier mal ein Beispiel:

Code: Alles auswählen

uses
  SysUtils;

function SystemParametersInfo(uiAction, uiParam: Integer;
  pvParam: PChar; fWinIni: Integer): Integer; stdcall; external 'user32.dll' name 'SystemParametersInfoA';

const
  SPI_SETDESKWALLPAPER = 20;
  SPIF_SENDCHANGE = 2;
  
var
  Path: String;
  Res: Integer;
begin
  Path := 'C:\Users\Public\Pictures\Sample Pictures\Autumn Leaves.jpg';
  Res := SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Path, SPIF_SENDCHANGE);
  if Res = 0 then
    RaiseLastOSError;
  
  
// zurücksetzen:
  if MessageDlg('Ursprüngliches Bild wiederherstellen', mtConfirmation, [mbYes, mbNo], -1) = mrYes then
  begin
    Path := '';
    Res := SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Path, SPIF_SENDCHANGE);
    if Res = 0 then
      RaiseLastOSError; 
  end;
end.
Gruß, Sebastian
kex
Beiträge: 155
Registriert: Mo Mai 19, 2008 11:00 am
Wohnort: Heidenheim a. d. Brenz
Kontaktdaten:

Beitrag von kex »

Danke, das ging (mal wieder) schnell. :D

Aber ich vermute mal du hast kein Windows XP als Betriebssystem. Denn ich bekam beim Testen eine Fehlermeldung beim ausführen des Scripts.

Ein Blick in die MSDN gab mir dann die Erklärung.

SPI_SETDESKWALLPAPER:
Sets the desktop wallpaper. The value of the pvParam parameter determines the new wallpaper. To specify a wallpaper bitmap, set pvParam to point to a NULL-terminated string containing the full path to the bitmap file. Setting pvParam to "" removes the wallpaper. Setting pvParam to SETWALLPAPER_DEFAULT or NULL reverts to the default wallpaper.

The pvParam parameter can specify a .jpg file.

Windows Server 2003 and Windows XP/2000: The pvParam parameter cannot specify a .jpg file.
Wenn ich bei mir (Ich habe Windows XP) ein .bmp File zum Testen verwende, dann funktioniert es. :mrgreen:
Und so zerbröselt der Kex nun mal ...
(frei nach Bruce Allmächtig)
kex
Beiträge: 155
Registriert: Mo Mai 19, 2008 11:00 am
Wohnort: Heidenheim a. d. Brenz
Kontaktdaten:

Beitrag von kex »

Ich hab noch ein kleines Problem festgestellt: Wenn ich meinen Desktophintergrund wechsle wie oben beschrieben, bekommt ZMatrix das nicht immer mit, und darum muss ich ZMatrix extra eine Nachricht schicken, damit alles richtig funktioniert.

Ich hab mir ein kleines C++ Programm geschrieben, das genau das macht. Das kann ich dann mit CreateProcess ausführen. Funktioniert also eigentlich alles wunderbar und eine Antwort ist deshalb auch nicht so dringend.

Aber aus reinem Interesse: Sowas geht bestimmt auch mit SBScript direkt. Die Frage ist wie?

Hier mein C++ Code (der Einfachheit halber mal ohne Fehlerüberprüfung):

Code: Alles auswählen

int _tmain()
{
   const UINT ID_REFRESH = 40003;

    HWND matrix_wnd = ::FindWindow(NULL, "Matrix Code Listener");
    ::SendMessage(matrix_wnd, WM_COMMAND, ID_REFRESH, 0);
   
    return 0;
}
Ich vermute mal die Befehle FindWindow() und SendMessage() sind unter Delphi genau die selben oder ähnlich. Hab aber auf die schnelle nichts im I-Net gefunden.

Gruß Kex
Und so zerbröselt der Kex nun mal ...
(frei nach Bruce Allmächtig)
Antworten