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 gettopwindow (0) funktioniert nicht richtig! (https://www.delphipraxis.net/46576-gettopwindow-0-funktioniert-nicht-richtig.html)

Arnulf 27. Mai 2005 14:59


gettopwindow (0) funktioniert nicht richtig!
 
Hi
Mal wieder ich, mit einem problem, daß vermutlich noch nie jemand hatte :(...
Mir ist es wichtig, herauszufinden welches fenster gerade also oberstes angezeigt wird.
Z - order in dem sinn.
In der z - order liegen aber meißtens die tray icons - was mich jetzt nicht besonders stören würde, weil das im vollbild nicht der fall ist.
Und mir ist vollbild wichtig!

hier mal mein bisheriger code von dem ich dachte er funktioniert perfekt:
Delphi-Quellcode:
         wndHandle := FindWindowEx(0 ,0 , GAMEWINDOWNAME, nil);  //
            if wndHandle > 0
            then begin
                 ZeroMemory(@WPlacement,SizeOf(WPlacement));
                 GetMem(WPlacement,SizeOf(TWINDOWPLACEMENT));
                 WPlacement^.Length:=SizeOf(TWINDOWPLACEMENT);
                 if GetWindowPlacement(WndHandle,WPlacement)
                 then begin
                      WRect := WPlacement.rcNormalPosition;
                      if (WRect.Left = 0) and (WRect.Top = 0) and (WRect.Right = Screen.Width) and (WRect.Bottom = Screen.Height)
                      then begin
                           wnd := gettopwindow(0); // das hier funktioniert nicht richtig!!!
                           if (wnd <> wndHandle) then
                           begin
                                fMain.GameSay('AC: Overlay detected:' + GetProcessNameFromWnd(wnd));
                                CheatInfo := ('Radeon Bug Window Overlay' + GetProcessNameFromWnd(wnd));
                           end;
                           end;
                      end;
                 end;
Das hat auch gut funktioniert bei mir zu hause :) - aber sobals ich das auf die menschheit losgelassen hab, gabs chaos.
Wenn ich die Auflösung des Programms ändere, dann wird als top window explorer.exe ausgegeben.
Wärend des Auflösung wechselns hätte mich das nicht so verwundert, aber das bleibt.
Wenn das Programm in den normalen zustand zurückkehrt ( also full screen ) und damit an oberster stelle am desktop geht gettopwindow nicht mehr richtig.
Das funktioniert erst wieder, wenn man auf fenster modus schaltet und dann wieder auf full screen - dann stimmts wieder.
Kann sich jemand einen reim darauf machen.
Das macht mich ziemlich wahnsinnig, weil ich lange nach einer guten Lösung gesucht hab und jetzt wieder am Anfang steh :(.

Arnulf

shmia 31. Mai 2005 18:09

Re: gettopwindow (0) funktioniert nicht richtig!
 
Was ist DAS denn: zuerst Speicher auf 0 setzen und dann erst Speicher anfordern ?? :shock:
Das kann doch nicht gutgehen.
Delphi-Quellcode:
ZeroMemory(@WPlacement,SizeOf(WPlacement));
GetMem(WPlacement,SizeOf(TWINDOWPLACEMENT));
WPlacement^.Length:=SizeOf(TWINDOWPLACEMENT);
if GetWindowPlacement(WndHandle,WPlacement) then
Ein lokale Variable hätt's doch auch getan:
Delphi-Quellcode:
var
   WPlacement : TWINDOWPLACEMENT;
begin
   WPlacement.Length =:SizeOf(TWINDOWPLACEMENT);
   if GetWindowPlacement(WndHandle, @WPlacement) then
end;

Arnulf 1. Jun 2005 11:14

Re: gettopwindow (0) funktioniert nicht richtig!
 
hi
hm ... das würde vielleicht das problem mit dem placement beheben - möglicherweise.
ich überprüf damit ja nur ob das spiel im voll bild läuft oder nicht.
wenn vollbild dann:
gettopwindow(0);

das eigentliche problem ist ja, daß topwindow im vollbild manchmal nicht das spiel window zurückliefert sondern irgendwelche try icons oder eben explorer.exe (vor allem wenn man die auflösung ändert).
ich versuchs mal so wie du gesagt hast, aber ich glaub das wird das problem nicht beheben.

vielleicht funktioniert getwindow ja besser da kann ich ja soweit ich weiß mir alle toplevel topwindows anzeigen lassen.

wenns noch ideen gibt bitte posten
Danke
Arnulf

Vjay 1. Jun 2005 12:07

Re: gettopwindow (0) funktioniert nicht richtig!
 
Versuch mal GetForegroundWindow

Luckie 1. Jun 2005 12:30

Re: gettopwindow (0) funktioniert nicht richtig!
 
Bekommst du hier
Delphi-Quellcode:
wndHandle := FindWindowEx(0 ,0 , GAMEWINDOWNAME, nil);
überhaupt das Handle, was du suchst?
Zitat:

If hwndParent is NULL, the function uses the desktop window as the parent window. The function searches among windows that are child windows of the desktop.
Das sagt das PSDK zum ersten Parameter. Du suchst also auf dem Desktop nach einem Childfenster Namens GAMEWINDOWNAME. Ich bezweife aber starkt, dass dein Fenster den Desktop als Parent hat. Oder hast du irgendwo
Delphi-Quellcode:
SetParent(MyWindowHandle, DesktopHandle);
gemacht?

Arnulf 1. Jun 2005 14:45

Re: gettopwindow (0) funktioniert nicht richtig!
 
Also meines wissens ist jedes top window child vom desktop (mutter aller fenster :) ).

Es funktioniert ja gut - bevor ich das programm eingebaut hab in das projekt, ist mir der fehler ja nicht aufgefallen.
Zitat:

überhaupt das Handle, was du suchst?
ja das bekomm ich das ist eindeutig das fenster des spiels.

Zitat:

GetForegroundWindow
geht nicht, das hab ich als erstes probiert - getforgroundwindow gibt dir das window zurück das momentan den focus hat.

Also es funktioniert in vitro gut - aber in vivo gehts leider nicht.
Es wäre mir auch egal, wenn ich das problem nur hätte, wenn der user die auflösung ändert das würde ich schon hinbasteln.
Aber das nach dem auflösung ändern immer noch das falsche fenster handle kommt ist unverständlich.

Erst nachdem er in den fenstermodus und wieder in vollbild umgeschalten hat bekomm ich wieder das richtige handle zurück.

GetProcessNameFromWnd(wnd) ist ne funktion von mir und liefert mir den prozessnamen des fensters zurück - und da seh ich eindeutig welcher prozess zu dem fenster gehört - zumindest wenn getwindowthreadprocessid richtig funktioniert.
und es ist eindeutig im vollbild nicht das spiel fenster.

Gettopwindow(0) liefert das oberste fenster in der z order vom desktop - also das tatsächlich oberste fenster . - ganz oben ist aber üblicherweise die taskleiste mit den tray icons oder eben minimierte fenster - die bekommt man als erstes.
Wenn ein programm allerdings im vollbild ist - aso so daß die taskleiste nicht dargestellt wird, dann bekommt man auch hier das oberste fenster und das ist in dem fall dann das spiel.
Wenns nur richtig funktionieren würde!

toe

Arnulf 1. Jun 2005 17:19

Re: gettopwindow (0) funktioniert nicht richtig!
 
um das verständlich zu machen was ich meine
ich habs jetzt so probiert:

Delphi-Quellcode:
wnd := getwindow(wndHandle,GW_HWNDFIRST);
if (wnd <> wndHandle) then fMain.GameSay('AC: Overlay detected:' + GetProcessNameFromWnd(wnd) + ' wnd:' + GetProcessNameFromWnd (wndhandle));
else fMain.GameSay('AC: window is:' + GetProcessNameFromWnd(wnd) + ' wnd:' +GetProcessNameFromWnd(wndhandle));
ich gebe also jetzt immer beide fenster die ich vergleiche am bildschirm des spiels aus.
hier das ergebniss wenn man wärend man im voll bild ist die auflösung wechselt:

http://212.112.224.207/toe/scr3.JPG

man kann deutlich sehen, daß plötzlich das topwindow nicht mehr das spiel selbst ist sondern explorer.exe.
Das ist das gleiche problem das ich mit gettopwindow (0) hatte.
:(
Ist das zu verstehen oder einfach ein fehler von windows?

Arnulf

Arnulf 28. Feb 2007 14:19

Re: gettopwindow (0) funktioniert nicht richtig!
 
Darf ich nach einem Jahr pushen? :)

nein im ernst hab nie eine Lösung für das problem gefunden.
Hab doch eine api funktionen durchprobiert, aber nie hat mir eine immer das richtige Fenster zurück geliefert.

Arnulf


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz