2013-01-18 14 views
5

Odak noktası bir metin alanına girdiğinde bir bildirim oluşturmak için bir çözüm bulmaya çalışıyorum. Son hedef, ekran klavyelerinde, mobil cihazlarda gördüğünüz işlevsellik türünü yeniden oluşturmaktır. Şu an ile EVENT_OBJECT_FOCUS ve GetGUIThreadInfo ile GUI_CARETBLINKING ile keşfettim. DokümanlarWindows.h - Odaklama bir metin girdisi girdiğinde bildirim

: Bir nesne klavye odağı alan

EVENT_OBJECT_FOCUS. Sistem bu olay 'u aşağıdaki kullanıcı arabirimi öğeleri için gönderir: liste görünümü denetimi, menü çubuğu, açılır menü, geçiş penceresi, sekme denetimi, ağaç görünümü kontrolü ve pencere nesnesi.

GUI_CARETBLINKING Raşmin durumu. Bu bit kartuşu görünürse ayarlanır. Bu çözüm ile geldim bu yöntemleri kullanarak

:

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 
    } 


} 

Bu, bazı durumlarda ama onun kesinlikle güvenilir değildir çalışmak gibi görünüyor. Notepad bir IE gibi programlar iyi çalışıyor ama Firefox gibi diğerleri yok. Bu aynı zamanda web sitelerinde metin alanları gibi şeyler için işe yaramayacaktır çünkü handleEventObjectFocus aramayacaktır.

Bu soruna yaklaşmanın başka bir yolu bilen var mı? Etrafımı araştırıyordum ve Accessibility API'larında bir şey aramaya benziyor gibi görünmüyor, ancak üzerinde fazla bir şey yapamamıştım.

Teşekkürler!

netleştirmek için düzenleme, ben odak herhangi bir metin alanına girdiğinde bir bildirim almak için arıyorum. Bu uygulama bir win32 dll ve asla kendi kendine odaklanmayacak.

+1

Uyguladığınız çözüm, aldığı kadar güvenilir. Windows denetimleri için iyi çalışır, ancak herhangi bir özel denetim uygulaması için olmaz. Örneğin Firefox, Windows denetimlerini hiç kullanmayan, tüm mantığı uygulayan ve kendisini oluşturan GUI'sı için Qt kullanır. – IInspectable

cevap

1

Standart Windows denetimleri kullanıyorsanız, WM_SETFOCUS numaranızı yapmalısınız.

DÜZENLEME: Sistem geniş davranışı için SetWindowsHookEx'u inceleyebilirsiniz. Sistem genelinde olayları yakalamak için bir DLL içinde kullanmanız gerekir. WM_SETFOCUS'u yakalayan bir de dahil olmak üzere bir kanca kombinasyonu kullanabilirsiniz.

+2

-1 Değiştireceğiniz uygulamanın kaynak kodunu denetlerseniz bu çalışır. Bu soru, mevcut uygulamalar için metin girişini artırmaya yöneliktir. – IInspectable

+0

Üzgünüz, ancak daha sonra ilk soruda bunu daha açık hale getirmeniz gerekiyor, düzenlemeye bakın. – demorge

+0

teşekkürler @demorge, Tim haklıyım Global os hook'u arıyorum, asıl soruda bunu daha açık bir şekilde yapmaya çalıştım. İşten sonra bunu okuyacağım. Herhangi bir örnek var mı? SetWinHookEx belgelerinde – francis

0

EN_SETFOCUS bildirimini kullanarak bir metin alanına girişi yakalayabilirsiniz.

WM_FOCUS, içinde bulunan denetimler için değil, pencerenin kendisi içindir. Aksi takdirde, WM_FOCUS'u kullanmak isterseniz, EDIT alanınızı alt sınıfta tutmanız gerekir. Burada gerekli değil.

DÜZENLEME: sistem çapında bir davranış istediğinizi tamamen açık değildi. Bu durumda, yukarıdaki cevapta açıklandığı gibi bir kanca (cf. SetWindowsHookEx) kullanmanız gerekir. Afedersiniz.

+2

-1 Burada da aynısı geçerlidir, değiştireceğiniz uygulamanın kaynak kodunu denetlerseniz bu çalışır. Burada durum böyle değil, bu yüzden cevap değil. – IInspectable

1

Alternatif bir metin girişi yöntemi sağlamaya çalışıyorsanız, "IME" - "Giriş Yöntemi Düzenleyicisi" bölümüne bakmanız gerekir. Bunlar doğrudan işletim sistemi tarafından desteklenir.

+0

Örnek için bkz. [Bir Oyunda Giriş Yöntemi Düzenleyicisi Kullanma] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee419002.aspx). – IInspectable

+0

Teşekkürler, buna bakacağım. Ancak ben giriş ile çalışmıyorum. Bir metin girdisinin artık odağı olduğu uzak bir istemciye bildirmeye çalışıyorum. – francis