AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi gettopwindow (0) funktioniert nicht richtig!
Thema durchsuchen
Ansicht
Themen-Optionen

gettopwindow (0) funktioniert nicht richtig!

Ein Thema von Arnulf · begonnen am 27. Mai 2005 · letzter Beitrag vom 28. Feb 2007
Antwort Antwort
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#1

gettopwindow (0) funktioniert nicht richtig!

  Alt 27. Mai 2005, 14:59
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: gettopwindow (0) funktioniert nicht richtig!

  Alt 31. Mai 2005, 18:09
Was ist DAS denn: zuerst Speicher auf 0 setzen und dann erst Speicher anfordern ??
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;
Andreas
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#3

Re: gettopwindow (0) funktioniert nicht richtig!

  Alt 1. Jun 2005, 11:14
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
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#4

Re: gettopwindow (0) funktioniert nicht richtig!

  Alt 1. Jun 2005, 12:07
Versuch mal GetForegroundWindow
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: gettopwindow (0) funktioniert nicht richtig!

  Alt 1. Jun 2005, 12:30
Bekommst du hier
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
SetParent(MyWindowHandle, DesktopHandle); gemacht?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#6

Re: gettopwindow (0) funktioniert nicht richtig!

  Alt 1. Jun 2005, 14:45
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
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#7

Re: gettopwindow (0) funktioniert nicht richtig!

  Alt 1. Jun 2005, 17:19
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
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#8

Re: gettopwindow (0) funktioniert nicht richtig!

  Alt 28. Feb 2007, 14:19
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz