Avatar billede cms Nybegynder
03. maj 2001 - 17:56 Der er 27 kommentarer og
2 løsninger

Windows Baggrundsbillede

Findes der nogle Windows API-funktioner til øjeblikkeligt at ændre window\'s (explorer\'s - altså skrivebordets) baggrundsbillede ??
Eller skal jeg ind i regbasen?
For når jeg gør det, fx via \"HKEY_CURRENT_USER\\Control Panel\\Desktop\\Wallpaper\", og ændrer den value til noget andet, sker der ikke en sk*d!!
Heller ikke når jeg trykker \"opdater\" på skrivebordet.
Avatar billede bratkid Nybegynder
03. maj 2001 - 18:02 #1
vil du lave et program der kan ændre windowses baggrundsbillede?
Avatar billede ziron Nybegynder
03. maj 2001 - 18:33 #2
når det er at du har skrevet til regbasen kan du bruge følgende kode for at opdatere:

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE );

/ZIRON
Avatar billede ziron Nybegynder
03. maj 2001 - 22:01 #3
du kan også bruge dette hvis du bare skal skifte unden at ændre i regbasen:

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pchar(\'c:\\det dit billed nu hedder.bmp\'), SPIF_SENDWININICHANGE );

/ZIRON

Avatar billede bratkid Nybegynder
03. maj 2001 - 22:45 #4
er det et program der skal kunne ændre baggrundsbilledet i windows?
Avatar billede borrisholt Novice
04. maj 2001 - 07:05 #5
brug den følgende funktion :


const
  WPS_Tile      = 0;
  WPS_Center    = 1;
  WPS_SizeToFit = 2;
  WPS_XY        = 3;

procedure SetWallPaperExt(sWallpaperBMPPath : String; nStyle, nX, nY: Integer );
var
  Reg    : TRegIniFile;
  s      : String;
  X, Y  : Integer;

begin
  Reg := TRegIniFile.Create(\'Control Panel\\Desktop\');
  s := \'0\';
  X := 0;
  Y := 0;

  case nStyle of
      WPS_Tile  : s := \'1\';
      WPS_Center : nStyle := WPS_Tile;
      WPS_XY    :
        begin
          nStyle := WPS_Tile;
          X := nX;
          Y := nY;
        end;
  end;

  Reg.WriteString( \'\', \'Wallpaper\',  sWallpaperBMPPath );
  Reg.WriteString( \'\', \'TileWallpaper\',  s );
  Reg.WriteString( \'\', \'WallpaperStyle\', IntToStr( nStyle ) );
  Reg.WriteString( \'\', \'WallpaperOriginX\',IntToStr( X ) );
  Reg.WriteString( \'\', \'WallpaperOriginY\', IntToStr( Y ) );
  Reg.Free;
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil, SPIF_SENDWININICHANGE );
end;


og kald den sådan her :

    SetWallpaperExt( \'C:\\Tmp.BMP\' , WPS_XY, Left, Top)

eleer sådan her :

    SetWallpaperExt( \'C:\\Tmp.BMP\' , WPS_Center, 0, 0 );

Jens B http://fotx.net/borrisholt
Avatar billede bone Nybegynder
04. maj 2001 - 09:46 #6
ziron/borrisholt> Hvordan er det egentlig i lærer de der sindsyge koder? Er det dag ud og dagind med onlinehjælpen som godnatlæsning, eller er i uddannede i \'et?
Avatar billede borrisholt Novice
04. maj 2001 - 09:47 #7
bone >> Ja !
Avatar billede borrisholt Novice
04. maj 2001 - 09:48 #8
Til hvad for..... vil du nok spørge ....

til det hele. For mit vedkommende. Og så et programmør job hjælper lidt påsagen....

Jens B
Avatar billede bratkid Nybegynder
04. maj 2001 - 09:50 #9
ehmm...er det et program til at skrift windows baggrundsbillede?
Avatar billede borrisholt Novice
04. maj 2001 - 09:51 #10
bratkid>> Det er en procedure til ar gøre det med ....
Avatar billede ziron Nybegynder
04. maj 2001 - 09:59 #11
ja borrisholt så prøver man nok bare at lave noget bedre end mig :-) hehe

bone >> det er lidt godnat læsning sammen med hjælpen...

/ZIRON
Avatar billede borrisholt Novice
04. maj 2001 - 10:01 #12
ZIRON >> Nu er jeg bedere end dig :-)Så der er vel meget naturliget :-)

Jens B
Avatar billede ziron Nybegynder
04. maj 2001 - 10:02 #13
nej du er da ikke :-)

det var jo også lidt grin :-)

/ZIRON
Avatar billede bratkid Nybegynder
04. maj 2001 - 10:03 #14
Systemparametersinfo(spi_setdekwallpaper, 0, Pchar(AabenBilldlg.filename), spif_sendwininichange);



er den vigtiste kode så
Avatar billede bratkid Nybegynder
04. maj 2001 - 10:06 #15
eller kan jeg bare hvise  hele sourcen så kan han vel se hvad han skal bruge
Avatar billede ziron Nybegynder
04. maj 2001 - 10:13 #16
hvad er det du spørger om bratkid, prøver du selv at leve et skifte baggrunds program???

/ZIRON
Avatar billede cms Nybegynder
14. maj 2001 - 11:51 #17
borrisholt >> Hvis brugeren har Active Desktop installeret og har valgt \"Vis som web-side\", virker det ikke.
Dvs. det virker, hvis brugeren selv højreklikkker og trykker \"opdater\" på skrivebordet. Men det skulle helst også virke, hvis brugeren har Active Desktop ...
Evt. kunne jeg jo slå det fra - men ved ikke hvordan ;o)
Avatar billede borrisholt Novice
14. maj 2001 - 12:12 #18
Det ved jeg sq. ikke lige ..... Har aldrig arbejdet med Active Desktop ...

Jens b
Avatar billede cms Nybegynder
14. maj 2001 - 13:29 #19
Men så kunne jeg jo bare sætte den til at sende en keyboard event (f5) til GetDesktopWindow, right?

Altså noget i stil med:
BringWindowToFront(GetDesktopWindow);
Keybd_Event(vk_f5, 0, 0, 0);

Denne kode har bare ét problem, nemlig at Desktop-vinduet så bli\'r markeret.
Hvordan kan det undgås ?
Avatar billede cms Nybegynder
14. maj 2001 - 14:19 #20
BringWindowToFront => BringWindowToTop.
Avatar billede cms Nybegynder
14. maj 2001 - 14:20 #21
Doh !

Jeg har sq\'da glemt, at GetDesktopWindow ikke returnerer Explorer\'s window handle, men blot selve \"overfladen\" af windoze :-(
- og dermed modtager explorer slet ikke mit f5-tryk

Wwvåddan zå ?
Avatar billede ziron Nybegynder
14. maj 2001 - 16:13 #22
er der point i det :-)

/ZIRON
Avatar billede cms Nybegynder
14. maj 2001 - 17:29 #23
selvfølgelig !! hvad regner du mig for ?!? ;o)

christian
Avatar billede cms Nybegynder
14. maj 2001 - 17:30 #24
flest point for en løsning, hvor man ikke behøver simulere tastetryk.
Avatar billede ziron Nybegynder
14. maj 2001 - 17:32 #25
okay kigger  lige engang :-)

det var lidt for sjov det med point...

/ZIRON
Avatar billede borrisholt Novice
14. maj 2001 - 19:02 #26
en lille tur via shlobj og det følgende er kommet frem :

USES SHLOBJ;
procedure ChangeActiveWallpaper;
const
  CLSID_ActiveDesktop: TGUID = \'{75048700-EF1F-11D0-9888-006097DEACF9}\';
var
  ActiveDesktop: IActiveDesktop;
begin
  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
    as IActiveDesktop;
  ActiveDesktop.SetWallpaper(\'c:\\windows\\profiles\\dave\\desktop\\fern.jpg\', 0);
  ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;

Jeg laver liger en komplet  ActiveDesktop klasse ....

Jens B
Avatar billede borrisholt Novice
14. maj 2001 - 20:30 #27
når så man har lavet sådan en hvad skal man så lave ? Gå hjem ?

Du kan lige få koden her. Det en ganske tyen wrapper omkring IActiveDesktop, som gør den lidt mere menneskelig at arbejde med, men stadig kan det hele ... Lig den i en unit for sig selv ....

unit UnitActiveDesktop;

interface
uses
  ComObj, ShlObj, Sysutils, Windows, Forms;

const
  {$EXTERNALSYM WPSTYLE_CENTER}
  WPSTYLE_CENTER      = 0;
  {$EXTERNALSYM WPSTYLE_TILE}
  WPSTYLE_TILE        = 1;
  {$EXTERNALSYM WPSTYLE_STRETCH}
  WPSTYLE_STRETCH    = 2;
  {$EXTERNALSYM WPSTYLE_MAX}
  WPSTYLE_MAX        = 3;

type
  TActiveDesktop = class
  private
    FActiveDesktop : IActiveDesktop;
    FWallPaperOptions: TWallPaperOpt;
    FDesktopItemOptions: TComponentsOpt;

    tmpBuffer: PWideChar;

    FWallPaper: String;
    FPattern: String;

    procedure SetWallPaper(const Value: String);
    procedure SetWallPaperOptions(const Value: TWallPaperOpt);
    procedure SetPattern(const Value: String);
    procedure SetDesktopItemOptions(var Value: TComponentsOpt);
  protected
    //Applies changes to the Active Desktop and saves them in the registry
    function  ApplyChanges : Integer;
    procedure SetEnable(bEnable : Boolean);
  public
    constructor Create;

    //Gets/Sets the wallpaper for the Active Desktop
    property WallPaper : String read FWallPaper write SetWallPaper;

    //Gets/Sets the wallpaper options
    property WallPaperOptions : TWallPaperOpt read FWallPaperOptions write SetWallPaperOptions;

    //Retrieves/Sets the Active Desktop pattern.
    property Pattern : String read FPattern write SetPattern;

    //Retrieves/Sets the item\'s options
    property DesktopItemOptions : TComponentsOpt read FDesktopItemOptions write SetDesktopItemOptions;

    //Adds the desktop item associated with the specified URL.
    function AddUrl(const Source : String; var pComp: TShComponent) : Integer;

    //Adds a desktop item
    function AddDesktopItem(var pcomp: TShComponent): Integer;

    //Adds a desktop item to the Active Desktop after displaying user interfaces
    //that confirm the addition of the desktop item, verify security zone permissions,
    //and ask if the user wants to create a subscription.
    function AddDesktopItemWithUI(var pcomp: TShComponent): Integer;

    //Modifies the desktop item
    function ModifyDesktopItem(var pcomp: TShComponent): Integer;

    //Removes the specified desktop item from the desktop
    function RemoveDesktopItem(var pcomp: TShComponent): Integer;

    //Retrieves a count of the desktop items
    function GetDesktopItemCount : Integer;

    //Retrieves the specified desktop item
    function GetDesktopItem(nComponent: Integer; var pcomp: TShComponent): Integer;

    //Retrieves the desktop item that matches the given identification
    function GetDesktopItemByID(dwID: DWORD; var pcomp: TShComponent): Integer;

    //Generates a generic HTML page containing the given desktop item.
    function GenerateDesktopItemHtml(FileName: String; var pcomp: TShComponent): Integer;

    //Retrieves a desktop item using its source URL
    function GetDesktopItemBySource(Source: String; var pcomp: TShComponent): Integer;

    //Determine if Active Desktop is enabled
    class function IsEnabled : Boolean;

    //Enable Active Desktop
    procedure Enable;

    //Disable Active Desktop
    procedure Disable;
  end;

implementation

{ TActiveDesktop }

function TActiveDesktop.AddDesktopItem(var pcomp: TShComponent): Integer;
begin
  result := FActiveDesktop.AddDesktopItem(pcomp, 0);
  ApplyChanges;
end;

function TActiveDesktop.AddDesktopItemWithUI(var pcomp: TShComponent): Integer;
begin
  result := FActiveDesktop.AddDesktopItemWithUI(0,pcomp,0);
  ApplyChanges;
end;

function TActiveDesktop.AddUrl(const Source: String;  var pComp: TShComponent): Integer;
begin
  tmpBuffer := AllocMem(length(Source) *SizeOf(WideChar)+1);
  try
    StringToWideChar(Source,tmpBuffer, length(Source) *SizeOf(WideChar)+1);
    result := FActiveDesktop.AddUrl(Application.MainForm.Handle,tmpBuffer,pComp,ADDURL_SILENT);
  finally
    FreeMem(tmpBuffer);
  end;
  ApplyChanges;
end;

Function  TActiveDesktop.ApplyChanges : Integer;
begin
  result :=  FActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE or AD_APPLY_REFRESH);
end;

constructor TActiveDesktop.Create;
begin
  FActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
  FActiveDesktop.GetWallpaperOptions(FWallPaperOptions,0);
  FActiveDesktop.GetDesktopItemOptions(FDesktopItemOptions,0);

  tmpBuffer := AllocMem(MAX_PATH*2);
  try
    FActiveDesktop.GetWallpaper(tmpBuffer, MAX_PATH*2, 0);
    FWallPaper := tmpBuffer;
  finally
    FreeMem(tmpBuffer);
  end;

  tmpBuffer := AllocMem(256);
  try
    FActiveDesktop.GetPattern(tmpBuffer, 256, 0);
    FPattern := tmpBuffer;
  finally
    FreeMem(tmpBuffer);
  end;
end;

procedure TActiveDesktop.SetEnable(bEnable: Boolean);
var
  ComponentsOpt: TComponentsOpt;
begin
  ComponentsOpt.dwSize := sizeof(ComponentsOpt);
  ComponentsOpt.fActiveDesktop := ComponentsOpt.fEnableComponents = bEnable;
  SetDesktopItemOptions(ComponentsOpt);
  ApplyChanges;
end;

function TActiveDesktop.GenerateDesktopItemHtml(FileName: String;  var pcomp: TShComponent): Integer;
begin
  tmpBuffer := AllocMem(length(FileName)*SizeOf(WideChar)+1);
  try
    StringToWideChar(FileName,tmpBuffer, length(FileName)*SizeOf(WideChar)+1);
    result := FActiveDesktop.GenerateDesktopItemHtml(tmpBuffer,pcomp,0);
  finally
    FreeMem(tmpBuffer);
  end;
end;

function TActiveDesktop.GetDesktopItem(nComponent: Integer; var pcomp: TShComponent): Integer;
begin
  result := FActiveDesktop.GetDesktopItem(nComponent, pcomp, 0);
end;

function TActiveDesktop.GetDesktopItemByID(dwID: DWORD;  var pcomp: TShComponent): Integer;
begin
  result := FActiveDesktop.GetDesktopItemByID(dwID, pcomp,0);
end;

function TActiveDesktop.GetDesktopItemBySource(Source: String; var pcomp: TShComponent): Integer;
begin
  tmpBuffer := AllocMem(length(Source)*SizeOf(WideChar)+1);
  try
    StringToWideChar(Source,tmpBuffer, length(Source) *SizeOf(WideChar)+1);
    result := FActiveDesktop.GetDesktopItemBySource(tmpBuffer,pcomp,0);
  finally
    FreeMem(tmpBuffer);
  end;
end;

function TActiveDesktop.GetDesktopItemCount: Integer;
begin
  FActiveDesktop.GetDesktopItemCount(result,0);
end;

class function TActiveDesktop.IsEnabled: Boolean;
var
  ShellFlagState : TShellFlagState;
begin
  SHGetSettings(ShellFlagState, SSF_DESKTOPHTML);
  result := bool(ShellFlagState.Data);
end;

function TActiveDesktop.ModifyDesktopItem(var pcomp: TShComponent): Integer;
begin
  result := FActiveDesktop.ModifyDesktopItem(pcomp,COMP_ELEM_ALL);
  ApplyChanges;
end;

function TActiveDesktop.RemoveDesktopItem(var pcomp: TShComponent): Integer;
begin
  result := FActiveDesktop.RemoveDesktopItem(pcomp,0);
  ApplyChanges;
end;

procedure TActiveDesktop.SetDesktopItemOptions( var Value: TComponentsOpt);
begin
  FActiveDesktop.SetDesktopItemOptions(Value,0);
  FDesktopItemOptions := Value;
  ApplyChanges;
end;

procedure TActiveDesktop.SetPattern(const Value: String);
begin
  FPattern := Value;

  tmpBuffer := AllocMem(length(Value)*SizeOf(WideChar)+1);
  try
    StringToWideChar(Value,tmpBuffer, length(Value) *SizeOf(WideChar)+1);
    FActiveDesktop.SetPattern(tmpBuffer, 0);
  finally
    FreeMem(tmpBuffer);
  end;

  ApplyChanges;
end;

procedure TActiveDesktop.SetWallPaper(const Value: String);
begin
  FWallPaper := Value;

  tmpBuffer := AllocMem(length(Value) *SizeOf(WideChar)+1);
  try
    StringToWideChar(FWallPaper,tmpBuffer, length(Value) *SizeOf(WideChar)+1);
    FActiveDesktop.SetWallpaper(tmpBuffer, 0);
  finally
    FreeMem(tmpBuffer);
  end;

  ApplyChanges;
end;

procedure TActiveDesktop.SetWallPaperOptions(const Value: TWallPaperOpt);
begin
  FWallPaperOptions := Value;
  FActiveDesktop.SetWallpaperOptions(FWallPaperOptions, 0);
end;

procedure TActiveDesktop.Enable;
begin
  SetEnable(True);
end;

procedure TActiveDesktop.Disable;
begin
  SetEnable(False);
end;

end.

Få jeg så 1.000.000.000 points for det ?

Jens B
Avatar billede ziron Nybegynder
14. maj 2001 - 20:42 #28
borrisholt >> jeg synes det lyder som en god ide at du får 1.000.000.000 point\'s :-)

du skal da ikke hjem, du skal skrive en dansk stil for mig :-)

/ZIRON
Avatar billede hacicambaz Nybegynder
23. januar 2002 - 13:47 #29
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester