Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop (https://www.delphipraxis.net/194378-form-wirklich-oben-halten-alternative-zu-formstyle-fsstayontop.html)

LTE5 13. Nov 2017 21:15

Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Nach einigem Herumgeteste habe ich eine für mich fast funktionierende Lösung gefunden, um ein Delphifenster über allen anderen externen Fenstern zu halten, da fsStayOnTop scheinbar nur innerhalb der eigenen Anwendung gilt.

Was sagt ihr dazu? Ist das ein ganz böser und dirty Hack oder brauchbar?

Delphi-Quellcode:
TaskStayOnTop := TTask.Create(
 procedure
  begin
   Sleep(5);

   while Bedingung do
    begin
     if FormStyle = fsStayOnTop then
      ForceForegroundWindow(Handle);
    end;
  end);

TaskStayOnTop.Start;
ForceForegroundWindow kommt von hier http://www.swissdelphicenter.com/de/showcode.php?id=261

Fritzew 13. Nov 2017 21:48

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Gibt es einen Grund dafür das Du das brauchst?
Das fsStayOnTop nur auf die Application zielt, hat einen Sinn.
Das System gehört dem Anwender und nicht Dir!!!!!! Wenn der aus welchen Gründen auch immer gerade was anderes machen will, so ist das sein Recht!
Bei mir würde jede Anwendung die sich so verhält rausfliegen.

LTE5 13. Nov 2017 21:52

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Es handelt sich um ein kleines Statusfenster im Systembereich. Ob es oben gehalten werden soll oder nicht, kann der Nutzer selber entscheiden.
Aber wenn es oben gehalten werden soll, dann wirklich oben. Während das Fenster unten im Systembereich sichtbar ist, läuft ein Verarbeitungsprozess, den der Nutzer auch selber startet.

Fritzew 13. Nov 2017 22:05

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Nun ja,
Das Hauptproblem ist wenn Du das Fenster nach vorne holst, wird eventuell auch der Focus auf dieses Fenster verschoben.

Ich denke mal das es nicht ganz einfach ist, das so zu lösen da Windows selber das Konzept für Fenster so nicht kennt.
Muss aber gestehen das sich für mich das Problem noch nie gestellt hat.
So weit ich das überblicke ist es auch von der Windowsversion abhängig was da genau passiert bei ForceForegroundWindow,
ich wäre da sehr vorsichtig...

LTE5 13. Nov 2017 22:15

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Wie machen es Produkte wie Avira oder andere Antiviren-Firmen denn?
Speziell Avira zeigt häufig Werbung an, die immer oben ist.

EWeiss 13. Nov 2017 22:33

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
HWND_TOPMOST ?
HWND_TOP = fsStayOnTop

gruss

LTE5 13. Nov 2017 22:44

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); und SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); hab ich schon durch. Funktioniert leider genau so wenig wie fsStayOnTop.

EWeiss 13. Nov 2017 22:46

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
tja wenn man die Anwendung in den Hintergrund setzt dann nicht Richtig! (HWND_NOTOPMOST)
Dachte eigentlich du wolltest das Gegenteil erreichen.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

gruss

LTE5 13. Nov 2017 23:01

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Ich weiß nicht wovon du schreibst.
Ich habe einen Button wo ich hin- und herwechseln kann. Entweder immer vorne oder nicht.

Dalai 13. Nov 2017 23:07

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Ich nutze dafür folgende Funktion
Delphi-Quellcode:
function SetWindowAlwaysOnTop(const AForm: TForm; AOnTop: Boolean): Boolean;
var
  Lattr: HWND;
begin
    if AOnTop then
        Lattr:= HWND_TOPMOST
    else
        Lattr:= HWND_NOTOPMOST;

    Result:= SetWindowPos(AForm.Handle, // handle to window
                 Lattr, // placement-order handle {*}
                 AForm.Left, // horizontal position
                 AForm.Top,  // vertical position
                 AForm.Width,
                 AForm.Height,
                 // window-positioning options
                 SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;
Aufgerufen z.B. mit
Delphi-Quellcode:
SetWindowAlwaysOnTop(Self, True);
wird dieses Fenster im Vordergrund gehalten. Natürlich kann es von anderen Fenstern, die ebenfalls TOPMOST sind, überdeckt werden, aber das ist ja klar und wohl bekannt.

Grüße
Dalai

LTE5 13. Nov 2017 23:18

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Vielleicht liegt mein Problem woanders. Aber wenn mein Systembereichfenster den Fokus hat, dein Code ausgeführt wurde, es also oben bleiben sollte, und ich mit ALT-TAB raustabbe und wieder rein, ist der Effekt oben zu bleiben weg.

Dalai 13. Nov 2017 23:35

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Spielt es eine Rolle, zu welcher anderen Anwendung du mit Alt+Tab wechselst? Ist diese Anwendung ebenfalls TOPMOST? Wie sieht's in einer Testanwendung aus?

Grüße
Dalai

LTE5 13. Nov 2017 23:37

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Meine Testanwendung hat nur einen Button, der eine bool'sche Variable umsetzt (bIsTop := not bIsTop) die im FormCreate False ist und anschließend SetWindowAlwaysOnTop(Form1, bIsTop);.
Zum testen tabbe ich rüber zu Chrome.

Dalai 14. Nov 2017 00:00

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Wann setzt du das TOPMOST genau?

Grüße
Dalai

LTE5 14. Nov 2017 00:09

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Im ButtonClick rufe ich deine Prozedur auf.

Dalai 14. Nov 2017 00:20

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Mmh, ich sehe nicht, warum das nicht gehen sollte. Wird die Prozedur denn auch aufgerufen, hält der Debugger also an einem in dieser Prozedur gesetzten Breakpoint?

Grüße
Dalai

EWeiss 14. Nov 2017 08:21

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Dein Problem ist einfach erklärt.
Du versuchst dein Window immer ganz oben zu halten und erwartest das alle Programme sich an deine Vorgaben halten.

Nun das geht nun mal nicht denn die versuchen ebenfalls ihr Fenster oben zu halten.
Fakt ist nun mal das so wie ich schon schrieb HWND_TOPMOST die höchste ZOrder unter Windows ist höher geht nun mal nicht.
Und da andere Anwendungen diese ebenfalls für sich in Anspruch nehmen wird deine Anwendung nach hinten geschoben sobald die zuletzt gestartete Anwendung ebenfalls TOPMOST verwendet und da kannst du nix machen..
In dem fall zählt die Reihenfolge der zuletzt aktivierten Anwendung.

Ohne Hack oder ständiger Überprüfung über Timer oder der gleichen wird das nicht gehen.

Wenn ich mein Video starte mit
Delphi-Quellcode:
    SetWindowPos(gP.MainHandle, HWND_TOPMOST, 0, 0, 0, 0,
      SWP_NOMOVE or SWP_NOSIZE or SWP_FRAMECHANGED or SWP_SHOWWINDOW);
Dann wirst du es schwer haben anderer Windows drüber zu setzen.
Nun das hat aber damit zu tun weil es im Vollbild läuft und du an kein anderes Programm herankommst ohne Aufwand
So das du dieses drüber setzen könntest.


gruss

LTE5 14. Nov 2017 08:47

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Danke für die Erklärung. Das mit der Z-Order hat mich schlauer gemacht.
Ich werde später am Tag mal mit SetWindowPos SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE und zusätzlich SWP_FRAMECHANGED or SWP_SHOWWINDOW austesten.
Einen Timer möchte ich eigentlich nicht verwenden. Aber vielleicht ist das ja sogar des Problems lösung. SetWindowPos in einem SetWindowPos. Da wird wenigstens kein Fokus gesetzt.
Ich habe gestern schon TabStop von einer Hand voll Komponenten auf False gesetzt. Das hat schon einmal ein wenig geholfen. Nur leidet darunter leider die Nutzerfreundlichkeit und Barrierefreiheit.

Dalai 14. Nov 2017 14:54

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Zitat:

Zitat von EWeiss (Beitrag 1386205)
Nun das geht nun mal nicht denn die versuchen ebenfalls ihr Fenster oben zu halten.

Das ist zwar richtig. Allerdings habe ich meine Zweifel daran, dass das Fenster von Chrome dieses Attribut gesetzt hat. Zwar kenne ich Chrome nicht, aber es würde mich sehr wundern, wenn der das standardmäßig tut.

Daher meine Frage, ob denn die Prozedur überhaupt gerufen wird. Wäre nicht das erste Mal, dass die Verknüpfung des Events zur Prozedur fehlt (ist mir auch schon mehrfach passiert).

Grüße
Dalai

TigerLilly 15. Nov 2017 08:21

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Wenn es dich interessiert: Die GExperts haben ein DebugView, das genau das macht, was du möchtest.

Den Quellcode dazu findest du hier:
https://sourceforge.net/p/gexperts/c...ebugWindow.pas

Diese Zeilen sind, was du suchst:

Code:
procedure TfmDebug.SetStayOnTop(OnTop: Boolean);
begin
  FStayOnTop := OnTop;
  if OnTop then
    SetWindowPos(Self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE)
  else
    SetWindowPos(Self.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
end;
Siehe auch hier:
https://blogs.msdn.microsoft.com/old...21-10/?p=33263
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Neutral General 15. Nov 2017 14:32

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Zitat:

"How do I create a window that is never covered by any other windows, not even other topmost windows?"
Imagine if this were possible and imagine if two programs did this. Program A creates a window that is "super-topmost" and so does Program B. Now the user drags the two windows so that they overlap. What happens? You've created yourself a logical impossibility. One of those two windows must be above the other, contradicting the imaginary "super-topmost" feature.
https://blogs.msdn.microsoft.com/old...07-00/?p=35413

Luckie 15. Nov 2017 20:53

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Bitte nie Bitmasken mit "+" verknüpfen, sondern mit OR. Es funktioniert zwar, ist formal aber falsch.

DeddyH 16. Nov 2017 14:54

AW: Form wirklich oben halten, Alternative zu FormStyle fsStayOnTop
 
Und es funktioniert auch nicht immer. Spätestens, wenn man dasselbe Bit versehentlich noch einmal dazuaddiert, wird es falsch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 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