Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Переключение раскладки клавиатуры  (Прочитано 13572 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« : 25-05-2008 11:29 » 

Бог в помощь!

У меня такой вопрос - как переключить раскладку клавиатуры по умолчанию на английскую? Порылся в MSDN, порылся в И-нете, нашел только это -

LoadKeyboardLayout("00000409", KLF_ACTIVATE);

Беда в том, при этом переключается раскладка только для программы, которая эту функцию вызывает. Мне же нужно своей программой запустить другую и там ввести пароль. Подскажите, люди добрые :о)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-05-2008 11:46 » 

CTAPOBEP, как сделать не подскажу, не знаю, а вопрос такой возник:

1) в другой программе пароль вводит человек ?
2) если не человека, то при чём тут раскладка ?
Записан

CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 25-05-2008 12:16 » 

Проблема иммено в том, что пароль нужно вводить вручную. Можно, конечно, пароль поменять на "русский", но все-таки мне кажется, что следует программу подгонять под себя, а не себя под программу.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 25-05-2008 14:01 » 

CTAPOBEP, тогда не парься - пусть человек сам думает, какая раскладка , нажат ли капслок и тд., на то оно и пароль Улыбаюсь
Записан

CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 26-05-2008 17:09 » 

Вляпался. Прямо в невозможное. Да что ж такое!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 26-05-2008 17:31 » 

CTAPOBEP, что такое ? )
Записан

CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 26-05-2008 18:15 » 

Не могу нигде найти, как переключить раскладку по умолчанию :ф)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 26-05-2008 18:34 » 

методом научного тыка нашёл вот чего :

HKEY_CURRENT_USER\Keyboard Layout\Preload

в каком порядке идут названия параметров, первый из них будет по умолчанию

только перезагрузка, видимо, портебуется...
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 26-05-2008 18:37 » 

Цитата
The LoadKeyboardLayout function loads a new input locale identifier (formerly called the keyboard layout) into the system. Several input locale identifiers can be loaded at a time, but only one per process is active at a time. Loading multiple input locale identifiers makes it possible to rapidly switch between them.

Syntax

HKL LoadKeyboardLayout(          LPCTSTR pwszKLID,
    UINT Flags
);
Parameters

pwszKLID
[in] Pointer to the buffer that specifies the name of the input locale identifier to load. This name is a string composed of the hexadecimal value of the Language Identifier (low word) and a device identifier (high word). For example, U.S. English has a language identifier of 0x0409, so the primary U.S. English layout is named "00000409". Variants of U.S. English layout (such as the Dvorak layout) are named "00010409", "00020409", and so on.
Flags
[in] Specifies how the input locale identifier is to be loaded. This parameter can be one of the following values.
KLF_ACTIVATE
If the specified input locale identifier is not already loaded, the function loads and activates the input locale identifier for the current thread.
KLF_NOTELLSHELL
Prevents a ShellProc hook procedure from receiving an HSHELL_LANGUAGE hook code when the new input locale identifier is loaded. This value is typically used when an application loads multiple input locale identifiers one after another. Applying this value to all but the last input locale identifier delays the shell's processing until all input locale identifiers have been added.
KLF_REORDER
Moves the specified input locale identifier to the head of the input locale identifier list, making that locale identifier the active locale identifier for the current thread. This value reorders the input locale identifier list even if KLF_ACTIVATE is not provided.
KLF_REPLACELANG
Windows 95/98/Me, Windows NT 4.0, and Windows 2000/XP:If the new input locale identifier has the same language identifier as a current input locale identifier, the new input locale identifier replaces the current one as the input locale identifier for that language. If this value is not provided and the input locale identifiers have the same language identifiers, the current input locale identifier is not replaced and the function returns NULL.
KLF_SUBSTITUTE_OK
Substitutes the specified input locale identifier with another locale preferred by the user. The system starts with this flag set, and it is recommended that your application always use this flag. The substitution occurs only if the registry key HKEY_CURRENT_USER\Keyboard\Layout\Substitutes explicitly defines a substitution locale. For example, if the key includes the value name "00000409" with value "00010409", loading the U.S. English layout ("00000409") causes the Dvorak U.S. English layout ("00010409") to be loaded instead. The system uses KLF_SUBSTITUTE_OK when booting, and it is recommended that all applications use this value when loading input locale identifiers to ensure that the user's preference is selected.
KLF_SETFORPROCESS
Windows 2000/XP:: This flag is valid only with KLF_ACTIVATE. Activates the specified input locale identifier for the entire process and sends the WM_INPUTLANGCHANGE message to the current thread's Focus or Active window. Typically, LoadKeyboardLayout activates an input locale identifier only for the current thread.
KLF_UNLOADPREVIOUS
This flag is unsupported. Use the UnloadKeyboardLayout function instead.


по моему, флаг KLF_SETFORPROCESS - это как раз то, что тебе надо, но не пробовал
Записан

CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 27-05-2008 07:16 » 

LoadKeyboardLayout("00000409", KLF_SETFORPROCESS) не проходит, шерсть на носу... Нашел такое полурешение - после запуска программы нажимаю ALT+SHIFT:

keybd_event( VK_SHIFT, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event( VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event( VK_SHIFT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event( VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

Насчет реестра - буду пробовать.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 27-05-2008 07:29 » 

Цитата
LoadKeyboardLayout("00000409", KLF_SETFORPROCESS) не проходит
пробуй по всякому, сдругими флагами (по смыслу, конечно). Я же не проверял Улыбаюсь И даже не делал ни разу так, я только предполагаю

Цитата
Нашел такое полурешение - после запуска программы нажимаю ALT+SHIFT:
а почему именно ALT+SHIFT ? Улыбаюсь Я вот, например, всегда настраиваю как Ctrl+Shift и не могу иначе. Это не решение. А кроме того - где гарантия, что переключишься именно на русскую ?
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 27-05-2008 08:24 » 

Ребят, ну хелп же читали. Эта ф-я позволяет загрузить кучу раскладок в систему, но выбрать ТОЛЬКО ОДНУ ДЛЯ ТЕКУЩЕГО ПРОЦЕССА.


CTAPOBEP, можешь пользоваться своим методом, только учти лёшкину поправку. Я думаю, систему можно спросить, какой комбинацией переключается клава. Ну и конечно надо опрашивать после переключения. Не однозначно, что а) уже не стоит нужный язык и б) в системе только два языка.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 27-05-2008 12:15 » 

Обобщенная версия:

/////////////////////////////////// Определяем клавиши, которыми переключается раскладка клавиатуры
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]
« Последнее редактирование: 26-08-2008 04:20 от CTAPOBEP » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines