Próbuję wymyślić rozwiązanie do konfigurowania powiadomienia, gdy fokus zostanie wprowadzony w polu tekstowym. Celem końcowym jest odtworzenie rodzaju funkcji wyświetlanych na urządzeniach mobilnych za pomocą klawiatur ekranowych.Windows.h - Powiadomienie, gdy fokus wprowadzi wpis tekstowy
Do tej pory odkryłem SetWinEventHook
z EVENT_OBJECT_FOCUS
i GetGUIThreadInfo
z GUI_CARETBLINKING
.
Od docs:
EVENT_OBJECT_FOCUS
Obiekt otrzymał skupienie klawiatury. System wysyła to zdarzenie dla następujących elementów interfejsu użytkownika: kontrola widoku listy, menu pasek, menu wyskakujące, okno przełączania, kontrolka tabulacji, kontrola widoku drzewa i obiekt okna .
GUI_CARETBLINING Stan migania kurtyny. Ten bit jest ustawiony, jeśli karetka jest widoczna.
Stosując te metody, jakie pojawią się z tego rozwiązania:
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
}
}
To nie wydają się działać w niektórych przypadkach, ale jest to z pewnością nie są wiarygodne. Programy takie jak Notepad i IE działają dobrze, ale inne, takie jak Firefox, nie działają. Nie działa to również w przypadku pól tekstowych na stronach internetowych, ponieważ nie wygląda na to, że zostanie wywołany handleEventObjectFocus
.
Czy ktoś wie o innym sposobie rozwiązania tego problemu? Szukałem w okolicy i wygląda na to, że mógłbym szukać czegoś w interfejsach API dostępności, ale nie byłem w stanie wykopać zbyt wiele na ten temat.
Dzięki!
edit
celu wyjaśnienia, szukam, aby otrzymać powiadomienie, gdy nacisk wchodzi dowolnego pola tekstowego. Ta aplikacja jest win32 dll i nigdy nie skupią się na sobie.
Zaimplementowane rozwiązanie jest tak niezawodne, jak to tylko możliwe. Działa dobrze w przypadku elementów sterujących systemu Windows, ale nie w przypadku niestandardowej implementacji sterowania. Firefox na przykład używa Qt do swojego GUI, który w ogóle nie korzysta z kontrolek Windows, ale raczej implementuje całą logikę i renderowanie. – IInspectable