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