Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mo 19.11.07 18:27 
hallo,

als Vollbildanwendungen sollen nur Programme zählen, und nicht der Desktop (explorer.exe).

Weiß jemand wie ich das abfrage, ob der Desktop im Vordergrund ist?

Danke schon mal.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 19.11.07 18:43 
Das ganze geht so:

ausblenden Delphi-Quelltext
1:
2:
if FindWindow('Progman''Program Manager') = GetForegroundWindow then
  {Desktop ist im Vordergrund};


Du holst dir das Handle vom Desktop, und vergleichst es mit dem Vordergrund-Fenster.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mo 19.11.07 18:51 
danke, das hab ich schon ausprobiert, und das geht auch des öfteren, aber nicht immer...

Wenn ich Win+D drücke, um den Desktop anzuzeigen (oder den button in der taskleiste, mit der selben Funktion) dann funktioniert das ganze nicht.

Nur wenn ich mit der Maus den Desktop aktiviere funktioniert das ganze richtig.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Mo 19.11.07 20:31 
Ne schöne Idee habe ich nicht, dürfte aber gehen.

Geh einfach mal alle Fenster durch und vergleiche die Größe mit der Desktopgröße. Wenn ich dich richtig verstanden habe, ist es ja egal, wenn der Desktop nicht wirklich zu sehen ist. Dir scheint es ja nur darum zu gehen, ob ein Programm im Vollbildmodus ist,. Oder habe ich dich falsch verstanden?
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Di 20.11.07 11:37 
das prinzip von yugo stimmt glaub ich schon...

ich will wissen, wenn ein Fenster im Vollbild-Modus läuft, nur wenn der Desktop "den Fokus hat" soll es eben eine Ausnahme geben, weil der für mich keine Vollbild-Anwendung ist. Ich hoffe du verstehst mich richtig.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 20.11.07 15:13 
Die Frage ist wohl eher wie du überhaupt herausfindest ob ein fenster im Vollbild-Modus läuft. Dann musst du doch nur festlegen dass der Desktop nicht dazuzählt - ob er den Fokus hat oder nicht spielt dabei doch gar keine Rolle. Poste mal deinen Code zum herausfinden was Vollbild ist, dann können wir beim optimieren helfen.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Di 20.11.07 15:27 
ich bin schon weiter wie du vllt denkst Tilman:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var h: THandle;
    r: TRect;
begin
  h := GetForeGroundWindow;

  if h <> 0 then
  begin
    GetWindowRect(h,r);
    With r do
      if (r.Left <= 0and (r.Top <= 0and (r.Right >= Screen.Width) and (r.Bottom >= Screen.Height) then
        //fenster im vollbildmodus. Der Desktop ist hiernach auch eine Vollbildanwendung. Das soll er aber nicht sein.
        //if FindWindow('Progman', 'Program Manager') <> h then //funktioniert leider auch nur manchmal, siehe beitrag weiter oben

  end;
end;
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 20.11.07 15:39 
Dann würd ichs ungefähr so probieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var h: THandle;
    r: TRect;
begin
  h := GetForeGroundWindow;

  if ((h <> 0and (h <> getDesktopWindow)) then
  begin
    GetWindowRect(h,r);
    With r do
      if (r.Left <= 0and (r.Top <= 0and (r.Right >= Screen.Width) and (r.Bottom >= Screen.Height) then
        //fenster im vollbildmodus. Der Desktop ist hiernach auch eine Vollbildanwendung. Das soll er aber nicht sein.
        //if FindWindow('Progman', 'Program Manager') <> h then //funktioniert leider auch nur manchmal, siehe beitrag weiter oben

  end;
end;

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mi 21.11.07 18:02 
Genau das gleiche Problem wie in meinem zweiten Beitrag leider, Tilman
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mi 21.11.07 18:18 
Schon klar, aber so ganz versteh ich dein problem noch nicht. Beschreib doch mal ganz genau was du willst, evtl. noch etwas mehr code. Denn mit meinem Code erhältst du ja nie den Desktop - also unabhängig ob er den Fokus hat oder nicht.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Mi 21.11.07 18:37 
@Jakob Schöttl

Eigentlich ist das Ganze nicht schwer. Mit dem Code von Yogu kannst du schon mal testen ob ein Programm in Vordergrund ist und welches Handle es hat. Das ist Punkt 1 von 3. Mit dem Handle kannst du aber auch prüfen ob das Fenster maximiert ist ob das Fenster das aktive Fenster ist. Es sind also drei Prüfungen die du machen mußt.

_________________
Popov
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 22.11.07 14:21 
Ich weiß, dass es ganz einfach sein sollte.

Hier meine 3 Schritte:

1) GetForeGroundWindow -> ich will das handle des vordergrundfensters haben. Funktioniert
2) Nimmt Fenster ganzen Bildschirm ein? Größe des Fensters mit Screen. ... vergleichen.
3) Ist Vordergrundfenster = Desktop? wenn ja NICHTS MACHEN

Schritt 1) und 2) funktionieren Problem los, mit folgendem Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var h: THandle;
    r: TRect;
begin
  h := GetForeGroundWindow;

  if ((h <> 0then
  begin
    GetWindowRect(h,r);
    With r do
      if (r.Left <= 0and (r.Top <= 0and (r.Right >= Screen.Width) and (r.Bottom >= Screen.Height) then
        //fenster im vollbildmodus.
  end;
end;


Jetzt will ich nur noch eine Prüfung, die frägt, ob der Desktop = Vordergrundfenster ist. (Weil der Desktop soll nähmlich nicht als Vollbild-Anwendung zählen.)
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Do 22.11.07 14:30 
user profile iconJakob Schöttl hat folgendes geschrieben:
danke, das hab ich schon ausprobiert, und das geht auch des öfteren, aber nicht immer...

Wenn ich Win+D drücke, um den Desktop anzuzeigen (oder den button in der taskleiste, mit der selben Funktion) dann funktioniert das ganze nicht.

Nur wenn ich mit der Maus den Desktop aktiviere funktioniert das ganze richtig.



Mal doof gefragt: was passiert denn eigentlich genau, wenn es nicht klappt? Fällt die Vase vom Schrank? Neigt sich die Erdachse? Ich kann mir das noch nicht Bildhaft vorstellen :D

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 22.11.07 15:48 
Das Programm ist dafür da, um bei Vollbildanwendungen sprich Spielen den Skype-Onlinestatus auf "abwesend" zu schalten. Ist hald blöd, wenn der Desktop im vordergrund ist, und schon ist man "abwesend" bei Skype.
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 22.11.07 16:12 
Ach je, du machst es kompliziert. Ich hab dich drauf hingewiesen, daß du, da bereits das erste Problem mit einer API Funktion gelöst wurde, auch die anderen Probleme so lösen sollst. Stattdessen prüfst du es über Screen. Schon mal gehört, daß ein Fenster maximiert sein kann?

Hier paar API Funktionen. Hab selbst keine Beispiele für, sollten aber selbsterklärend sein:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
IsWindowEnabled(hWnd)
IsWindowVisible(hWnd) 
IsZoomed(hWnd)
IsWindow(hWnd)  
GetParent(hWnd)
GetActiveWindow
GetFocus 
GetWindow
GetDesktopWindow
GetWindowRect(aHwnd, aRec)


Hab so auf die schnelle aus der API Hilfe kopiert. Müßte was für dich darunter sein.

_________________
Popov
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Do 22.11.07 16:14 
Ich glaube ich verstehe dein Problem. Ich habe mir mal ein Programm geschrieben das mir immer das aktuelle Fokus-Fenster ausgibt, zusätzlich die Angabe ob es maximiert ist oder nicht. Ergebnis: wenn man Win+D drückt bekommt man nicht den Desktop (das war wahrscheinlich dein falscher Ansatz). Allerdings ist auch das kein Problem, denn das Fenster das man bekommt (es hat leider keinen Namen - vielleicht bekommt man gar keins?) ist ohnehin nicht maximiert. Wenn du also nur prüfst ob das Fenster maximiert ist, sollte es kein Problem sein. Übrigens scheint auch der Desktop selbst nicht maximiert zu sein.

ausblenden volle Höhe 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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  canv: Tcanvas;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  canv := TCanvas.Create;
  canv.Handle := getWindowDc(getDesktopWindow);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
  var
    wpl: WindowPlacement;
    p: Pchar;
    s: String;
    vollb: boolean;
begin
  p := strAlloc(1024);
  wpl.length := sizeof(wpl);

  getWindowText(getForeGroundWindow,p,1024);    // Wie heißt das Fenster


  getWindowPlacement(getForegroundWindow,@wpl);
  vollb := wpl.showCmd = SW_showmaximized;      // Vollbild?

  if vollb then s := p + ' Maximiert' else s := p + ' nicht Maximiert';

  canv.Brush.Color := clWhite;
  canv.TextOut(10,10,s);
end;
end.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 22.11.07 18:05 
mh, jetzt denkt er, kein fenster wäre vollbild, also auch nicht vollbild-foto-prästentation zB. und ob er es bei spielen richtig macht, weiß ich jetzt nicht
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Do 22.11.07 18:23 
Also zumindest bei der Bild-und-Faxanzeige von Windows funzt es bei mir, und bei anderen Programmen wie z.B. Delphi auch.

Du könntest ja mal z.B. mit
ausblenden Delphi-Quelltext
1:
2:
3:
  
windows.Beep(500,100);  // Wenn maximiert
windows.Beep(1000,100); // Wenn nicht mximiert

Einen Signalton ausgeben wenn das Fenster im Vordergrund Maximiert ist. So könntest du testen ob deine Spiele Maximieren oder nicht.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 22.11.07 18:28 
das mit dem signalton ist ne gute Idee. Probier ich gleich aus... danke schon mal zischendurch ;)
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 22.11.07 18:33 
also Spiele werden auch nicht mit SW_SHOWMAXIMIZED aufgerufen, liegt vllt an dem OpenGl oder DirectX.