Llamando la API SystemParametersInfoDelphi para establecer el papel tapiz del escritorio de Windows

Estableciendo el papel tapiz del escritorio programáticamente

Copyright © 2000 Ernesto De Spirito

Boycott Trend Micro!

SystemParametersInfo

Esta API de Windows declarada en la unidad Windows obtiene o establece varios parámetros generales del sistema.

function SystemParametersInfo(uiAction, uiParam: UINT;
  pvParam: Pointer; fWinIni: UINT): BOOL; stdcall;

El primer parámetro se usa para indicar la acción, es decir qué parámetro del sistema deseamos obtener o establecer. Por ejemplo, la constante predefinida SPI_SETDESKWALLPAPER indica que deseamos establecer el papel tapiz del escritorio.

El segundo parámetro se usa sólo con ciertas acciones y debería ser 0 si la acción solicitada no lo requiere.

El tercer parámetro es un puntero y también depende la acción. En nuestro caso debería apuntar al primer caracter de una cadena terminada en nulo conteniendo el nombre y camino completo del archivo de mapa de bits que será usado como papel tapiz, o debería ser nil si queremos remover el papel tapiz actual.

el último praámetro especifica si queremos guardar los cambios en el perfil de usuario y si además queremos enviar un mensaje a todas las aplicaciones para indicarles que un parámetro global del sistema a cambiado. En nuestro caso vamos a usar la constante SPIF_UPDATEINIFILE para guardar el perfil de usuario.

SetWallpaper

Aquí declaramos un procedimiento para establecer el papel tapiz por código usando el archivo de mapa de bits cuyo nombre se pasa como parámetro. El segundo parámetro indica si el papel tapiz deberá ser centrado o mostrado como mosaico.

uses Windows, SysUtils;

procedure SetWallpaper(const NomArch: TFilename; Mosaico: boolean);
var
  sTiled: string;
begin
  if Filename <> '' then begin
    if Mosaico then sTiled := '1' else sTiled := '0';
    SetRegistryData(HKEY_CURRENT_USER, '\Control Panel\Desktop',
      'TileWallpaper', rdString, sTiled);
  end;
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,
    Pointer(NomArch), SPIF_UPDATEINIFILE);
end;

Note que convertimos la cadena en Pointer en lugar de PChar. Convertir a Pointer es más rápido que rápido porque en realidad no implica ninguna operación ya que una cadena es en sí misma un puntero, pero la eficiencia no es la razón por la que hacemos esto, sino que si la cadena está vacía (''), al convertirla a Pointer obtenemos nil (lo que queremos), mientras que PChar devolvería un puntero a un byte nulo en algún lugar de la memoria.

Llamadas de ejemplo

La siguiente sentencia establecerá un papel tapiz como mosaico:

SetWallpaper('c:\windows\aros.bmp', true);

Y esta otra removerá el papel tapiz (el segundo parámetro se ignora):

SetWallpaper('', false);
JfControls Library - para Delphi y C++ Builder