Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bildschirmschoner programmieren: Previewfenster? (https://www.delphipraxis.net/16610-bildschirmschoner-programmieren-previewfenster.html)

Neg 20. Feb 2004 06:54


Bildschirmschoner programmieren: Previewfenster?
 
Ich habe vorhin zufällig gelesen, wie einfach es ist, einen Bildschirmschoner selbst zu programmieren. Man braucht ja lediglich eine Exe in Scr umzubenennen und auf gewisse Parameter reagieren, mit denen Windows einen Bildschirmschoner startet.

/c = Konfigurieren
/s = Starten

Nun habe ich durch Rumprobieren herausgefunden, dass Windows das Programm jedes Mal, wenn ein Preview des Bildschirmschoners in diesem kleinen Fensterchen angezeigt werden soll, mit dem Parameter /p aufruft. Als zweiter Parameter wird eine Zahl mitgeliefert, bei der es sich wohl offensichtlich um irgendein Handle handelt.

Aber was genau fange ich damit jetzt an? Um was für ein Objekt handelt es sich dabei und wie kann ich mit ihm kommunizieren? Hat da jemand zufällig eine Ahnung oder sogar Erfahrung mit?

:dp:

SirThornberry 20. Feb 2004 07:00

Re: Bildschirmschoner programmieren: Previewfenster?
 
einfach mal showwindow auf das handle anwenden und schauen was verschwindet... Ich könnte mir vorstellen das du das handle als parent bei deinem programm angeben musst damit es in der vorschau angezeigt wird.

[Edit]Vielleicht ist es auch das Handle auf die Canvas für die Vorschau, einfach mal bissl mit dem handle rumspielen...[/Edit]

tobster 17. Mai 2004 17:55

Re: Bildschirmschoner programmieren: Previewfenster?
 
Also an dieser Stelle kann ich doch spontan weiterhelfen, bin nämlich gerade an derselben Stelle, bzw. ein Schritt weiter, weil ich zwar das Preview angezeigt, aber nicht wieder automatisch WEG bekomme...

Hier erst mal, wie ich im DPR auf die Parameter reagiere (Nix wildes soweit):

Delphi-Quellcode:
begin
 if ParamCount > 0 then begin
  showmessage(paramstr(1));
  if (ParamStr(1) = '/s') or (ParamStr(1) = '/S') then begin
   Application.Initialize;
   Application.Title := 'Spectrum Clock';
   Application.CreateForm(Tfrm_ScrSave, frm_ScrSave);
   Application.Run;
  end else if (copy(ParamStr(1),1,2) = '/c') or (copy(ParamStr(1),1,2) = '/C') then begin
   Application.Initialize;
   Application.Title := 'Spectrum Clock';
   Application.CreateForm(Tfrm_Config, frm_Config);
   Application.Run;
  end else if (copy(ParamStr(1),1,2) = '/p') or (copy(ParamStr(1),1,2) = '/P') then begin
   Application.Initialize;
   Application.Title := 'Spectrum Clock';
   Application.CreateForm(Tfrm_preview, frm_preview);
   Application.Run;
  end;
 end;
end.
Wie gesagt, alles recht einfach! Im OnCreate-Ereignis vom Preview-Fenster kommt nun folgendes:

Delphi-Quellcode:
procedure Tfrm_preview.FormCreate(Sender: TObject);
var dispHWND: HWND;
    lngStyle: LongInt;
    DispRec: TRECT;
begin
 dispHWND := strtoint(paramstr(2));
 windows.GetClientRect(dispHWND, DispRec);
 lngStyle := GetWindowLong(frm_Preview.handle, GWL_STYLE);
 lngStyle := lngStyle or WS_CHILD;
 SetWindowLong(frm_Preview.handle, GWL_STYLE, lngStyle);
 windows.SetParent(frm_Preview.handle, dispHWND);
 SetWindowLong(frm_Preview.handle, GWL_HWNDPARENT, dispHWND);
 windows.SetWindowPos(frm_Preview.handle, HWND_TOP, 0, 0, DispRec.Right, DispRec.Bottom,
              SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW);
end;
Der Rest bleibt dir und deinem Bildschirmschoner überlassen. Wenn mir jetzt jemand im Gegenzug helfen könnte, wie man automatisch das Fenster wieder schliessen kann, wenn der Nutzer zum Bleistift, einen anderen Schoner auswählt, wäre ich auch um ein Vielfaches glücklicher!

Gebhard 28. Nov 2005 12:24

Re: Bildschirmschoner programmieren: Previewfenster?
 
In der anhängenden Zip-Datei befindet sich der Quelltext und eine Beschreibung für die Vorlage eines Bildschirmschoners. Manchem Leser/-in mag Textteile bekannt vorkommen. Ich habe mir einige Programmteile aus dem Internet zusammengesucht.
Die Vorlage wurde mit Delphi 7 erstellt. Ich benutzte grundsätzlich Benennungen in deutscher Sprache (nicht in englischer), weil die Programmteile hierdurch lesbarer werden. In den Formen stehen keine Befehle für die Schonertätigkeit. Dieses überlasse ich der Phantasie des Programmierers.

faux 28. Nov 2005 12:56

Re: Bildschirmschoner programmieren: Previewfenster?
 
Zitat:

Zitat von Gebhard
In der anhängenden Zip-Datei...

Die hast du wohl vergessen anzuhängen. :mrgreen:

Grüße
Faux

Gebhard 29. Nov 2005 14:38

Re: Bildschirmschoner programmieren: Previewfenster?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

hier ein zweiter Versuch mit der Zip-Datei.

faux 10. Dez 2005 10:37

Re: Bildschirmschoner programmieren: Previewfenster?
 
Hallo!

Du schreibst mal in deiner dpr CreateMutex. Wo liegt darin der Sinn? Dadurch kann man im Windows-Dialog weder auf Config noch auf Preview klicken, da dadurch eine weitere Instanz des Programmes gestartet werden müsse.

Grüße
Faux

Gebhard 29. Dez 2005 14:34

Re: Bildschirmschoner programmieren: Previewfenster?
 
zur Frage "Du schreibst mal in deiner dpr CreateMutex. Wo liegt darin der Sinn?..."

Ich habe beim programmieren die Erfahrung gemacht, dass beim Umschalten
des Reiters innerhalb der Desktopeigenschaften das Programm wiederholt gestartet wurde. Mit dem "CreateMutex" verhindere ich dieses.

Ich wünsche Euch einen guten Rutsch und ein schönes 2006.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz