Autor Thema: Wallpaper Changer in Delphi  (Gelesen 572 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline scriptor

  • Kilobyte
  • *
  • Beiträge: 87
    • Profil anzeigen
    • pcFred.de
Wallpaper Changer in Delphi
« am: 29. März 2008, 10:10:10 »
Da der Wallpaper Changer Open Source ist und hier so ein netter neuer Bereich aufgestellt wurde, werde ich mal gleich den Code posten. Ich habe mit sehr vielen Kommentaren gearbeitet und werde daher nicht viel dazu erkl?ren.

Vorab: Der Code erkl?rt wie man mit DLL's arbeitet (einbindet, Funktionen innerhalb der DLL deklariert und verwendet), wie man ein Programm in der Sys Tray verschwinden l?sst und wieder zur?ck hollt. Zudem wird deutlich wie man Registrierungs Eintr?ge manipuliert und Grafikobjekte dynamisch erstellt. Au?erdem wird beschrieben wie man ein JPEG Bild in ein BMP Bild konvertiert.

[logged]unit uMain;                                               //von Manfred Michalis

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, MPlayer, ExtDlgs, ExtCtrls, Menus, ShellAPI,
  Registry, JPEG;  { Menus.dcu ist f?r Popupmen?s und Men?leisten notwendig
                    ShellAPI.dcu brauche ich f?r das Laden des Programmes
                    in die Systray
                    Registry.dcu ist notwendig f?r das Ver?ndern der Registry
                    Eintr?ge
                    JPEG.dcu wird ben?tigt f?r die Konvertierung von JPEG zu BMP }

const WM_TASKBAREVENT = WM_USER + 1; { Konstante, die n?tig f?r die
                                        Deklaration der Systray Pocedure ist }

type
  TfrmMain = class(TForm)
    gbOptions: TGroupBox;
    gbWallpaper: TGroupBox;
    lOpt: TLabel;
    lAnzeigeZeit: TLabel;
    lSekunden: TLabel;
    eInterval: TEdit;
    bAendern: TButton;
    bVerwerfen: TButton;
    bVerstecken: TButton;
    bEnde: TButton;
    bHinzufuegen: TButton;
    bEntfernen: TButton;
    lbWallpaper: TListBox;
    dlgOeffnePic: TOpenPictureDialog;
    mOptionen: TMemo;
    tZeit: TTimer;
    pmTask: TPopupMenu;
    pmOptionen: TMenuItem;
    pmClose: TMenuItem;
    bSetWallpaper: TButton;
    pmAddWp: TMenuItem;
    pPreview: TPanel;
    imgPreview: TImage;
    procedure bEndeClick(Sender: TObject);
    procedure bVersteckenClick(Sender: TObject);
    procedure bHinzufuegenClick(Sender: TObject);
    procedure bEntfernenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bAendernClick(Sender: TObject);
    procedure bVerwerfenClick(Sender: TObject);
    procedure tZeitTimer(Sender: TObject);
    procedure eIntervalChange(Sender: TObject);
    procedure pmCloseClick(Sender: TObject);
    procedure pmOptionenClick(Sender: TObject);
    procedure bSetWallpaperClick(Sender: TObject);
    procedure lbWallpaperClick(Sender: TObject);
    procedure pmAddWpClick(Sender: TObject);

  private
    procedure WM_TaskbarEvent(var Message: TMessage); // Systray Procedure Deklaration
    message WM_TASKBAREVENT;                          // N?tig f?r das Senden der Aufforderung das Programm in die Win Systray aufzunehmen
    procedure AddImage;                               // Deklaration einer Procedure, die ein Bild l?dt, konvertiert und speichert
    procedure ErstelleOpt;
    procedure ErstelleWP;
    procedure IntervalReset;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

var
  iTimer, iWP, iOldTimer: integer;                 
  sTimer, sWallpaper,sPfadWP,sPfadOpt : string; 

function ChangeWallpaper(): integer;             //Funktionen Deklaration,
 external 'cwhelper.dll' name 'CHANGEWALLPAPER'; //die aus einer DLL genommen wird

procedure TaskBarAddIcon;
var
  tnid : TNotifyIconData;    //Ein "Objekt" das aus der ShellAPi.dcu geladen wird
  Owner : Hwnd;        // Der Handle f?r das Fenster (Handle = eine Art Verweiss)
begin
  with tnid do     // sehr Praktisch!!! (anstatt tnid.cbSize := ...; tnid.Wnd := ...; tnid.uID := ..; usw.)
  begin
    cbSize := Sizeof(TNotifyIconData);
    Wnd    := frmMain.Handle;
    uID    := 1;
    uFlags := NIF_Message or NIF_Icon or NIF_TIP;
    uCallbackMessage := WM_TASKBAREVENT;
    hIcon  := Application.Icon.Handle;
  end;
  StrCopy(tnid.szTip, 'Wallpaper Changer');  //kopiert 'Wallpaper Changer' in den String tnid.szTip | f?r den Tooltipp in der Systray
  Shell_NotifyIcon(NIM_ADD,@tnid);             //f?gt das Symbol der Systray zu
  Owner := GetWindow(frmMain.Handle,GW_OWNER);
  if Owner <> 0 then ShowWindow(OWNER,SW_HIDE);
  end;

procedure TaskBarRemoveIcon;
var
  tnid : TNotifyIconData;
  Owner : Hwnd;
begin
  tnid.cbSize := Sizeof(TNotifyIconData);
  tnid.Wnd    := frmMain.Handle;
  tnid.uID    := 1;
  Shell_NotifyIcon(NIM_DELETE,@tnid);  //l?scht das Symbol aus der Systray
  Owner := GetWindow(frmMain.Handle,GW_OWNER);
  if Owner <> 0 then
  begin
    ShowWindow(OWNER,SW_SHOW);
    ShowWindow(OWNER,SW_NORMAL);
  end;
end;

procedure TfrmMain.WM_TaskbarEvent(var Message: TMessage);
var point : TPoint;  //Ein Objekt mit einer X und einer Y Koordinate
begin
  case Message.LParamLo of
    WM_LBUTTONDOWN:    // Wenn die linke Maustaste gedr?ckt wird
    begin
      SetForegroundWindow(Handle);  //Setzt den Verweiss (Handle) in den Vordergrund (f?r das Popupmen?)
      GetCursorPos(point);          //Hollt sich die X,Y Koordinaten und ?bergibt sie an point
      pmTask.Popup(point.Y,point.X);  //?ffnet das Popupmen? an der Mausposition
    end;
  end;
end;

procedure TfrmMain.AddImage;
var sName: string;
begin
  dlgOeffnePic.Execute;  //ein OpenPictureDialog (soll ausgef?hrt werden)
  sName := ' ' + dlgOeffnePic.FileName; //F?gt ein Leerzeichen f?r die ListBox ein
  lbWallpaper.Items.Add(sName);       // F?gt den Pfad in der ListBox ein
  lbWallpaper.Items.SaveToFile(sPfadWP);  //Speichert es in der Datei
end;

procedure TfrmMain.ErstelleOpt;
begin
 ShowMessage('Die Datei C:\ChangerOpt.wrc exestiert nicht! Sie wird nun angelegt.');
 mOptionen.Lines.SaveToFile(sPfadOpt);
end;

procedure TfrmMain.ErstelleWP;
begin
  ShowMessage('Die Datei C:\ChangerDat.wrc exestiert nicht! Sie wird nun angelegt.');
  lbWallpaper.Items.SaveToFile(sPfadWP);
end;

procedure TfrmMain.IntervalReset;
begin
  tZeit.Interval := 0;
  eInterval.Text := '0';
  ShowMessage('Kein Wallpaper in der Liste')
end;

procedure TfrmMain.bSetWallpaperClick(Sender: TObject);
var PicBMP  :TBitmap;    // Bitmap Objekt
    PicJPG  :TJPEGImage;   // JPEG Objekt
begin
  iWP := lbWallpaper.ItemIndex;
  sWallpaper := lbWallpaper.Items.ValueFromIndex[iWP];
  PicBMP  := TBitmap.Create;  // Erstellt das BMP Objekt
  PicJPG  := TJPEGImage.Create; //Erstellt das JPEG Objekt
  PicJPG.LoadFromFile(sWallpaper);   //L?dt das JPEG Bild in das Objekt
  PicBMP.Assign(PicJPG);  //   konvertiert das JPEG Bild in ein BMP Bild
  PicBMP.SaveToFile('c:\wallpaper.bmp'); //Speichert das BMP Bild
  PicBMP.Free;
  PicJPG.Free;      //Gibt die Bild Objekte wieder frei
  ChangeWallpaper();  //Sendet an Windows das es das Hintergrundbild aktualisieren soll (in der cwhelper.dll)
end;

procedure TfrmMain.lbWallpaperClick(Sender: TObject);
begin
  imgPreview.Visible := true;
  iWP := lbWallpaper.ItemIndex;
  sWallpaper := lbWallpaper.Items.ValueFromIndex[iWP];
  imgPreview.Picture.LoadFromFile(sWallpaper);
end;

procedure TfrmMain.bEndeClick(Sender: TObject);
begin
  close;
end;

procedure TfrmMain.bVersteckenClick(Sender: TObject);
begin
  frmMain.Hide;
  TaskBarAddIcon;
end;

procedure TfrmMain.bHinzufuegenClick(Sender: TObject);
begin
  AddImage;
end;

procedure TfrmMain.bEntfernenClick(Sender: TObject);
begin
if lbWallpaper.ItemIndex = -1 then beep else
    lbWallpaper.Items.Delete(lbWallpaper.ItemIndex);
    lbWallpaper.Items.SaveToFile(sPfadWP);
    imgPreview.Visible := false;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var Reg: TRegistry;
begin
  iWP    := -1;
  sPfadOpt   := 'c:\ChangerOpt.wrc';
  sPfadWP := 'c:\WChangerDat.wrc';
  If FileExists(sPfadWP) = false then ErstelleWP
   else lbWallpaper.Items.LoadFromFile(sPfadWP);
  if FileExists(sPfadOpt) = false then ErstelleOpt
   else mOptionen.Lines.LoadFromFile(sPfadOpt);
  sTimer := mOptionen.Lines.CommaText;
  eInterval.Text := sTimer;
  iTimer := StrToInt(sTimer) * 1000;
  tZeit.Interval := iTimer;
  if lbWallpaper.Items.Count > 0 then
   sWallpaper := lbWallpaper.Items.ValueFromIndex[0];
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Control Panel\Desktop', True) then
    begin
      Reg.DeleteKey('WallPaper');
      Reg.WriteString('WallPaper','c:\wallpaper.bmp');
      Reg.CloseKey;
    end;
    finally
      Reg.Free;
    inherited;
  end;
end;

procedure TfrmMain.bAendernClick(Sender: TObject);
begin
  mOptionen.Lines.Clear;
  mOptionen.Lines.Add(eInterval.Text);
  mOptionen.Lines.SaveToFile(sPfadOpt);
  sTimer := mOptionen.Lines.CommaText;
  eInterval.Text := sTimer;
  iTimer := StrToInt(sTimer) * 1000;
  tZeit.Interval := iTimer;
end;

procedure TfrmMain.eIntervalChange(Sender: TObject);
begin
  iOldTimer := iTimer div 1000;
end;

procedure TfrmMain.bVerwerfenClick(Sender: TObject);
begin
  iTimer := iOldTimer * 1000;
  tZeit.Interval := iTimer;
  eInterval.Text := IntToStr(iOldTimer);
  mOptionen.Lines.Clear;
  mOptionen.Lines.Add(eInterval.Text);
  mOptionen.Lines.SaveToFile(sPfadOpt);
end;

procedure TfrmMain.tZeitTimer(Sender: TObject);
var PicBMP  :TBitmap;
    PicJPG  :TJPEGImage;
begin
  if iWP = lbWallpaper.Items.Count - 1 then iWP := 0 else  iWP := iWP + 1;
  if lbWallpaper.Items.Count = 0 then IntervalReset
  else
  tZeit.Interval := iTimer;
  if lbWallpaper.Items.Count > 0 then
   begin
    sWallpaper := lbWallpaper.Items.ValueFromIndex[iWP];
    PicBMP  := TBitmap.Create;
    PicJPG  := TJPEGImage.Create;
    PicJPG.LoadFromFile(sWallpaper);
    PicBMP.Assign(PicJPG);
    PicBMP.SaveToFile('c:\wallpaper.bmp');
    PicBMP.Free;
    PicJPG.Free;
      { SystemParameter{(SPI_SETDESKWALLPAPER,PChar(sWallpaper),0,
                          SPIF_SENDCHANGE or SPIF_UPDATEINIFILE) then
                          RaiseLastOSError; in der DLL}
    ChangeWallpaper();
   end;
end;

//Popup Men?
procedure TfrmMain.pmCloseClick(Sender: TObject);
begin
  close;
end;

procedure TfrmMain.pmOptionenClick(Sender: TObject);
begin
  frmMain.Show;
  TaskBarRemoveIcon;
end;

procedure TfrmMain.pmAddWpClick(Sender: TObject);
begin
  AddImage;
end;

end.
[/logged]
« Letzte Änderung: 29. März 2008, 20:45:42 von PC-Nanni »
Wenn einer eine Bratwurst brät, hat er wahrscheinlich ein Bratwurst brat Gerät.


Online Miguel

  • Forum-Staff
  • Administrator
  • Exabyte
  • *****
  • Beiträge: 1828
  • freestylechiller
    • Profil anzeigen
    • PC-Onlineforum.de
  • OS: Ubuntu Linux & Win7
Re: Wallpaper Changer in Delphi
« Antwort #1 am: 30. März 2008, 00:37:40 »
cool, wie kann ich diesen code eig. kompilieren? Brauch ich da wie bei c++ nen compiler und nen Linker?

1.Eine Programmiersprache sollte schreib- und lesbar für Orang-Utans sein.
2.Die Syntax sollte einfach sein, leicht zu merken und das Wort Monkey (engl. Affe) vermeiden.
3.Bananen sind gut.

Offline scriptor

  • Kilobyte
  • *
  • Beiträge: 87
    • Profil anzeigen
    • pcFred.de
Re: Wallpaper Changer in Delphi
« Antwort #2 am: 30. März 2008, 10:45:54 »
Nat?rlich brauchst du auch nen Compiler. Aber das ist ein bisschen anders als bei C++. Den Code, den du dort siehst, wurde in Delphi 7 geschrieben. Daher brauchst du mindestens Delphi 7 oder eine neuere Version von Delphi. Du k?nntest nat?rlich auch eine ?ltere Version nehmen, aber dann m?sstest du den Code ein wenig umschreiben. (Die Syntax hat sich ein wenig ge?ndert)  Bei Delphi kriegst du die IDE und den Compiler gleich dazu. Das ganze musst du dir so ?hnlich wie Visual C++ oder Visual Basic vorstellen. Der Delphi Compiler von Borland ist ein wenig schlechter als ein C++ Compiler von wen auch immer. Daf?r kann man mit Delphi die GUIs schneller erstellen (schneller und einfacher als bei Visual C++ 6 von Microsoft), da es wie schon oben erw?hnt ?hnlich abl?uft wie im Visual Studio und mit ein wenig Erfahrung und Know How kann man sogar Spiele in Delphi per Direct X oder OpenGL schreiben.
Wenn einer eine Bratwurst brät, hat er wahrscheinlich ein Bratwurst brat Gerät.

Online Miguel

  • Forum-Staff
  • Administrator
  • Exabyte
  • *****
  • Beiträge: 1828
  • freestylechiller
    • Profil anzeigen
    • PC-Onlineforum.de
  • OS: Ubuntu Linux & Win7
Re: Wallpaper Changer in Delphi
« Antwort #3 am: 30. März 2008, 12:05:07 »
ist Delphi f?r Programmier-Einsteiger geeignet?
Ich hab schon ?berlegt mir mal die Grundlagen von Java anzusehen, aber wenn du mir Delphi empfiehlst kann ich dich ja bei Problemen ansprechen oder?

1.Eine Programmiersprache sollte schreib- und lesbar für Orang-Utans sein.
2.Die Syntax sollte einfach sein, leicht zu merken und das Wort Monkey (engl. Affe) vermeiden.
3.Bananen sind gut.

Offline scriptor

  • Kilobyte
  • *
  • Beiträge: 87
    • Profil anzeigen
    • pcFred.de
Re: Wallpaper Changer in Delphi
« Antwort #4 am: 31. März 2008, 13:06:28 »
Mir f?llt Delphi auf jeden Fall einfacher als C# zum Beispiel. Mit ist es recht leicht gefallen nach dem ich Parallelen zu PHP festgestellt hatte. Kurz gesagt, wenn du schon eine Hochsprache oder eine Script Sprache (wie PHP) beherrschst wird es dir mit Delphi leicht gemacht. Du brauchst auch nicht unbedingt die neuste Version von Delphi um damit ein sinnvolles Programm zu machen. Was auf jeden Fall ein gro?er Vorteil ist, ist der eingebaute Ressource Editor, mit dem du ganz leicht deinen Code mit einen GUI versehen kannst. (Es ist einfacher als beim Visual Studio 6.0) F?r Anf?nger kann ich es eigentlich nur empfehlen. Der Umstieg auf andere Sprachen ist auch leichter, als eine andere Sprache neu zu lernen ohne vorher Kenntnisse ?ber Programmieren zu haben. Wenn du es lernen m?chtest kann ich dir die ein oder andere Sache auch n?her bringen. Besuche doch mal http://www.delphi-treff.de/tutorials/, dort findest du Tutorials, die auch f?r Einsteiger verst?ndlich sind.
Wenn einer eine Bratwurst brät, hat er wahrscheinlich ein Bratwurst brat Gerät.

Online Miguel

  • Forum-Staff
  • Administrator
  • Exabyte
  • *****
  • Beiträge: 1828
  • freestylechiller
    • Profil anzeigen
    • PC-Onlineforum.de
  • OS: Ubuntu Linux & Win7
Re: Wallpaper Changer in Delphi
« Antwort #5 am: 31. März 2008, 19:34:56 »
ok dann fang ich mal an mich durchzulesen :)
Wie w?rs mit ner neuen Kategorie f?r Programmiersprachen?
Delphi und C++ k?nnten ja rein, und HTML + PHP sowieso...
Wie w?rs?


Achja k?nntest du dein Programm zu den Downloads uppen?
Unter "von Usern -> Scriptor -> Wallpaper Changer"?
« Letzte Änderung: 31. März 2008, 20:18:28 von PC-Nanni »

1.Eine Programmiersprache sollte schreib- und lesbar für Orang-Utans sein.
2.Die Syntax sollte einfach sein, leicht zu merken und das Wort Monkey (engl. Affe) vermeiden.
3.Bananen sind gut.

Offline scriptor

  • Kilobyte
  • *
  • Beiträge: 87
    • Profil anzeigen
    • pcFred.de
Re: Wallpaper Changer in Delphi
« Antwort #6 am: 01. April 2008, 14:26:09 »
Finde ich gut die Idee. Das w?rde das Angebot noch bereichern. Das mit dem Wallpaper Changer ist erliedigt.
Wenn einer eine Bratwurst brät, hat er wahrscheinlich ein Bratwurst brat Gerät.

Online Miguel

  • Forum-Staff
  • Administrator
  • Exabyte
  • *****
  • Beiträge: 1828
  • freestylechiller
    • Profil anzeigen
    • PC-Onlineforum.de
  • OS: Ubuntu Linux & Win7
Re: Wallpaper Changer in Delphi
« Antwort #7 am: 01. April 2008, 19:42:01 »
OK wir k?nnen dann im neuen Delphi Board weiter machen^^
machste mal nen neuen Thread auf, erz?hlst was ?ber Delphi und empfiehlst mir dort nen kostenlosen IDE?^^
Dankesch?n

1.Eine Programmiersprache sollte schreib- und lesbar für Orang-Utans sein.
2.Die Syntax sollte einfach sein, leicht zu merken und das Wort Monkey (engl. Affe) vermeiden.
3.Bananen sind gut.