2013-01-18 12 views
5

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.

+1

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

risposta

1

Se stai usando i controlli standard di Windows, lo WM_SETFOCUS dovrebbe fare il trucco. Non è necessario essere fantasiosi con l'aggancio ecc.

MODIFICA: per il comportamento a livello di sistema è possibile controllare SetWindowsHookEx. Per catturare gli eventi in tutto il sistema è necessario utilizzarlo da una DLL. È possibile utilizzare una combinazione di hook incluso uno che cattura WM_SETFOCUS.

+2

-1 Funziona se si controlla il codice sorgente dell'applicazione che si intende modificare. Questa domanda riguarda l'aumento dell'inserimento di testo per le applicazioni esistenti. – IInspectable

+0

Scusa ma è necessario chiarirlo nella domanda iniziale, vedi modifica. – demorge

+0

grazie @demorge, Tim ha ragione, sto cercando un aggancio per il sistema operativo globale, ho cercato di renderlo più chiaro nella domanda originale. Leggerò su questo dopo il lavoro. Ti capita di avere qualche esempio? Non vedo alcun parametro di messa a fuoco nei documenti SetWinHookEx – francis

0

È possibile catturare l'ingresso in un campo di testo utilizzando la notifica EN_SETFOCUS.

WM_FOCUS è per la finestra stessa, non per i controlli che sono in essa. Altrimenti detto, se vuoi usare WM_FOCUS, dovrai sottoclassi il tuo campo EDIT. Non è necessario qui.

MODIFICA: non era completamente chiaro che si desiderava un comportamento a livello di sistema. In tal caso devi usare un hook (vedi SetWindowsHookEx) come spiegato nella risposta sopra. Scusate.

+2

-1 Lo stesso vale qui, questo funziona se si controlla il codice sorgente dell'applicazione che si intende modificare. Questo non è il caso qui, quindi la risposta non è. – IInspectable

1

Se si sta tentando di fornire un metodo di immissione testo alternativo, è necessario esaminare "IME" - "Input Method Editor". Questi sono direttamente supportati dal sistema operativo.

+0

Per un esempio, vedere [Utilizzo di un Method Editor di input in un gioco] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee419002.aspx). – IInspectable

+0

Grazie, esaminerò questo. Tuttavia non sto lavorando con l'input. Sto tentando di notificare a un client remoto che un input di testo ora ha il focus. – francis

Problemi correlati