2013-01-18 22 views
5

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.

+1

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

Odpowiedz

1

Jeśli korzystasz ze standardowych elementów sterujących systemu Windows, wykonaj jedną z poniższych czynności: WM_SETFOCUS. Nie ma potrzeby, aby uzyskać ochotę na zaczepianie itp.

EDYCJA: W celu zachowania całego systemu można sprawdzić SetWindowsHookEx. Aby wychwycić zdarzenia w całym systemie, musisz użyć go z poziomu biblioteki DLL. Możesz użyć kombinacji haków, w tym haczyka WM_SETFOCUS.

+2

-1 Działa to, jeśli kontrolujesz kod źródłowy aplikacji, którą zamierzasz zmodyfikować. To pytanie dotyczy zwiększenia wprowadzania tekstu dla istniejących aplikacji. – IInspectable

+0

Przepraszam, ale musisz to wyjaśnić w początkowym pytaniu, zobacz edycję. – demorge

+0

dzięki @demorge, Tim ma rację Szukam globalnego haka os, próbowałem to wyjaśnić w pierwotnym pytaniu. Przeczytam o tym po pracy. Czy masz jakieś przykłady? Nie widzę żadnych parametrów skupienia w dokumentach SetWinHookEx – francis

0

Możesz złapać wejście do pola tekstowego, korzystając z powiadomienia EN_SETFOCUS.

WM_FOCUS dotyczy samego okna, a nie kontrolek w nim zawartych. W przeciwnym razie, jeśli chcesz użyć WM_FOCUS, musisz podklasować pole EDIT. Tu nie jest konieczne.

EDYCJA: nie było całkowicie jasne, że chcesz zachować ogólnosystemowe zachowanie. W takim przypadku musisz użyć haka (por. SetWindowsHookEx), jak wyjaśniono w powyższej odpowiedzi. Przepraszam.

+2

-1 To samo dotyczy tutaj, działa to, jeśli kontrolujesz kod źródłowy aplikacji, którą zamierzasz zmodyfikować. Tak nie jest, więc odpowiedź nie jest. – IInspectable

1

Jeśli próbujesz podać alternatywną metodę wprowadzania tekstu, sprawdź "IME" - "Input Method Editor". Są one bezpośrednio obsługiwane przez system operacyjny.

+0

Dla przykładu zobacz [Korzystanie z edytora metod wprowadzania w grze] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee419002.aspx). – IInspectable

+0

Dzięki, przyjrzę się temu. Jednak nie pracuję z wprowadzeniem. Próbuję powiadomić klienta zdalnego, że obecnie wprowadzono wpis tekstowy. – francis

Powiązane problemy