Раскладка клавиатуры для всех приложений
От: Gastello  
Дата: 27.03.09 12:14
Оценка:
Появилась необходимость установки текущей раскладки клавиатуры для всех приложений в Winodws XP/Vista. Тоисть когда я меняю в каком-то приложении,например при помощи клавиш альт + шифт, текущий язывк ввода с клавиатуры то он устанавливаеться только для активного приложения, и при переключении на другое приложение язык меняеться на тот который был сохранен для него или по умолчанию при старте нового. Мне же нужно одной комбинацией клавиш включить язык раскладки который будет активен для всех приложений.

Извините если офтопи. Подходящих форумов в гугле не нашел.
Re: Раскладка клавиатуры для всех приложений
От: Smarty Россия  
Дата: 02.06.09 15:42
Оценка:
Здравствуйте, Gastello, Вы писали:

G>Появилась необходимость установки текущей раскладки клавиатуры для всех приложений в Winodws XP/Vista. Тоисть когда я меняю в каком-то приложении,например при помощи клавиш альт + шифт, текущий язывк ввода с клавиатуры то он устанавливаеться только для активного приложения, и при переключении на другое приложение язык меняеться на тот который был сохранен для него или по умолчанию при старте нового. Мне же нужно одной комбинацией клавиш включить язык раскладки который будет активен для всех приложений.


G>Извините если офтопи. Подходящих форумов в гугле не нашел.


У Punto последнего есть пункт "Единая раскладка", вроде оно — переключение на всю систему. Если авто-переключение не нужно(как и мне) эта фича легко отключается, и переключение будет только по кнопке. За висту не скажу, а на Вин2008 — работает! Опять же работает с отключенным автопереключением. А ставят его обычно из-за него, не знаю зачем. В общем — помоему вариант?
Re: Раскладка клавиатуры для всех приложений
От: ole! США http://files.rsdn.org/4543/rsdn.gif
Дата: 05.06.09 18:04
Оценка:
Здравствуйте, Gastello, Вы писали:

G>Появилась необходимость установки текущей раскладки клавиатуры для всех приложений в Winodws XP/Vista. Тоисть когда я меняю в каком-то приложении,например при помощи клавиш альт + шифт, текущий язывк ввода с клавиатуры то он устанавливаеться только для активного приложения, и при переключении на другое приложение язык меняеться на тот который был сохранен для него или по умолчанию при старте нового. Мне же нужно одной комбинацией клавиш включить язык раскладки который будет активен для всех приложений.


G>Извините если офтопи. Подходящих форумов в гугле не нашел.


можно использовать keyboard hooks.
1. вот кусок из одной моей проги (сам пользую). он переключает layout по Caps Lock.
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0 || !g_bUseSwitcher)
        return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
    else
    {
        BOOL fEatKeystroke = FALSE;
        if (nCode == HC_ACTION) 
        {
            if(VK_CAPITAL == wParam)
            {
                if((lParam & (1 << 31)) == 0)
                {
                    if(g_numToSkip > 0)
                    {
                        --g_numToSkip;
                    }
                    else
                    {
                        ::ActivateKeyboardLayout((HKL)HKL_NEXT, KLF_SETFORPROCESS);
                    }
                }
                else
                {
                    SHORT state = ::GetKeyState(VK_CAPITAL);
                    if(state & 1)
                    {
                        g_numToSkip += 1;
                        INPUT input[2];
                        SecureZeroMemory(input, sizeof(input));
                        
                        input[0].type = INPUT_KEYBOARD;
                        input[0].ki.wVk = VK_CAPITAL;

                        input[1].type = INPUT_KEYBOARD;
                        input[1].ki.wVk = VK_CAPITAL;
                        input[1].ki.dwFlags = KEYEVENTF_KEYUP;
                        
                        ::SendInput(2, input, sizeof(INPUT));
                    }
                }
                //fEatKeystroke = TRUE;
            }
        }
        return(fEatKeystroke == TRUE ? 1 : ::CallNextHookEx(g_hHook, nCode, wParam, lParam));
    }
}


2. этот фрагмент работает для всех окон в сессии.
3. если добавить shared memory (с соотв. синхронизацией) и в ней хранить выбранную раскладку в текущем окне, то при переключении на другое окно (и даже в другом процессе) можно обнаружить разницу раскладок и сделать переключение на выбранную раскладку.
my $.02
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.