Тема: Zinc FAQ
Показать сообщение отдельно
Старый 27.11.2007, 23:35
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 6  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Программно изменить раскладку клавиатуры
Код:
// подключаем системную DLL user32.dll
var user32 = new mdm.DLL(mdm.System.Paths.windows + "\\system32\\user32.dll");
// создаем текстовые поля для отображения результатов
createTextField("out1", 1, 20, 20, 200, 20);
out1.type = "dynamic";
out1.border = true;
createTextField("out2", 2, 20, 50, 200, 200);
out2.type = "input";
out2.multiline = true;
out2.border = true;
//go-это стандаотная кнопка
go.onRelease = Go;
function Go() {
// формируем список параметров вызова функции ActivateKeyboardLayout
// в оригинале она выглядит так
//	HKL ActivateKeyboardLayout(
    HKL hkl,	// handle to keyboard layout
    UINT Flags 	// keyboard layout flags
   );
	var parameter1 = user32.addParameter("integer", "1");
	var parameter2 = user32.addParameter("integer", "8");
	var res = user32.call("boolean", "ActivateKeyboardLayout");
	out1.text = res;
	user32.clear();
}
Здесь вызывается API-функция ActivateKeyboardLayout(), которая, собственно и меняет раскладку.
Параметры берутся из справки WIN API
Еще о переключении раскладки.
Вот так можно обойтись без подключения системных DLL.
Код:
createTextField("test", 1, 20, 20, 200, 200);
test.type = "input";
test.border = true;
test.multiline = true;
test.wordWrap = true;
go.label = "EN";
// ищем хэндл окна
var wList = mdm.System.getWindowList();
var i = 0;
while (wList[i][0] != "form") {
	i++;
}
var hwnd = wList[i][1];
// начальное значение раскладки, это численное представление того, что раскладка EN
var kblName = 0x04190419;
// go-это стандартная кнопка
go.onRelease = function() {
// ставим принудительно EN
	mdm.System.postMessage(hwnd, 0x0050, 1, kblName);
	switch (kblName) {
	// меняем значение раскладки
	// при каждом нажатии кнопки
	case 0x04190419 :
		kblName = 0x04090409;
		go.label = "RU";
		break;
	case 0x04090409 :
		kblName = 0x04190419;
		go.label = "EN";
		break;
	}
};
В поле test можно проверять язык ввода.
form - Название формы приложения (form title). Окно самому себе шлет message - запрос на изменение раскладки WM_INPUTLANGCHANGEREQUEST( численное значение 0x0050) c параметром-значением раскладки.