AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Get Last Active Window

Ein Thema von blablab · begonnen am 22. Okt 2016 · letzter Beitrag vom 22. Okt 2016
Antwort Antwort
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

Get Last Active Window

  Alt 22. Okt 2016, 10:52
Hallo!

Ich hab ein TrayIcon mit dem ich meine Anwendung minimieren bzw wieder aktivieren möchte. Das bedeutet, wenn die Anwendung minimiert wird, wird sie "gerestored" und aktiviert. Ist die Anwendung allerdings schon "gerestored" dann soll sie nur dann minimiert werden, wenn sie gerade aktiv ist, sonst soll sie aktiviert werden (denn es kann ja auch sein sie befindet sich hinter einem anderen Fenster).

Das Problem ist jetzt jedoch, sobald ich auf das TrayIcon klicke, wird die TaskBar aktiviert und es reicht jetzt nicht aus zu schauen welches Fenster aktiviert ist, sondern ich muss herausfinden, welches Fenster vor der TaskBar aktiviert war.

Deshalb benutze ich GetForegroundWindow und arbeite mich dann in der Z-Order solange durch, bis ich ein sichtbares Fenster finde, das nicht die TaskBar ist.

Hier stoße ich jetzt aber auf ein weiteres Problem, denn TopMost-Fenster stehen immer höher in der Z-Order. Im Moment mache ich es so, dass ich das erste TopMost-Fenster und das erste Nicht-TopMost-Fenster nehme (das nicht die TaskBar ist) und wenn eines der beiden mein gesuchtes Fenster ist, dann gehe ich davon aus, dass dieses zuvor aktiv war. Leider komme ich hier aber nicht weiter und kann nur raten. Denn ob nun das TopMost- oder das Nicht-TopMost-Fenster zuvor aktiv war, kann ich aus der Z-Order nicht herauslesen.

Ich benötige mehr/andere Informationen, und irgendwo muss das auch gespeichert sein, denn Windows weiß ja auch welches Fenster als nächstes aktiviert wird (Siehe Alt+Tab). Allerdings finde ich hierzu nichts.

Kann mir vielleicht jemand weiterhelfen?

Mit freundlichen Grüßen
blablab
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Get Last Active Window

  Alt 22. Okt 2016, 11:23
Du bekommst doch in den Fenstern mit, wenn sie aktiviert werden. (OnActivate-Ereignis).

Mach' Dir eine Variabel, in die ein Formular in dem Ereignis reinschreib: 'Ich bin aktiv'. Also z. B. Self.

Im Klickereignis Deines TrayIcons schaust Du nun in diese Variabel und aktivierst "den Inhalt".

Sowas in der Art:
Delphi-Quellcode:
type
  TFormKundenverwaltung = class(TForm)
    fLastForm : TForm;
    TrayIcon: TTrayIcon;
...
  public
    { Public-Deklarationen }
    LastFornm : TForm read fLastForm write fLastForm;
...
procedure TFormKundenverwaltung.TrayIconDblClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Assigned(fLastForm) then begin
    if flastForm is TForm then begin
      // Was auch immer hier passieren soll ...
      ShowMessage(fLastForm.Caption);
    end;
  end;
end;

procedure TFormKundenverwaltung.FormActivate(Sender: TObject);
begin
  fLastForm := Self;
end;

...

procedure TFormAdressen.FormActivate(Sender: TObject);
begin
  FormKundenverwaltung.LastForm := Self;
end;

...

procedure TFormRechnungen.FormActivate(Sender: TObject);
begin
  FormKundenverwaltung.LastForm := Self;
end;
(ungetestet hingedaddelt)

Mit 'nem Nachfahren Deines TrayIcon, dem Du ein zusätzliches Attribut "LastForm" gönnst, wäre das vermutlich dann viel eleganter zu lösen.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Get Last Active Window

  Alt 22. Okt 2016, 11:47
Vielen Dank, so mach ichs!

Edit:
Leider ist das immer noch keine saubere Lösung.
Ich musste es etwas abwandeln:
Ich verwende WM_ACTIVATEAPP um das Deaktivieren meiner Anwendung mitzubekommen und gleich zu wissen, welche Anwendung als nächstes aktiviert wird. Nur wenn die TaskBar die als nächstes aktivierte Anwendung ist, merke ich mir den Zeitpunkt (GetTickCount).

Ich weiß also, wenn ich nicht die TaskBar als nächstes deaktiviere, darf ich meine Anwendung nicht minimieren. Außerdem kann ich mit ziemlicher Sicherheit sagen, wenn ich die TaskBar aktiviere und wenige Millisekunden später das TrayIcon klicke, muss ich meine Anwendung minimieren.

Leider weiß ich aber nicht, was ich tun soll, wenn die TaskBar aktiviert wurde und erst Sekunden später das TrayIcon geklickt wird. Es könnte sein in der Zwischenzeit wurden andere Anwendungen aktiviert oder der Benutzer musste erst die "zwei Pfeilchen nach oben" klicken und das TrayIcon heraussuchen.

Das heißt ich komme so nicht wirklich weiter. Wieder funktioniert es meistens, aber unter bestimmten Voraussetzungen muss ich raten...

Geändert von blablab (22. Okt 2016 um 12:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 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