Entwickler-Ecke

Windows API - Vollbild unter Windows 7


Manfred - Mi 01.04.15 00:43
Titel: Vollbild unter Windows 7
Das Problem ist sicher alt, aber aus meiner Sicht nicht gelöst.

Kennt jemand einen Dreh, wie man eine Vollbild-Ansicht unter Windows 7 realisiert, wobei auch die Taskleiste überdeckt wird?
Dass es gehen muss, beweist der IE, aber eigene Anwendungen scheitern daran offenbar.


Delete - Mi 01.04.15 02:05

Rechtsklick auf Taskleiste, Eigenschaften, Taskleiste automatisch ausblenden.


baumina - Mi 01.04.15 08:00

Mein IE überdeckt bei maximiertem Fenster keine Taskleiste, oder wie schaltest du den IE auf Vollbild?


Hoermi93 - Mi 01.04.15 09:06

Die Vollbildansicht im IE wird durch den Druck der F11 Taste aktiviert


baumina - Mi 01.04.15 09:28

Aha, man lernt nie aus, dann würde ich folgendes vorschlagen:


Delphi-Quelltext
1:
2:
  Borderstyle := bsNone;
  WindowState := wsMaximized;


jaenicke - Mi 01.04.15 09:52

Richtig, wobei der Rand hier das Entscheidende ist. Ist der Rand im maximierten Zustand aktiviert, ist auch die Taskleiste da, ist er deaktiviert, wird diese auch verdeckt.
Auf diese Weise hat Microsoft Vollbildanwendungen auf eine einfache Weise möglich gemacht ohne das normale Maximieren zu stören.


Manfred - Mi 01.04.15 14:09

Leider funktioniert das nur, wenn die Werte bereits zur Entwurfszeit definiert werden. Ich will dem Anwender aber die Möglichkeit geben zur Laufzeit auf Vollbild umzustellen. Und in dem Fall bleibt die Taskleiste sichtbar.
Die Anwendung wird zwar maximiert, schiebt sich aber hinter die Taskleiste.


baumina - Mi 01.04.15 14:27

Also ich hatte in meinem DelphiXE-Testprogramm die beiden Zeilen in einem OnClick eines Buttons drin und es hat funktioniert. Kannst du ein kleines Testprogramm machen bei dem der Aufruf zur Laufzeit nicht funktioniert?


Delete - Mi 01.04.15 15:34

Kann ich bestätigen: ich hab mal eben schnell eine private Bool-Variable deklariert und einen neuen Button hinzugefügt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TFormScanner.ButtonMaxClick(Sender: TObject);
begin
  If Vollbild Then
  Begin
    Vollbild         := False;
    Self.WindowState := wsNormal;
    Self.BorderStyle := bsSizeable;
  End Else
  Begin
    Self.BorderStyle := bsNone;
    Self.WindowState := wsMaximized;
    Vollbild         := True;
  End;
end;

Das Ergebnis ist genau das erwartete: Das Formular schaltet in den Vollbild-Modus und überdeckt alles.


jaenicke - Mi 01.04.15 16:23

Das funktioniert nur, wenn man zuerst den BorderStyle setzt und danach maximiert. Andersherum geht es nicht.


Martok - Do 02.04.15 19:05

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Andersherum geht es nicht.
Was übrigens ein VCL-Bug ist, da wird IIRC irgendwo beim RecreateWindow für den Borderstyle der WindowState falsch zurückgesetzt. Hat das eigentlich mal irgendwer reported? Ich hatte das vor ein paar Jahren mal erforscht, aber dann ignoriert weil man's ja auch einfach andersrum machen kann.


Manfred - Do 09.04.15 23:09

Sorry, das ich mich jetzt erst melde.
Erst einmal recht herzlichen Dank für die Antworten.
Die Beeinflussung von borderStyle führt sofort dazu, dass die Anzeige im Fenster leer ist. Ursache ist vermutlich der TWebBrowser, der in dem Formular eingebettet ist.

Meine vorläufige Lösung sieht daher so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
var
  l : longint;
  i : interger;
Begin
    l := GetWindowLong(Handle,GWL_STYLE);
    if (WS_CAPTION and l)>0 then
    begin
        if WindowState <> wsmaximized then
        begin
          // Fenster maximieren
          WindowState := wsmaximized ;
        end else
        begin
          // Volbild einschalten
          l := l and not WS_CAPTION ;
          l := l and not WS_BORDER ;
          SetWindowLong(Handle,GWL_STYLE, l);
          ClientHeight := Height+GetSystemMetrics(SM_CYCAPTION);
          WindowState := wsMaximized;
        end;
    end else
    begin
        // Vollbild ausschalten
        SetWindowLong(Handle,GWL_STYLE, l or WS_CAPTION or WS_BORDER);

        i:=Width-ClientWidth;
        ClientWidth := Screen.Width-i;
        i:=Height-ClientHeight;
        ClientHeight := Screen.Height-i;
        WindowState := wsMaximized;
    end;


Soweit ich das nachvollziehen kann, kommt das Eurer Lösung etwa gleich. Allerdings bleibt bei Vollbild-Einstellung der Border trotz "and not WS_BORDER" bestehen.
Bei Einzelmonitoren kein Problem, da er außerhalb der Monitorbreite liegt. Bei zwei Monitoren ist er sichtbar.

Zum Problem der Taskleiste unter Win 7:
Wird Vollbild aktiviert, bleibt die Taskleiste zunächst sichtbar, bis das Fenster aktiviert wird (wobei es eigentlich aktiv war), z.B. durch Anklicken. Dann verschwindet meistens die Taskleiste, oftmals aber eben nicht.

Edit: Remarks hinzugefügt


Delete - Fr 10.04.15 00:54

Im Anhang ist ein Testprogramm.

Wenn es nicht funktioniert, ist die Einstellung der Taskleiste falsch.


jaenicke - Fr 10.04.15 06:37

user profile iconManfred hat folgendes geschrieben Zum zitierten Posting springen:
Die Beeinflussung von borderStyle führt sofort dazu, dass die Anzeige im Fenster leer ist. Ursache ist vermutlich der TWebBrowser, der in dem Formular eingebettet ist.
Hast du vielleicht ein Testprojekt dafür, das du anhängen kannst? Ich kann das mit Delphi XE7 nicht reproduzieren. Welche Delphiversion nutzt du denn?


Manfred - Fr 10.04.15 09:44

Ich verwende für dieses Projekt Delphi 6, das Problem existiert aber auch unter XE

Die Sache mit dem Testprogramm ist etwas schwierig, da das Ding mehrere tausend Zeilen enthält. Ich werd am WE mal was zusammenbauen.


Manfred - Fr 10.04.15 09:51

@hathor

Anbei ein Screenshot-Ausschnitt Deines Testprogramms: Die Taskleiste ist sichtbar, das Modul liegt aber auch nicht hinter der Taskleiste.


Delete - Fr 10.04.15 10:47

Das Wort "Testbild" sollte in der Mitte stehen! Desktop erweitert?

Ich habe das Testprogramm etwas erweitert.
Bei mir ist die Taskleiste vorhanden, aber nicht sichtbar.


Delete - Fr 10.04.15 11:32

Nächste Erweiterung: Show Taskbar und Hide Taskbar hinzugefügt.
Man sollte das Programm aber nach Show Taskbar verlassen, sonst bleibt sie unsichtbar.


Manfred - Di 14.04.15 15:55

@hathor

Das ist ja alles ganz nett aber kein Vollbild. Die Taskleiste blendet sich zwar aus, doch das ändert nichts an der Fenstergröße der Anwendung. Der Start-Button bleibt ebenfalls sichtbar.

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Das Wort "Testbild" sollte in der Mitte stehen! Desktop erweitert?

Das Wort "Testbild" steht auch in der Mitte, mein geposteter Screenshot von Freitag war nur ein Ausschnitt.

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es nicht funktioniert, ist die Einstellung der Taskleiste falsch.

Welche Einstellung? Ich glaube nicht, dass es sich um ein Einstellungsproblem handelt, dann würden andere Programme (IE) ja auch nicht laufen.

Leider bin ich am WE nicht dazu gekommen, etwas zum Testen zusammenzustellen, ich bitte um Geduld, da ich z.Z. bis über beide Ohren in Arbeit stecke.


Manfred - Di 14.04.15 16:05

Hier meine Screenshots von Deinem Programm FullScreen-3


jaenicke - Di 14.04.15 18:47

Mit den Testprogrammen sieht es bei mir genauso aus. Dis Taskleiste ist sichtbar, wenn ich auf Vollbild gehe. Sowohl auf einem frisch installierten Windows 7 als auch 8.1.

Im Anhang mal ein Testprogramm, das bei mir überall funktioniert.


Martok - Di 14.04.15 19:04

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Mit den Testprogrammen sieht es bei mir genauso aus. Dis Taskleiste ist sichtbar, wenn ich auf Vollbild gehe. Sowohl auf einem frisch installierten Windows 7 als auch 8.1.

Im Anhang mal ein Testprogramm, das bei mir überall funktioniert.
Jupp, kann ich bestätigen. Funktioniert mit dem Code von user profile iconPerlsau in Delphi 7, 2007 und Lazarus auf Win 8.1.

Edit: Du wolltest uns jetzt testen, oder user profile iconhathor? Dein Formular hat (jedenfalls in der Resource) Align=alClient statt WindowState=wsMaximized. Ganz was anderes.