Здравствуйте, Michaels1, Вы писали:
M>2. Если tray-приложение 32-битный процесс, будут ли проблемы с установкой локального хука в 64-битный процесс?
Для ваших целей нет необходимости устанавливать хуки. Достаточно запустить обычный оконный таймер (WM_TIMER) с частотой примерно 10 раз/сек и воспользоваться тремя ф-циями:
GetGUIThreadInfo
GetWindowThreadProcessId
GetKeyboardLayout.
вот кусок из работающей программы, которая делает именно то, что вы описали: переключает раскладки, а когда переключается язык, отображает индикатор текущего языка.
GUITHREADINFO gti;
ZeroMemory(>i, sizeof(GUITHREADINFO));
gti.cbSize = sizeof(GUITHREADINFO);
GetGUIThreadInfo(NULL, >i);
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 потоке одного приложения раскладка независима), то при смене окна может измениться раскладка.
Единственная проблема — этот код не срабатывает в консольных окнах.