2013-01-18 6 views
5

Ich versuche eine Lösung zum Einrichten einer Benachrichtigung zu finden, wenn der Fokus in ein Textfeld eingeht. Das Endziel ist die Wiederherstellung der Funktionalität, die auf Mobilgeräten mit Bildschirmtastaturen angezeigt wird.Windows.h - Benachrichtigung, wenn der Fokus eine Texteingabe eingibt

Bisher habe ich SetWinEventHook mit EVENT_OBJECT_FOCUS und GetGUIThreadInfo mit GUI_CARETBLINKING erkundet.

Aus der Dokumentation:

EVENT_OBJECT_FOCUS

Ein Objekt den Tastaturfokus erhalten hat. Das System sendet dieses Ereignis für die folgenden Benutzeroberflächenelemente: Listenansichts-Steuerelement, Menü Leiste, Kontextmenü, Schalterfenster, Registerkartensteuerung, Strukturansichtskontrolle und Fensterobjekt.

GUI_CARETBLINKING Der Status des Caret blinkt. Dieses Bit wird gesetzt, wenn das Caret sichtbar ist.

diese Methoden verwenden Ich habe mit dieser Lösung kommen:

void TextInputHelper::setupEventHook(FREContext iCtx) 
{ 
    ctx = iCtx; 
    CoInitialize(NULL); 

    evHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_END, NULL, 
    handleEventObjectFocus, 0, 0, 
    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

} 


void CALLBACK handleEventObjectFocus(HWINEVENTHOOK hook, DWORD evt, HWND hwnd, 
           LONG idObj, LONG idChild, DWORD thread, DWORD time) 
{ 
    GUITHREADINFO threadInfo; 
    threadInfo.cbSize = sizeof(GUITHREADINFO); 

    BOOL result = GetGUIThreadInfo(thread, &threadInfo); 


    if(threadInfo.flags & GUI_CARETBLINKING) 
    { 

     //text field focus 
    } 


} 

Dies scheint in einigen Fällen zu arbeiten, aber es ist auf jeden Fall nicht zuverlässig. Programme wie Notepad und IE scheinen gut zu funktionieren, andere wie Firefox nicht. Dies funktioniert auch nicht für Dinge wie Textfelder auf Websites, weil es nicht wie handleEventObjectFocus aufgerufen wird aufgerufen wird.

Kennt jemand eine andere Möglichkeit, dieses Problem anzugehen? Ich habe herumgesucht und es scheint, als ob ich nach etwas in den Accessibility-APIs suchen würde, aber ich konnte nicht viel dazu ausgraben.

Danke!

bearbeiten

Um zu klären, ich suche eine Benachrichtigung erhalten, wenn der Fokus jedes Textfeld eingibt. Diese Anwendung ist eine Win32-DLL und wird sich niemals selbst konzentrieren.

+1

Die von Ihnen implementierte Lösung ist ungefähr so ​​zuverlässig wie es geht. Es funktioniert gut für Windows-Steuerelemente, aber nicht für eine benutzerdefinierte Steuerelementimplementierung. Firefox zum Beispiel verwendet Qt für seine GUI, die überhaupt keine Windows-Steuerelemente verwendet, sondern vielmehr die gesamte Logik und das Rendering selbst implementiert. – IInspectable

Antwort

1

Wenn Sie Standard-Windows-Steuerelemente WM_SETFOCUS verwenden, sollten Sie den Trick tun. Keine Notwendigkeit, mit Einhaken usw. zu kommen.

BEARBEITEN: Für systemweites Verhalten können Sie SetWindowsHookEx auschecken. Um Ereignisse systemweit abzufangen, müssen Sie sie in einer DLL verwenden. Sie können eine Kombination von Hooks verwenden, einschließlich eines, der WM_SETFOCUS abfängt.

+2

-1 Dies funktioniert, wenn Sie den Quellcode der Anwendung steuern, die Sie ändern werden. Bei dieser Frage geht es um die Erweiterung der Texteingabe für vorhandene Anwendungen. – IInspectable

+0

Sorry, aber dann müssen Sie das in der ersten Frage klarer machen, siehe Bearbeiten. – demorge

+0

danke @demorge, Tim ist richtig Ich bin auf der Suche nach einem globalen Os Hook, ich habe versucht, das in der ursprünglichen Frage klarer zu machen. Ich werde das nach der Arbeit nachlesen. Hast du zufällig irgendwelche Beispiele? Ich sehe keine Fokusparameter in der SetWinHookEx-Dokumentation – francis

0

Sie können den Eingang in ein Textfeld mit der EN_SETFOCUS Benachrichtigung abfangen.

WM_FOCUS ist für das Fenster selbst, nicht für Steuerelemente, die darin enthalten sind. Anders gesagt, wenn Sie WM_FOCUS verwenden möchten, müssen Sie Ihr EDIT-Feld ableiten. Das ist hier nicht nötig.

EDIT: Es war nicht ganz klar, dass Sie ein systemweites Verhalten wollten. In diesem Fall müssen Sie einen Haken verwenden (vgl. SetWindowsHookEx), wie in der obigen Antwort erläutert. Es tut uns leid.

+2

-1 Dies gilt auch, wenn Sie den Quellcode der Anwendung steuern, die Sie ändern möchten. Dies ist hier nicht der Fall, also ist die Antwort nicht. – IInspectable

1

Wenn Sie versuchen, eine alternative Texteingabemethode anzugeben, sollten Sie in "IME" - "Eingabemethodeneditor" schauen. Diese werden direkt vom Betriebssystem unterstützt.

+0

Ein Beispiel finden Sie unter [Verwenden eines Eingabemethoden-Editors in einem Spiel] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee419002.aspx). – IInspectable

+0

Danke, ich werde das untersuchen. Ich arbeite jedoch nicht mit Eingaben. Ich versuche, einem Remote-Client mitzuteilen, dass eine Texteingabe jetzt den Fokus hat. – francis

Verwandte Themen