Schnell (!) Pixel finden
-
Ich brauche nochmal hilfe !
Diesmal will mir wieder keine gute Lösung einfallen.Folgende Situation:
Ich suche ein Textfeld, in das ich klicken will, weil es bei 'Enter' nicht den Focus bekommt, aber:
1. Die Auflösung ist nicht immer Gleich.
2. Das Textfeld ist Semitransparent, und das auch noch stufenlos verstellbar.
3. Die Farbe der einzigen Fixpunkte sind nicht einzigartig.
(-> Muss auf Feld suchen)
a. Das Pixelfeld ist möglicherweise durch die Auflösung bedingt
4. Das Textfeld lässt sich verschieben.Screenshot:
http://c.imagehost.org/0146/Ausschnitt.jpg
Mir will nichts schnelles einfallen, dass nicht mehr als 2 sek dauern würde.
(Bildschirmpixel durchsuchen)
-
ist doch sicherlich immer an der gleichen Stelle auf dem Bildschirm oder? Dann kannste die ja die Position bei verschiedenen Auflösungen merken.
greetz KN4CK3R
-
[quote="Tim06TR"]4. Das Textfeld lässt sich verschieben.[quote]
Jetzt zitiere ich mich sogar selbst :0Evtl wäre ein vorher nachher test möglich (vor Enter & nach Enter)
Ich suche weiter Ideen, vielleicht wäre das in Rund um die Progammierung besser.
-
Tim06TR schrieb:
Ich suche ein Textfeld, in das ich klicken will, weil es bei 'Enter' nicht den Focus bekommt...
Wie ist das Textfeld definiert bzw. was ist es?
Auf ein Windows-Fenster (also auch ein zB. TEdit) lässt sich über das Handle zugreifen.
Sollte der blinkende Cursor nicht erkennbar sein, weil er normal schwarz ist, setze einen Cursor (Caret)
in anderer (invertierter) Farbe des Hintergrundes.
-
Auf ein Windows-Fenster (also auch ein zB. TEdit) lässt sich über das Handle zugreifen.
daran hab ich noch gar nicht gedacht.
Über FindWindow könnte ich das Handle des Programms bekommen, aber wie komme ich auf das Handle des Texteingabefeldes ?
-
EditName->Handle
-
Über EnumChildWindows.
Mit der dortigen Callback-Funktion EnumChildProc könntest du von aussen dieses Fenster-Handle finden und ansprechen.
-
steve_171 schrieb:
EditName->Handle
wenns nur mein Programm wär ...
kpeter schrieb:
Über EnumChildWindows.
Mit der dortigen Callback-Funktion EnumChildProc könntest du von aussen dieses Fenster-Handle finden und ansprechen.Gibts da den kein GetNextChild
Nein war nur ein Witz, Ich meld mich wieder, wenn der Code geschrieben wurde.
-
Ich muss zugeben, hätt ich mich nicht vorher mit EnumProcess beschäftigt....
Hier mein Wunderbar funktionierender Code, den ich nur noch so ändern muss,
dass ich weiß was das Textfeld ist:TStringList* Childs; int __stdcall EnumChilds(HWND Handle) { TRect Placement; GetWindowRect(Handle,&Placement); String Line = IntToStr((int)Handle) + " - " + IntToStr((int)Placement.Left) + " - " + IntToStr((int)Placement.Top) + " - " + IntToStr((int)Placement.Width()) + " - " + IntToStr((int)Placement.Height()); TCHAR RgWc[256]; unsigned int Length = 256; RealGetWindowClass(Handle,RgWc,Length); Line += " - "; Line += String(RgWc); Childs->Add(Line); } //... void __fastcall THEnum::Suche_FensterClick(TObject *Sender) { ChildList->Clear(); HWND Programmhandle; if (Handle_Caption->Text == "NULL" || Handle_Caption->Text.Length() < 1) Programmhandle = FindWindow(Klassenname->Text.c_str(),NULL); else if (Klassenname->Text == "NULL" || Klassenname->Text.Length() < 1) Programmhandle = FindWindow(NULL,Handle_Caption->Text.c_str()); else Programmhandle = FindWindow(Klassenname->Text.c_str(),Handle_Caption->Text.c_str()); if (Programmhandle != NULL) { DWORD lparam; Childs = new TStringList; EnumChildWindows(Programmhandle,(WNDENUMPROC) (EnumChilds),lparam); ChildList->Items = Childs; } } //---------------------------------------------------------------------------
EDIT: das war KEINE Frage
EDIT2: Eine Komponente im WinMedPlayer heißt ATL:131D5508
(Code angepasst, ist nach wie vor richtig)
-
ich glaube nicht, dass dich da WinAPI Funktionen großartig weiterbringen, da Textfelder im Spiel normalerweise nie die Windowstextfelder sind.
greetz KN4CK3R
-
ist mir auch schon aufgefallen...
Watt mach isch de nun ?
-
Da müsstest du ja schon ein Programm schreiben, welches das Bild analysiert und das Textfeld findet, etc. Das ist aber nicht so trivial und außerdem sehr langsam.
Schau doch nach, ob du nicht mit irgendeiner Tastenkombination in das Textfeld springen kannst. Dann bräuchte das Programm nur die Tastenkombination simulieren.
-
oftopic:
Ein interessanter Effekt tritt auf, wenn das Programm sich selbst scannt.
Es listet alles auf, alle Unterfenster.Da wurde die Liste sehr lang
-
einfacher wäre in deinem Fall wahrscheinlich die Chatfunktion zu finden und diese aufzurufen. Allerdings weiß ich nicht in wie weit du dich mit Reversing auskennst, denn einfach wird das nicht.
greetz KN4CK3R
-
KN4CK3R schrieb:
einfacher wäre in deinem Fall wahrscheinlich die Chatfunktion zu finden und diese aufzurufen. Allerdings weiß ich nicht in wie weit du dich mit Reversing auskennst, denn einfach wird das nicht.
greetz KN4CK3R
Reverse engeneering ? Hab ich mal versucht. (Ich hätte eine andere Wortwahl getroffen, wäre ich erfolgreich gewesen)
Aber vielleicht ist es ja an der Zeit dazuzulernenEDIT: ich grab dann mal wieder ollydbg aus
-
Wenn es wirklich nur um die Chatfunktion geht, so könntest du auch versuchen selber eine Verbindung zum Server zu erstellen. Das Protokoll sollte sich bei Text relativ einfach mit Wireshark ermitteln lassen. Hängt letztendlich davon ab, ob der Server eine Verbindung zulässt.
-
Hat sich wohl eh erledigt, da das Spiel bei benutzung des Progs abstürzt, aber überall anders gehts.
entweder ein Schuztz vor cheating (was gar nicht meine Absicht war) oder es kollidiert mit dem Keylogger des Spiels.