Entwickler-Ecke

Windows API - WindowFromDC liefert 0 zurück, andere Möglichkeiten?


Quetzal90 - Do 01.07.10 00:45
Titel: WindowFromDC liefert 0 zurück, andere Möglichkeiten?
Hi

Ich habe einen Prozess gehookt, der mehrere Fenster hat in denen ich Abfange was geschrieben wird mittels DrawTextEx und ExtTextOut. Das klappt so weit, nur wie kann ich die Daten den jeweiligen Fenstern zuordnen?
Mein Versuch war mittels des DeviceContexts den die beiden Funktionen ja brauchen. Den krieg ich, nur wenn ich mit WindowFromDC das entsprechende Fenster suche gibt die Funktion 0 zurück. Gibt es eine andere Möglichkeit herauszufinden in welchem Fenster etwas geschrieben wurde? Die Funktionen geben auch die Koordinaten aus wo der Text geschrieben wird und zwar relativ zur oberen linken ecke des jeweiligen Fensters. Woher weiß die Funktion denn dann relativ zu welcher Fensterecke sie schreiben muss wenn das DC scheinbar nicht zu einem bestimmten Fenster gehört?

Bin für jeden Hinweis dankbar ;)
Quetzal


SAiBOT - Do 01.07.10 15:34

Ein DC inkludiert nicht immer ein Window!
Schau doch einfach mal ins MSDN: http://msdn.microsoft.com/en-us/library/dd144871%28v=VS.85%29.aspx


Quetzal90 - Do 01.07.10 23:59

Hi und Danke für die Antwort.

Ich hab WindowFromDC ja aus dem MSDN... und da steht auch dass es wenn es 0 zurückgibt kein window dazu hat.
Nur wie kann ich sonst auf das Fenster schließen? ExtTextout bezieht sich ja schließlich bei den Koordinaten auch genau auf die linke obere Ecke des Fensters. Irgendwo muss doch noch eine Verbindung sein?

Was gibt es sonst für Möglichkeiten?

Danke :)
Quetzal


SAiBOT - Fr 02.07.10 00:23

Wenn WindowFromDC Null liefert, gibt es kein Window => Keine Möglichkeit!


Quetzal90 - Fr 02.07.10 14:03

Ja schon klar, wenn man das so ganz eng sieht und die Fenster unbedingt direkt über das Handle identifizeren möchte..
Woher weiß ExtTextOut denn an welche stelle auf dem gesamten Bildschirm es schreiben muss, wenn es nur die Koordinaten relativ zur ecke des Fensters hat? gibts informationen über ein DC wo es sich befindet oder sowas?

Ansonsten unterscheiden sich die DCs die bei verschiedenen fenster gebraucht werden hab ich festgestellt, wenn ich jetzt erst eins öffne und zu einem bestimmten Text in meinem Hauptprogramm das/die DC speichere müsste ich alles mit DrawTextEx und ExtTextOut geschriebene doch eigentlich zuordnen können.. dann könnte man das nächste Fenster öffnen und wieder erst alle DCs speichern.. Nur so ne Idee, ich probiers mal ;)

schöne Grüße,
Quetzal


SAiBOT - Fr 02.07.10 16:15

user profile iconQuetzal90 hat folgendes geschrieben Zum zitierten Posting springen:
Ja schon klar, wenn man das so ganz eng sieht und die Fenster unbedingt direkt über das Handle identifizeren möchte..
Woher weiß ExtTextOut denn an welche stelle auf dem gesamten Bildschirm es schreiben muss, wenn es nur die Koordinaten relativ zur ecke des Fensters hat? gibts informationen über ein DC wo es sich befindet oder sowas?

Ja, der Viewport befindet sich im DC-Objekt. Steht doch alles bei MSDN :nixweiss:.
http://msdn.microsoft.com/en-us/library/aa932374.aspx

Hier eine Liste aller GDI Funktionen:
http://msdn.microsoft.com/en-us/library/aa923590.aspx

user profile iconQuetzal90 hat folgendes geschrieben Zum zitierten Posting springen:
Ansonsten unterscheiden sich die DCs die bei verschiedenen fenster gebraucht werden hab ich festgestellt, wenn ich jetzt erst eins öffne und zu einem bestimmten Text in meinem Hauptprogramm das/die DC speichere müsste ich alles mit DrawTextEx und ExtTextOut geschriebene doch eigentlich zuordnen können.. dann könnte man das nächste Fenster öffnen und wieder erst alle DCs speichern.. Nur so ne Idee, ich probiers mal ;)

schöne Grüße,
Quetzal

Du wolltest doch "Daten den jeweiligen Fenstern zuordnen"!?. Woher weisst du jetzt, welches Fenster zu welchem DC gehört?


Quetzal90 - Fr 02.07.10 17:39

Hi

Hmm da les ich ja schon die ganze zeit, aber bei GetViewportExtEx steht ja nur es gibt die breite und länge des DCs aus so wie ich das verstanden hab.. auch wenn es mir nur 1 und 1 ausgibt, was mich auch noch nicht weiterbringt.. clientToScreen hab ich auch schon probiert aber dazu braucht man ja das Handle und dich das DC..
Und von den ganzen anderen GDI Funktionen scheint keine Die Koordinaten des DCs zum gesamten Screen rauszurücken? hmm


Und zu der anderen Idee: Wenn ich z.b. eine bestimmte Ausgabe kenne, angenommen da steht "Anzahl=" irgendwo geschrieben, dann kann ich doch an die Hauptanwendung das DC schicken und das "Anzahl=" geschrieben wurde. dann öffne ich ein anderes Fenster und sende wieder das DC und "Anzahl=" und da jetzt das DC wohl ein anderes ist, weiß ich dass es vom zweiten fenster kommen muss.. war das etwas verständlicher?


SAiBOT - Sa 03.07.10 11:40

Wenn dir das elegant genug ist... könnte klappen. Was hast du genau vor? Willst du auf Spiele Ausgaben reagieren?


Quetzal90 - Sa 03.07.10 12:00

Es ist mir nicht wirklich elegant genug. Eigentlich find ichs blöd. Lieber wär mir eben direkt vom DC aus auf das Fenster schließen zu können. Aber ich komm irgendwie weder an das Handle noch an die Koordinaten..

Und zu dem was ich machen will:
Es gibt ja so Programme die beim Pokern helfen und übrigens legal sind. Die Statistik führen über mein Spiel und das der Gegner. Ich hab mich mal gefragt wie die an die Infos kommen und bastel gerade spaßeshalber sowas nach.

Danke für deine Hilfe,
Quetzal


SAiBOT - So 04.07.10 12:59

Vielleicht hast du ja Glück und die DC's werden direkt nach jedem Window geholt! Dh:

-CreateWindowEx hooken, Fensterhandle speichern
-GetDC hooken, hdc speichern

Wenn du dann folgendes Ergebnis bekommst,

Window 1
DC 1

Window 2
DC 2

dann kannst du möglicherweise damit arbeiten. Ansonsten fällt mir nur noch ein Debugger ein, der die GetDC Aufrufe auf die dazugehörige WndProc traced (Den Aufwand wäre es mir aber nicht wert :o).


elundril - So 04.07.10 16:34

user profile iconQuetzal90 hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab mich mal gefragt wie die an die Infos kommen und bastel gerade spaßeshalber sowas nach.

Danke für deine Hilfe,
Quetzal


aus dem speicher lesen war dir wohl zu umständlich?

lg elundril


SAiBOT - So 04.07.10 22:06

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
aus dem speicher lesen war dir wohl zu umständlich

Wie machst du sowas, ohne die zB. Pokersoftware zu reversen?


elundril - Mo 05.07.10 00:33

So wie hier [http://www.delphi-library.de/viewtopic.php?t=34077] würde ich das zum beispiel angehen.

lg elundril