Sto cercando di trovare una soluzione per l'impostazione di una notifica quando il focus entra in un campo di testo. L'obiettivo finale è ricreare il tipo di funzionalità che vedi sui dispositivi mobili con tastiere su schermo.Windows.h - Notifica quando la messa a fuoco immette un input di testo
Finora ho esplorato SetWinEventHook
con EVENT_OBJECT_FOCUS
e GetGUIThreadInfo
con GUI_CARETBLINKING
.
Dalla documentazione:
EVENT_OBJECT_FOCUS
Un oggetto ha ricevuto il focus della tastiera. Il sistema invia questo evento per i seguenti elementi dell'interfaccia utente: controllo visualizzazione elenco, menu barra , menu a comparsa, finestra switch, controllo struttura a schede, controllo struttura ad albero e oggetto finestra .
GUI_CARETBLINKING Lo stato di lampeggiamento del cursore. Questo bit è impostato se il caret è visibile.
L'utilizzo di questi metodi che è venuta in mente questa soluzione:
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
}
}
Questo non sembra funzionare in alcuni casi, ma la sua sicuramente non affidabile. Programmi come Notepad e IE sembrano funzionare bene ma altri come Firefox no. Questo inoltre non funzionerà per cose come i campi di testo sui siti Web perché non sembra che venga chiamato handleEventObjectFocus
.
Qualcuno sa di un altro modo di affrontare questo problema? Ho cercato in giro e sembra che stia cercando qualcosa nelle API di accessibilità, ma non sono riuscito a scavare troppo su di esso.
Grazie!
modificare
Per chiarire, io sto cercando di ricevere una notifica quando entra attenzione qualsiasi campo di testo. Questa applicazione è una DLL win32 e non sarà mai focalizzata.
La soluzione implementata è affidabile quanto basta. Funziona bene per i controlli di Windows, ma non per qualsiasi implementazione di controllo personalizzato. Firefox, ad esempio, utilizza Qt per la sua GUI che non utilizza affatto i controlli di Windows, ma implementa invece tutta la logica e il rendering stesso. – IInspectable