Re: Программное переключение keyboard layout
От: sergeyt4  
Дата: 18.11.12 17:15
Оценка: 6 (1) -2
Здравствуйте, Michaels1, Вы писали:

M>2. Если tray-приложение 32-битный процесс, будут ли проблемы с установкой локального хука в 64-битный процесс?


Для ваших целей нет необходимости устанавливать хуки. Достаточно запустить обычный оконный таймер (WM_TIMER) с частотой примерно 10 раз/сек и воспользоваться тремя ф-циями:

GetGUIThreadInfo
GetWindowThreadProcessId
GetKeyboardLayout.

вот кусок из работающей программы, которая делает именно то, что вы описали: переключает раскладки, а когда переключается язык, отображает индикатор текущего языка.


    GUITHREADINFO gti;
    ZeroMemory(&gti, sizeof(GUITHREADINFO));
    gti.cbSize = sizeof(GUITHREADINFO);
    
    GetGUIThreadInfo(NULL, &gti);

    m_hWndActive = gti.hwndActive;
    m_hWndFocus = gti.hwndFocus;
    m_hWndCaret = gti.hwndCaret;

    m_dwProcessID = 0;
    m_dwThreadID = 0;

    HWND hwndActive = m_hWndCaret;
    if (!hwndActive) hwndActive = m_hWndFocus;
    if (!hwndActive) hwndActive = m_hWndActive;

    if (hwndActive)
        m_dwThreadID = ::GetWindowThreadProcessId(hwndActive, &m_dwProcessID);

    m_hKL = m_dwThreadID == NULL ? 0 : GetKeyboardLayout(m_dwThreadID);


Чем хорош обработчик на таймере — он отлавливает не только переключение раскладки в текущем окне, но и смену текущего окна. А т.к. в Windows каждое приложение имеет свою текущую раскладку (вернее, в каждом UI потоке одного приложения раскладка независима), то при смене окна может измениться раскладка.

Единственная проблема — этот код не срабатывает в консольных окнах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.