На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Как узнать имя клавиатуры для определенной раскладки?
    У меня установлено 2 языка — английский и русский. Русский имеет две клавиатуры — обычная и мнемоническая:

    user posted image

    Запускаю код:
    ExpandedWrap disabled
      UINT uLayouts;
      HKL  *lpList = NULL;
      wchar_t szBufLng[512], szBufCtry[512];
       
      uLayouts = GetKeyboardLayoutList(0, NULL);
      lpList   = (HKL*)LocalAlloc(LPTR, (uLayouts * sizeof(HKL)));
      uLayouts = GetKeyboardLayoutList(uLayouts, lpList);
       
      for(int i = 0; i < uLayouts; ++i)
      {
          GetLocaleInfo(MAKELCID(((UINT)lpList[i] & 0xffffffff),
          SORT_DEFAULT), LOCALE_SISO639LANGNAME, szBufLng, 512);
          GetLocaleInfo(MAKELCID(((UINT)lpList[i] & 0xffffffff),
          SORT_DEFAULT), LOCALE_SISO3166CTRYNAME, szBufCtry, 512);
          wprintf(L"%s-%s, %x\n", szBufLng, szBufCtry, (UINT)lpList[i]);
          memset(szBufLng, 0, 512);
          memset(szBufCtry, 0, 512);
      }
       
      if(lpList)
          LocalFree(lpList);

    И получаю такой результат:
    en-US, 04090409
    ru-RU, 04190419
    ru-RU, f0330419

    Подскажите, пожалуйста, как отличить мнемоническую клавиатуру или получить её название (Windows ведь её как-то отличил на снимке выше), чтобы получить что-то вроде этого:
    en-US, 04090409
    ru-RU, 04190419
    rum-RU, f0330419
    Сообщение отредактировано: ViH -
      В операционной системе Windows можно получить текущую раскладку клавиатуры и соответствующее ей имя клавиатуры с помощью функции GetKeyboardLayoutName. Эта функция возвращает строку с идентификатором раскладки, который можно использовать для получения имени клавиатуры с помощью функции GetKeyboardLayout.

      Пример кода на C++ для получения имени текущей клавиатуры:
      ExpandedWrap disabled
        #include <Windows.h>
        #include <iostream>
         
        int main() {
            // Получаем идентификатор текущей раскладки
            HKL currentLayout = GetKeyboardLayout(0);
            WCHAR layoutName[KL_NAMELENGTH];
            
            // Получаем имя клавиатуры
            if (GetKeyboardLayoutNameW(layoutName)) {
                // Выводим имя клавиатуры на консоль
                std::wcout << "Current keyboard layout: " << layoutName << std::endl;
            }
            
            return 0;
        }

      Этот код выводит имя текущей клавиатуры на консоль. Если вам нужно получить имя клавиатуры для определенной раскладки, то передайте соответствующий идентификатор раскладки в функцию GetKeyboardLayout.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0183 ]   [ 16 queries used ]   [ Generated: 28.03.24, 18:49 GMT ]