Autor |
Beitrag |
Jakob Schöttl
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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; |
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Mi 21.11.07 18:02
Genau das gleiche Problem wie in meinem zweiten Beitrag leider, Tilman
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: 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 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: 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.
_________________ Popov
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
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. |
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Do 22.11.07 18:33
also Spiele werden auch nicht mit SW_SHOWMAXIMIZED aufgerufen, liegt vllt an dem OpenGl oder DirectX.
|
|