Entwickler-Ecke

Windows API - Bildschirmschoner-Preview beenden


mtm - Mo 17.05.10 20:06
Titel: Bildschirmschoner-Preview beenden
Hallo zusammen.

Ich bin in Delphi ein ziemlicher Anfänger. Ich versuche einen eigenen Bildschirmschoner zu erstellen, bei dem Bilder als Slideshow angezeigt werden. Klappt eigentlich auch alles ganz gut.

Ein Frage habe ich aber doch noch. Wenn die Vorschau angezeigt wird, wird das Programm mit dem Parameter /p gestartet - so weit, so gut. Wie erkenne ich aber, dass die Vorschau beendet wurde, d.h. OK oder Abbrechen gedrückt wurde ?

Wäre super, wenn mir einer helfen könnte.

Danke im Voraus
mtm


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 18.05.2010 um 09:07


Delete - Di 18.05.10 08:01

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure ScreenSaverEnde;
var Dummy: Integer;
begin
  SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, @Dummy, 0);
  ShowCursor(True);
end;


jaenicke - Di 18.05.10 08:25

Sobald das Fensterhandle nicht mehr gültig ist, muss der Bildschirmschoner sich auch beenden.

Ich vermute einmal du setzt mit SetParent dein Fenster als Child in das angegebene Preview-Handle? Dann hätte ich jetzt gedacht, dass da auch automatisch WM_CLOSE ankäme und das automatisch geschlossen wird. Leider habe ich jetzt nicht die Zeit das zu testen, aber so steht es soweit ich mich erinnere in den entsprechenden Anleitungen im Internet. :gruebel:

Ich schaue es mir heute Abend nach der Arbeit an, wenn ich da um kurz vor Mitternacht noch zu komme.

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, @Dummy, 0);                    
Damit deaktivierst du den laufenden Bildschirmschoner. Und was hat das mit der Frage zu tun?


mtm - Di 18.05.10 10:33

Die Preview-Form wird mit folgendem Code in onCreate gestartet. Hab den Code hier aus dem Forum kopiert.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    lWnd:=strtoint(paramstr(2));
    windows.GetClientRect(lWnd,tR);
    lStyle:=GetWindowLong(frmSaver.Handle,GWL_STYLE);
    lStyle:=lStyle or WS_CHILD or WS_CLIPCHILDREN;
    SetWindowLong(frmSaver.Handle,GWL_STYLE,lStyle);
    Windows.SetParent(frmSaver.Handle,lWnd);
    SetWindowLong(frmSaver.Handle,GWL_HWNDPARENT,lWnd);
    SetWindowPos(frmSaver.Handle,HWND_TOP,0,0,tR.Right,tR.Bottom,SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW);


In diesem Fall wird das schließen der Vorschau nicht erkannt.

Mittlerweile habe ich aber eine andere (nicht so elegante) Lösung. Da ich für die Slideshow sowieso einen Timer eingebaut habe, prüfe ich mit

Delphi-Quelltext
1:
GetWindowLong(strtoint(paramstr(2)),GWL_STYLE)=0                    

ob die Vorschau noch läuft. Wenn nicht, wird das Programm beendet.

Das funktioniert eigentlich ganz gut.

Trotzdem danke für die Hilfe

mrm