Fokusiertes Control eines anderen Fensters finden
-
Hallo,
ich bastel gerade an einer Rechtschreibkorrektur für unsere ERP Software.
Die Anwendung läuft im Hintergrund und reagiert auf eine globale Tastenkombi.
Wenn diese gedrückt wird, brauche ich den Text aus dem Control in dem gerade der Cursor steht.
Weiß jemand wie ich an das fokusierte Control(es könnte eine TextBox sein) komme?
-
Bei einem Control, das
WM_GETTEXTLENGTHundWM_GETTEXTunterstützt, könnte es so aussehen:HWND hwndTLFocus = GetForegroundWindow(); // Top-Level if(!hwndTLFocus) { return 0; } DWORD dwID; if(!GetWindowThreadProcessId(hwndTLFocus,&dwID)) { return 0; } GUITHREADINFO gti; memset(>i,0,sizeof(GUITHREADINFO)); gti.cbSize = sizeof(GUITHREADINFO); if(!GetGUIThreadInfo(0,>i)) { return 0; } HWND hwndFocus = gti.hwndFocus; if(hwndFocus) { LONG_PTR Size = SendMessage(hwndFocus,WM_GETTEXTLENGTH,0,0)+1; if(Size==1) { return 0; } std::vector<char> v; try { v.resize(Size); } catch (std::bad_alloc&) { return 0; } if(!SendMessage(hwndFocus,WM_GETTEXT,dwSize,reinterpret_cast<LPARAM>(&v[0]))) return 0; // v sollte jetzt den Text enthalten }Ich habe es jetzt allerdings nur unter XP getestet. Man müsste allerdings noch per
GetClassNameden Namen herausfinden und passend darauf reagieren. Wie geschrieben, klappt es bei Controls wie "Edit" oder "ComboBox", bei anderen wie einem Rich Edit Control müsste man wahrwscheinlich Nachrichten wieEM_GETTEXTLENGTHEXnutzen.
Und Passwörter oder die besuchte Website im Browser auslesen klappt mit dieser Simpelmethode glücklicherweise auch nicht.Edit: Beim Internet Explorer klappt das Auslesen der Website natürlich
.
Edit 2: Size ist niemals 0
-
Ich würde mich mit AttachThreadInput an den anderen Thread anhängen und GetFocus ausführen... Dann hat man nicht nur das Top-Level Window, sondern evtl. wirklich das Edit Control.
Der Rest ähnlich wie Vicious Falcon es gemacht hat.
-
Mit
AttachThreadInputundGetFocushatte ich es zuerst probiert, klappte aber nicht zuverlässig. Es kann aber an einem Fehler meinserseits gelegen haben.
Gibt es eigentlich eine zuverlässige Möglichkeit, zu überprüfen, ob ein Prozess mit UNICODE oder MBCS arbeitet?
-
Vicious Falcon schrieb:
Gibt es eigentlich eine zuverlässige Möglichkeit, zu überprüfen, ob ein Prozess mit UNICODE oder MBCS arbeitet?
Nein! Warum auch. Ein Prozess kann das ja auch alles komplett gemischt machen...
Bei einem Fenster kann man zumindest feststellen ob es über ein Unicode oder MBCS Fenster verfügt.
IsWindowUnicode
http://msdn.microsoft.com/en-us/library/ms633529(VS.85).aspxDas Ganze wird aber extrem verfälscht durch Themes, die IMHO aus allen Fenstern Unicode Fenster machen. Deshalb unterstützt MS ja auch nur Themeing und Common Control 6.0 für Unicode Projekte!
-
Ah, danke :).
-
Hallo Jungs;-),
also ich habe den Code soweit umgesetzt...Ich muss die ganze Rotze immer nach C# portieren. Aber soweit funktioniert es wunderbar ABER...Ist die Sache mit dem
Ich würde mich mit AttachThreadInput an den anderen Thread anhängen und GetFocus ausführen... Dann hat man nicht nur das Top-Level Window, sondern evtl. wirklich das Edit Control.
noch aktuell? Dann würde ich das versuchen umzubauen(wenn keiner Quellcode liefern möchte:-P).