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_GETTEXTLENGTH und WM_GETTEXT unterstü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(&gti,0,sizeof(GUITHREADINFO));
    gti.cbSize = sizeof(GUITHREADINFO);
    if(!GetGUIThreadInfo(0,&gti))
    {
    	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 GetClassName den 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 wie EM_GETTEXTLENGTHEX nutzen.
    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


  • Mod

    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 AttachThreadInput und GetFocus hatte 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?


  • Mod

    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).aspx

    Das 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).


Anmelden zum Antworten