|
Registriert seit: 5. Jan 2005 Ort: Trier 248 Beiträge Delphi 7 Personal |
#1
Hi!
Seit ewigen Zeiten hatte ich schon Lust mal einen eigenen Bildschirmschoner zu programieren. Schwierig dabei ist eigentlich nur das diese Bildschirmschoner auf den ersten Blick keine normalen Programm zu sein scheinen da sie mit der Dateierweiterung "*.scr" enden und nicht mit "*.exe". Auch ist in der Windows32DeveloperHelp dieses Kapitel "ScreenSaver" über die ScreenSaver.library nicht gerade leicht verständlich, und, wie ich herausgefunden habe, geht´s auch viel einfacher! Durch Zufall habe ich im Netz folgenden Artikel gefunden : ![]() ![]() ...However, in a Win32-based application, hPrevInstance is always NULL.
Therefore, you cannot determine if another instance of your application has been started simply by examining hPrevInstance. This article gives you a method you can use... ![]()
Delphi-Quellcode:
So. Das war der erste notwendige Trick. Interessant ist auch das man durch die Zeile "Application.ShowMainForm:=false" verhindern kann das das Hauptfenster angezeigt wird.
program LinesScreenSaver;
uses Forms, Windows, Messages, Main in 'Main.pas' {MainForm}, Screen in 'Screen.pas' {ScreenForm}, Configuration in 'Configuration.pas' {ConfigForm}, Graphic in 'Graphic.pas'; {$R *.RES} Var Wnd:HWnd; begin // Testen ob der Bildschirmschoner schon läuft Wnd:=FindWindow('TMainForm','ScreenSaver'); // Wenn ja... If Wnd<>0 then Begin // ...dann Nachricht senden das er sich beenden soll // Wenn er sich nicht beenden will (Modeus "/s") If SendMessage(Wnd,wm_User,0,0)=1 // Dann brech das Programm eiskalt ab! Then Halt(0); End; Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.CreateForm(TScreenForm, ScreenForm); Application.CreateForm(TConfigForm, ConfigForm); // Diese Zeile verhindert das das Hauptfenster angezeigt wird! Application.ShowMainForm:=false; Application.Run; end. Parameter ========= Windows startet einen ScreenSaver mit drei möglichen Parametern (ParamStr(1) und (2):
Code:
So. Das "N" ist jeweils ein Fensterhandle, klever nich? Und zwar ist es im Modus "/c:N" das Handle des Fensters in dem man unter "Bildschirmschoner" auf "Einstellungen" und "Testen" drücken und einen Bildschirmschoner auswählen kann; aber dummerweise nur das Händel des PageControl-Objekts und nicht das Händel des Hauptfensters. Nun ja, ich hol mir dann einfach mit der Funktion "GetParent(Wnd:HWnd):HWnd" das Händel des übergeordneten Fensters und sperre dieses Fenster mit "EnableWindow(Wnd:HWnd; Enable:Boolean):Boolean" bevor ich das Konfigurations-Fenster aufrufe. Natürlich muss man das Fenster wieder entsperren wenn das Konfigurieren beendet ist.
ParamStr1 ParamStr2 Bedeutung
"/s" Bildschirmschoner im Vollbild-Modus starten "/c:N" Es wurde auf "Einstellungen" gedrückt und soll das Konfigurations-Fenster angezeigt werden "/p" "N" Der Bildschirmschoner wurde gestartet und soll seine Grafik im verkleinerten Beispielfenster anzeigen Dieses Sperren ist notwendig damit der Anwender nicht einfach auf "Ok", "Abbruch" oder "Übernehmen" drücken kann während das Konfigurations-Fenster sichtbar ist. Dies hätte nämlich unangenehme Folgen... So. Das "N" im Modus "/p" ist interessanterweise das Fensterhändle dieser verkleinerten Darstellung des Bildschirmschoners! Nun, wenn man ein Fensterhändel hat dann kann man sich mit der Funktion "GetDC(Wnd:HWnd):HDC" den DeviceContext des Fensters holen und in dieses hineinzeichnen. Und genau das macht mein Bildchirmschoner: Gesteuert von einem Timer wird alle N Millisekunden ein neues Bild in eine Bitmap gezeichnet, und dieses Bild wird dann mit "StrecthBlt()" in das verkleinerte Fenster gezeichnet. Das ist schon der ganze Trick. Wird das Fenster "Eigenschaften von Anzeige" geschlossen dann wird dieser DC natürlich ungültig, der Bildschirmschoner bemerkt dies und beendet sich selbst. Klever, nich? Also, das ganze hört sich mal wieder komplizierter an als es im Grunde genommen ist, weil: Das ganze Gefummel braucht dich kaum zu interessieren! Im Archiv findest Du zwei verschiedene Versionen, eine für Delphi 3.0 und eine für Delphi 7.0. Enthalten sind darin jeweils zwei Ordner mit Quellcodes, nämlich "Empty ScreenSaver" und "Lines ScreenSaver". Wenn Du nun Deinen eigenen Bildschirmschoner schreiben willst dann nimm den QuellCode von "Empty ScreenSaver" als Basis. Ich hab aus diesem Programm fast alles entfernt was nicht notwendig ist. Es gibt nur ZWEI Units in denen Du etwas ändern musst: "Configuration" und "Graphic". Von allen anderen Units solltest Du Deine Finger weglassen, Änderungen sollten hier nur erfahren Delphi-Programmierer machen! Ich habe versucht das alles ordentlich und modular zu programmieren: In der Unit "Configuration" must Du nur zu Deinem eigenen Bildschirmschoner passend entsprechende Einstellungen ermöglichen, und mit "LoadConfig" und "SaveConfig" kannst Du Deinen Code einbinden der diese Einstellungen dann in einem IniFile abspeichert bzw. lädt. Das IniFile selbst wird automatisch erzeugt, darum brauchst Du Dich nit zu kümmern! In der Unit "Graphic" ist alles enthalten was mit dem Zeichnen der Grafik zu tun hat. Dort findest Du 4 Prozeduren die Du Deinen Vorstellungen gemäss ändern must: InitGraphic Hier kannst Du Speicher besorgen und Objekte erzeugen die Du für Deine Grafik benötigst. Diese Funktion wird beim Programmstart automatisch aufgerufen. ClearGrafik Hier kannst (bzw. MUSST!) Du den Speicher und die Objekte wieder freigeben. Diese Prozedur wird nur vor dem Programmende automatisch aufgerufen. NewGraphic Diese Prozedur wird beim Programmstart automatisch aufgerufen und auch dann wenn der Anwender im Konfigurationsfenster irgendwelche Einstellungen geändert hat. Du kanst hier also irgendwelche Eigenschaften Deiner Grafik ändern, Variablen neu initialieren etc. . PaintGraphic Dies ist die Hauptzeichenfunktion die vom Timer alle N Millisekunden aufgerufen wird und die Bild für Bild eine neue Grafik zeichnet. Du zeichnest im Hintergrund auf eine BitMap die Dir übergeben wird. Um das Kopieren dieser Bitmap ins Hauptfenster oder verkleinerte Fenster brauchst Du Dich nit zu kümmern, dies übernimmt die Prozedur "Flip" aus der Unit "Screen" und geht voll automatisch. So. Ich hoffe das Euch dieer Roman hier nit zu lang und kompliziert war. Und ich hoffe das Ihr jetzt alle wie wild beginnt Eure eigenen Bildschirmschoner zu basteln! Ich hab versucht Euch dies so einfach wie möglich zu machen ![]() Die Programme sind GiftWare, und, logischerweise, OpenSource! Das ganze sollte ab Windows ´95 laufen, getestet habe ich es erfolgreich mit Windows ´98 SE und XP. Das Programm verwendet nur Standard-Delphi-Komponenten und schreibt im übrigen NIX in die System-Registrierung! Ach ja: Vergesst blos nicht Euren Bildschirmschoner ins Verzeichniss "C\Windows" zu kopieren und seine Dateierweiterung von "*.exe" in "*.scr" zu ändern, sonst klappt das ganze nämlich nit! --[Edit]------------------------------- In den alten Versionen der Programme im Anhang befand sich in der Uses-Clausel der Unit Screen irrtümlicherweise noch ein Bezug auf IdleTimer, dies habe ich nun geändert. Eine neue Version des LinesScreenSavers, der Delphi-Objekte anstalle der Old-Style-Objekte verwendet ist in Arbeit aber leider noch nicht ganz fertig, kommt aber demnächst ![]() Grüsse von TOC ![]()
Lars Uwe Hohmann
|
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |