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]