Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wenn Anwendung inaktiv, dann minimieren. (https://www.delphipraxis.net/149569-wenn-anwendung-inaktiv-dann-minimieren.html)

Lostriga 24. Mär 2010 08:38


Wenn Anwendung inaktiv, dann minimieren.
 
Aloa,

bin auch mal wieder hier mit einer kleinen Frage.
Wie der Titel des Threads schon sagt, geht es mir um das minimieren einer inaktiven Anwendung.

Zum minimieren habe ich folgende Anleitung von alcaeus verwendet, danke im nachhinein.
Aus dessen Demo´s nahm ich mir was ich brauchte und kombinierte das ein und andere.

Meine CoolTrayIcon Funktion läuft wie folgt:
- kein Task angezeigt in der Taskleiste (sowohl minmiert als auch maximiert)
- ein CoolTrayIcon neben der Uhr
- durch Klick auf dieses Icon wird die Anwendung sowohl minimiert als auch maximiert
- mit rechts-Klick auf das Icon erscheint ein Popup Menü in dem Beenden zu wählen ist

Mein Problem ist nun folgendes
- ist die Anwendung inaktiv/im Hintergrund/nicht im Vordergrund soll diese automatisch minimiert werden

Ich suche also: wenn Anwendung inaktiv/im Hintergrund/nicht im Vordergrund, dann minimieren.
Bzw. soll einfach gemerkt werden wenn das geschieht, das minimieren bekomme ich dann auch selber hinein.


Freu mich auf ein bisschen Hilfe und Danke schon mal.


Mit freundlichem Gruß

Lostriga

daywalker9 24. Mär 2010 12:03

Re: Wenn Anwendung inaktiv, dann minimieren.
 
Bastel dir doch einen Timer in deine Anwendung und guckst ob die Application.Active false ist.

Tyrael Y. 24. Mär 2010 12:18

Re: Wenn Anwendung inaktiv, dann minimieren.
 
Delphi-Quellcode:

procedure TBlub.MinimizeMyApp(Sender: Tobject);
begin
  ...
end;
  ...

Application.OnDeactivate := MinimizeMyApp;
...

himitsu 24. Mär 2010 12:29

Re: Wenn Anwendung inaktiv, dann minimieren.
 
Dann verschwindet aber die Anwendung sofort, auch wenn eine andere Anwendung sich nur mal kurz in den Fordergrund bringt (z.B. Virenscanner oder Firewall) oder man im Startmenü rumblättert.
Und mit einem Timmer rumzupollen ist auch nicht sonderlich schön.

Eine Kombination wäre da schon angebrachter:
Ich würde also in OnDeactivate einen Timer starten und in OnActivate stoppen.
Wenn der Timer dann z.B. nach 15-30 Sekunden auslößt, dann ebenfalls den Timer stoppen (einmal auslösen reicht ja) und gleichzeitig die Anwendung minimieren.

Lostriga 24. Mär 2010 16:09

Re: Wenn Anwendung inaktiv, dann minimieren.
 
Aloa,

danke für die Antworten.

Ich habe es mal so versucht:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationActivate(Sender:TObject);
    //procedure ApplicationMinimize(Sender:TObject);
    procedure ApplicationDeactivate(Sender:TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnActivate := ApplicationActivate;
//Application.OnMinimize := ApplicationMinimize;
Application.OnDeactivate := ApplicationDeactivate;
end;

procedure TForm1.ApplicationActivate(Sender: TObject);
begin
Timer1.Enabled := False;
end;

//procedure TForm1.ApplicationMinimize(Sender: TObject);
//begin
//Timer1.Enabled := False;
//end;

procedure TForm1.ApplicationDeactivate(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//if Application.Minimize then //auch mit Application.OnMinimize versucht, aber bei beidem kommt eine Fehlermeldung
//  begin
//    Timer1.Enabled := False;
//  end
//  else begin
    sleep(10000);
    Application.Minimize;
    Timer1.Enabled := False;
//  end;
end;

end.
Das mit dem minimieren, wenn die Anwendung inaktiv ist, funktioniert soweit.
Leider blockiert diese für die 10 Sekunden des Timers, welche als Verzögerung dienen soll.
Desweiteren setzt der Timer auch ein, wenn ich die Anwendung direkt minimiere,
wodurch dieses wiederum 10 Sekunden blockiert, was ja Irrsinn ist.

Ich habe es versucht zu lösen in dem ich das in den Bemerkungen einfügte, bisher hat nicht funktioniert.


Mit freundlichem Gruß

Lostriga

lbccaleb 24. Mär 2010 16:28

Re: Wenn Anwendung inaktiv, dann minimieren.
 
Wozu das Sleep im Timer??
Doppelt gemoppelt ist besser??

TTimer auf Interval = 10000 stellen

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationActivate(Sender:TObject);
    //procedure ApplicationMinimize(Sender:TObject);
    procedure ApplicationDeactivate(Sender:TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnActivate := ApplicationActivate;
Application.OnDeactivate := ApplicationDeactivate;
end;

procedure TForm1.ApplicationActivate(Sender: TObject);
begin
Timer1.Enabled := False;
end;

procedure TForm1.ApplicationDeactivate(Sender: TObject);
begin
if not (Form1.WindowState = wsMinimized) then
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

    Timer1.Enabled := False;
    Application.Minimize;
end;

end.
Ungetestet :)

Lostriga 24. Mär 2010 17:33

Re: Wenn Anwendung inaktiv, dann minimieren.
 
Aloa,

lbccaleb du bist mein Held des Tages. :thumb:
Die Anwendung wird nun nicht mehr blockiert und funktioniert genau so wie sie soll.

Ich danke dir für die Berichtigungen, und den anderen dreien für den Ansatz um mich auf den Weg zu bringen.


Mit freundlichem Gruß

Lostriga


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