Проблема с раскладкой клавиатуры

Тема в разделе "WASM.WIN32", создана пользователем s3dworld, 17 сен 2011.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго дня!

    При ловле сообщения WM_KEYDOWN передаю её WPARAM с LPARAM в функцию Key(). Вот как она выглядит:

    Код (Text):
    1. void Application::Key(WPARAM _wParam,LPARAM _lParam)
    2. {
    3.   wchar_t symbol=0;
    4.   HKL keyboardLayout=0;
    5.   BYTE keysState[256];
    6.  
    7.   switch(_wParam)
    8.   {
    9.     case VK_BACK:
    10.       if(strCommandLength>2) strCommandLength--;
    11.       break;
    12.  
    13.     case VK_ESCAPE:
    14.       strCommandLength=0;
    15.       break;
    16.  
    17.     default:
    18.       GetKeyboardState(keysState);
    19.       keyboardLayout=GetKeyboardLayout(0);
    20.       if(ToUnicodeEx(_wParam,_lParam,keysState,&symbol,1,0,keyboardLayout)!=1) return;
    21.       strCommand[strCommandLength]=symbol;
    22.       strCommandLength++;
    23.       break;
    24.   }
    25.  
    26.   Update();
    27. }
    И вот в чём собственно проблема. У меня в системе языком ввода по умолчанию является английский. Запускаю программу и не могу в ней изменить раскладку на русский язык (у меня он стоит в системе). В общем всё что я пишу выводится только на английском языке. А если изменить язык ввода по умолчанию на русский и запустить программу, то всё что пишу выводится на русском языке, однако нельзя переключиться на английский язык.

    Подскажите как решить проблему.

    Вообще, если честно, ситуация странная. Так как я использую Visual C++ 2010 Express, то мне приходится использовать сторонний редактор ресурсов (так как в Visual C++ 2010 Express его нет). Выбор пал на ResEd. В общем я сначала грешил на именно ресурсы, думал может что-то в них - выбросил их из проекта. Но тут ситуация вообще другая. При запуске программы окно у меня появляется тут же, а вот иконка на панели задач появляется не сразу. И собственно нормально она отображается тогда, когда я окно, например, перетащу. То есть такое ощущение, что окно будто не активно.

    В общем вот как я поступлю, я выложу скриншоты.

    Вот я только запускаю программу:

    [​IMG]

    Видите, у меня окно появилось, а на панели задач вообще ничего нет от него. Разумеется позже всё появится. Закрываю окно. Запускаю заново программу.

    [​IMG]

    Сейчас уже появилось окно на панели задач, но оно тусклое. И оно так и будет до тех пор, пока я мышкой по окну не поброжу (и то не сразу появится, а через какое-то время). А если мышкой не водить, то так и будет тусклым.

    [​IMG]

    Ну а это нормальное состояние. Почему так? У меня такая ерунда довольно часто бывает когда программы пишу.

    Уж не знаю из-за этого или нет, но раскладка клавиатуры переключается по странному. Она всё таки переключается, но по странной формуле. Я нажимаю Alt+Shift. Ну и через 5 секунд она может переключится. А может и не переключится.
     
  2. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    s3dworld
    можно проект целиком, потестить у себя? Или программу только.
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    DarkWanderer
    Можно. Усё))
     
  4. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Тема закрыта! Вместо:

    Код (Text):
    1. if(PeekMessage(&message,window,0,0,PM_REMOVE))
    2. {
    3.     TranslateMessage(&message);
    4.     DispatchMessage(&message);
    5. }
    Нужно было:

    Код (Text):
    1. if(PeekMessage(&message,0,0,0,PM_REMOVE))
    2. {
    3.     TranslateMessage(&message);
    4.     DispatchMessage(&message);
    5. }
     
  5. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    Мне кажется, слишком жадная обработка клавиатуры. Фукнция Key хапает все сообщения, даже tab пытается нарисовать.
    После запуска программы остается залипшим ctrl. Особо не тестил, код не вкусный -- windows .net like. И комментариев нет.
    С окном та же опера, по ощущениям. Все, мол, мое, сам нарисую, но не буду.
     
  6. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    DarkWanderer
    Ты не прав. Всё там нормально. Просто я не тот параметр сунул.
     
  7. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    Ну я не обновил перед ответом. Суть одна -- к обработке сообщений.
    А чего key такая жадная?
     
  8. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    DarkWanderer
    Она не жадная. Она вызывается только тогда, когда пришло сообщение WM_KEYDOWN, то есть тогда, когда пользователь нажимает клавишу на клавиатуре при активном окне. А раз это происходит, то я тут же должен проанализировать что за кнопку нажал пользователь и предпринять действие.
     
  9. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    а, ну пусть живет, чего уж.
    Что будет делать программа?
     
  10. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    DarkWanderer
    Пишу сервер для Flash-игры Марио. Второй программист пишет сам Марио на ActionScript 3.0 и редактор карт на Delphi.
     
  11. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    понятно.