Entwickler-Ecke
Windows API - Ist der Desktop im Vordergrund?
Jakob Schöttl - Mo 19.11.07 18:27
Titel: Ist der Desktop im Vordergrund?
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 - Mo 19.11.07 18:43
Das ganze geht so:
Delphi-Quelltext
1: 2:
| if FindWindow('Progman', 'Program Manager') = GetForegroundWindow then ; |
Du holst dir das Handle vom Desktop, und vergleichst es mit dem Vordergrund-Fenster.
Jakob Schöttl - 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 - 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 - 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 - 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.
Jakob Schöttl - Di 20.11.07 15:27
ich bin schon weiter wie du vllt denkst Tilman:
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 <= 0) and (r.Top <= 0) and (r.Right >= Screen.Width) and (r.Bottom >= Screen.Height) then end; end; |
Tilman - Di 20.11.07 15:39
Dann würd ichs ungefähr so probieren:
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) and (h <> getDesktopWindow)) then begin GetWindowRect(h,r); With r do if (r.Left <= 0) and (r.Top <= 0) and (r.Right >= Screen.Width) and (r.Bottom >= Screen.Height) then end; end; |
Tilman - 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.
Popov - 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.
Jakob Schöttl - 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:
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 <> 0) then begin GetWindowRect(h,r); With r do if (r.Left <= 0) and (r.Top <= 0) and (r.Right >= Screen.Width) and (r.Bottom >= Screen.Height) then 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 - Do 22.11.07 14:30
Jakob 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
Jakob Schöttl - 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 - 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:
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.
Tilman - 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.
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 public 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);
getWindowPlacement(getForegroundWindow,@wpl); vollb := wpl.showCmd = SW_showmaximized; if vollb then s := p + ' Maximiert' else s := p + ' nicht Maximiert';
canv.Brush.Color := clWhite; canv.TextOut(10,10,s); end; end. |
Jakob Schöttl - 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 - 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
Delphi-Quelltext
1: 2: 3:
| windows.Beep(500,100); windows.Beep(1000,100); |
Einen Signalton ausgeben wenn das Fenster im Vordergrund Maximiert ist. So könntest du testen ob deine Spiele Maximieren oder nicht.
Jakob Schöttl - 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 - Do 22.11.07 18:33
also Spiele werden auch nicht mit SW_SHOWMAXIMIZED aufgerufen, liegt vllt an dem OpenGl oder DirectX.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!