Обобщенная версия:
/////////////////////////////////// Определяем клавиши, которыми переключается раскладка клавиатуры
HKEY hKey;
if(RegOpenKeyEx(HKEY_CURRENT_USER, "Keyboard Layout\\Toggle", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
unsigned char Data[]={0x00, 0x00, 0x00};
DWORD cbData=sizeof(Data);
RegQueryValueEx(hKey, "Language Hotkey", 0, NULL, Data, &cbData);
RegCloseKey(hKey);
int KEYBLAY=VK_MENU;
//if(strcmp((char*)Data, "1")) KEYBLAY=VK_MENU; // Alt+Shift
if(strcmp((char*)Data, "2") == 0) KEYBLAY=VK_CONTROL; // Ctrl+Shift
/////////////////////////////////////////////////////////////////////////// Нажимаем эти клавиши
keybd_event( VK_SHIFT, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event( KEYBLAY, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event( VK_SHIFT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event( KEYBLAY, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
Осталось выяснить, как определить, какая раскладка включена для известного hProcess...
Подтверждаю, все изменения в реестре вступают в силу только после перезагрузки. Однако! Windows каким-то образом может форсировать изменения, которые сама вносит. Интересно, как?
Добавлено через 90 дней, 16 часов, 4 минуты и 59 секунд:Как выяснилось, keybd_event неуверенно работает под Windows XP. Даже если на разных компьютерах операционная система установлена (редкостное стечение обстоятельств !) с одного диска, на одном переключение работает, на другом - нет.
Для исправления вышеизложенного слеваподписавшийся породил нижеследущее. Во избежание.
#include <WinAble.h>
#ifndef KEYEVENTF_SCANCODE
#define KEYEVENTF_SCANCODE 0x0008
#endif
#define MAKE_SCANCODE_ESC 0x01
#define MAKE_SCANCODE_ENTER 0x1C
#define MAKE_SCANCODE_CTRL_LEFT 0x1D
#define MAKE_SCANCODE_SHIFT_LEFT 0x2A
#define MAKE_SCANCODE_ALT_LEFT 0x38
/////////////////////////////////// Определяем клавиши, которыми переключается раскладка клавиатуры
HKEY hKey;
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Keyboard Layout\\Toggle", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
unsigned char Data[]={0x00, 0x00, 0x00};
DWORD cbData = sizeof(Data);
RegQueryValueEx(hKey, "Language Hotkey", 0, NULL, Data, &cbData);
RegCloseKey(hKey);
unsigned int KEYBLAY = MAKE_SCANCODE_ALT_LEFT;
// if(strcmp((char*)Data, "1")) KEYBLAY=MAKE_SCANCODE_ALT_LEFT; // Alt+Shift
if (strcmp((char*)Data, "2") == 0) KEYBLAY = MAKE_SCANCODE_CTRL_LEFT; // Ctrl+Shift
/////////////////////////////////////////////////////////////////////////// Нажимаем эти клавиши
INPUT input[1];
::ZeroMemory(input, sizeof(input));
input[0].type = INPUT_KEYBOARD;
input[0].ki.wScan = KEYBLAY;
input[0].ki.dwFlags = KEYEVENTF_SCANCODE;
SendInput(1, input, sizeof(INPUT));
Sleep(10);
input[0].ki.wScan = MAKE_SCANCODE_SHIFT_LEFT;
input[0].ki.dwFlags = KEYEVENTF_SCANCODE;
SendInput(1, input, sizeof(INPUT));
Sleep(10);
input[0].ki.wScan = KEYBLAY;
input[0].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
SendInput(1, input, sizeof(INPUT));
Sleep(10);
input[0].ki.wScan = MAKE_SCANCODE_SHIFT_LEFT;
input[0].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
SendInput(1, input, sizeof(INPUT));
Sleep(10);
}
[\code]