Textfelder fremder Programme füllen!
-
Hallo,
kann mir jemand von euch sagen ob und/oder wie es möglich ist z.B. Textfelder fremder Programme zu füllen. Ich möchte nämlich eine Bildschirm-Tastatur für meinen CarPC (+ Touchscreen) entwickleln.
Kann man irgendwie herausfinden, ob bei einem aktiven Fenster ein Textfeld aktiv ist (d.h. wenn der Textcorsor angezeigt wird)? Und dann Tastendrücke an dieses schicken...THX!
Daniel
-
jep, ist möglich.
sendmessage mit WM_SETTEXT
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_settext.asp
fenster suchen
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/findwindow.asp
testen welche childfenster gerade den focus haben
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/findwindow.aspfenster suchen, child fenster suchen, focus abfragen mit einem timer wäre dieses möglich oder einem api hook, text senden
-
Du musst aber bedenken das du dabei nicht nur Textfelder findest, sondern auch andere Controls!
-
++++ schrieb:
Du musst aber bedenken das du dabei nicht nur Textfelder findest, sondern auch andere Controls!
deswegen focus abfragen und vergleichen

-
Es kann aber auch ein Button den Focus haben, das beschränkt sich nicht nur auf Textfelder.
-
++++ schrieb:
Es kann aber auch ein Button den Focus haben, das beschränkt sich nicht nur auf Textfelder.
habe gerade meinen ersten post nochmal gelesen und festgestellt das ich mehr gedacht als geschrieben habe.

mit child fenster suchen meinte ich natürlich das handle vom editfeld ermitteln.
-
Danke, das hat mich schon ein bisschen weiter gebracht.
Ich habe mir jetzt mit GetForegroundWindow das aktuelle Fenster geholt. Und kann einen Text hinsenden. Der schreibt den Text jetzt in die Titelzeile, aber das ist ja klar, da ich das Textfeld noch nicht habe und den Text direkt ans Fenster schicke.
Könntest du mir etwas genauer erklären, wie ich jetzt die aktuelle Komponente, die den Fokus hat bekommen und wie ich herausfinde, ob es ein Textfeld ist?
Daniel
-
du könntest alle fenster durchlaufen und testen welches ein edit control ist
bsp:
- findwindowex mit der edit class (dritter param)
oder
- alle fenster durchlaufen enumwindows und dann mit getwindowinfo feststellen ob es ein edit control istdu solltest vielleicht mal genauer beschreiben wie dein programm ablaufen soll.
-
Also es sollte ungefähr so ablaufen:
-
Wenn jemand mit der Maus auf ein Textfeld eines Programms (z.B. Navigationssystem) klickt, dann öffnet sich ein Fenster mit ner Tastatur.
Also das aktuell aktive Window bekomme ich mit GetForegroundWindow, dass weiss ich bereits. Ich weiss noch nicht, wie ich die MouseKlicks mitkriegen kann. -
Dann möchte brauche ich das Handle des Textfeldes. Vielleicht könnte ich es irgendwie über den Focus bekommen (Diesen müsste ja das Feld durch den Mausklick bekommen haben) oder über die Position des Mausklicks.
Ein Problem ist auch, dass es nicht unbedingt ein Textfeld sein musss, es könnte auch eine editierbare ComboBox oder eine TextArea sein. Also irgendein widget, in das man reinschreiben kann. -
Dann möchte ich den Text in dem editierbaren Feld ändern.
-
-
Cyjackz schrieb:
- Wenn jemand mit der Maus auf ein Textfeld eines Programms (z.B. Navigationssystem) klickt, dann öffnet sich ein Fenster mit ner Tastatur.
Also das aktuell aktive Window bekomme ich mit GetForegroundWindow, dass weiss ich bereits. Ich weiss noch nicht, wie ich die MouseKlicks mitkriegen kann.
nur mouseklicks abfangen lässt gur mit einem mouse hook, afaik steht in der faq etwas über hooks. evtl wäre vielleicht ein api hook (mir fällt gerade nicht die msg ein, aber du könntest mal mittels spy oder winspector nachschauen welche messages beim focuswechsel gesendet werden) etwas für dich.
Cyjackz schrieb:
- Dann möchte brauche ich das Handle des Textfeldes. Vielleicht könnte ich es irgendwie über den Focus bekommen (Diesen müsste ja das Feld durch den Mausklick bekommen haben) oder über die Position des Mausklicks.
Ein Problem ist auch, dass es nicht unbedingt ein Textfeld sein musss, es könnte auch eine editierbare ComboBox oder eine TextArea sein. Also irgendein widget, in das man reinschreiben kann.
dann ermitteln welches ctrl den focus hat
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/getguithreadinfo.asp
dann mittels dem handle infos über das ctrl bekommen
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/getwindowinfo.asp
windowinfo->atomWindowType vergleichen mit deinen vorgaben (edit, combo) etc.
und losschreiben
geht natürlich nicht mit benutzerdefinerten editfeldern.
- Wenn jemand mit der Maus auf ein Textfeld eines Programms (z.B. Navigationssystem) klickt, dann öffnet sich ein Fenster mit ner Tastatur.
-
Vielen Dank! Es klappt. Leider nicht ganz wie ich wollte. Wie du schon gesagt hast geht es nicht bei eigenen Editfeldern. Im Visual Studio füllt er z.B. die Felder aus, im Firefox jedoch nicht.
Ich habe dann mal SendInput getestet. Damit scheint es zu klappten.
Jetzt muss ich nur irgentwie den klick auf ein Textfeld registrieren können, aber ich glaube da liegt wieder das Problem, richtig? Gibt es nicht irgentwie eine möglichkeit herauszufinden ob ein Textcursor aktiv ist? Egal ob MFC, Java, qt oder sonst etwas?