![]() |
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:
Das hat auch gut funktioniert bei mir zu hause :) - aber sobals ich das auf die menschheit losgelassen hab, gabs chaos.
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; 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 |
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:
Ein lokale Variable hätt's doch auch getan:
ZeroMemory(@WPlacement,SizeOf(WPlacement));
GetMem(WPlacement,SizeOf(TWINDOWPLACEMENT)); WPlacement^.Length:=SizeOf(TWINDOWPLACEMENT); if GetWindowPlacement(WndHandle,WPlacement) then
Delphi-Quellcode:
var
WPlacement : TWINDOWPLACEMENT; begin WPlacement.Length =:SizeOf(TWINDOWPLACEMENT); if GetWindowPlacement(WndHandle, @WPlacement) then end; |
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 |
Re: gettopwindow (0) funktioniert nicht richtig!
Versuch mal GetForegroundWindow
|
Re: gettopwindow (0) funktioniert nicht richtig!
Bekommst du hier
Delphi-Quellcode:
überhaupt das Handle, was du suchst?
wndHandle := FindWindowEx(0 ,0 , GAMEWINDOWNAME, nil);
Zitat:
Delphi-Quellcode:
gemacht?
SetParent(MyWindowHandle, DesktopHandle);
|
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:
Zitat:
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 |
Re: gettopwindow (0) funktioniert nicht richtig!
um das verständlich zu machen was ich meine
ich habs jetzt so probiert:
Delphi-Quellcode:
ich gebe also jetzt immer beide fenster die ich vergleiche am bildschirm des spiels aus.
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)); hier das ergebniss wenn man wärend man im voll bild ist die auflösung wechselt: ![]() 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 |
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