|
Estableciendo el papel tapiz del escritorio programáticamente
Copyright © 2000 Ernesto
De Spirito
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);
|