Всем доброго дня! При ловле сообщения WM_KEYDOWN передаю её WPARAM с LPARAM в функцию Key(). Вот как она выглядит: Код (Text): void Application::Key(WPARAM _wParam,LPARAM _lParam) { wchar_t symbol=0; HKL keyboardLayout=0; BYTE keysState[256]; switch(_wParam) { case VK_BACK: if(strCommandLength>2) strCommandLength--; break; case VK_ESCAPE: strCommandLength=0; break; default: GetKeyboardState(keysState); keyboardLayout=GetKeyboardLayout(0); if(ToUnicodeEx(_wParam,_lParam,keysState,&symbol,1,0,keyboardLayout)!=1) return; strCommand[strCommandLength]=symbol; strCommandLength++; break; } Update(); } И вот в чём собственно проблема. У меня в системе языком ввода по умолчанию является английский. Запускаю программу и не могу в ней изменить раскладку на русский язык (у меня он стоит в системе). В общем всё что я пишу выводится только на английском языке. А если изменить язык ввода по умолчанию на русский и запустить программу, то всё что пишу выводится на русском языке, однако нельзя переключиться на английский язык. Подскажите как решить проблему. Вообще, если честно, ситуация странная. Так как я использую Visual C++ 2010 Express, то мне приходится использовать сторонний редактор ресурсов (так как в Visual C++ 2010 Express его нет). Выбор пал на ResEd. В общем я сначала грешил на именно ресурсы, думал может что-то в них - выбросил их из проекта. Но тут ситуация вообще другая. При запуске программы окно у меня появляется тут же, а вот иконка на панели задач появляется не сразу. И собственно нормально она отображается тогда, когда я окно, например, перетащу. То есть такое ощущение, что окно будто не активно. В общем вот как я поступлю, я выложу скриншоты. Вот я только запускаю программу: Видите, у меня окно появилось, а на панели задач вообще ничего нет от него. Разумеется позже всё появится. Закрываю окно. Запускаю заново программу. Сейчас уже появилось окно на панели задач, но оно тусклое. И оно так и будет до тех пор, пока я мышкой по окну не поброжу (и то не сразу появится, а через какое-то время). А если мышкой не водить, то так и будет тусклым. Ну а это нормальное состояние. Почему так? У меня такая ерунда довольно часто бывает когда программы пишу. Уж не знаю из-за этого или нет, но раскладка клавиатуры переключается по странному. Она всё таки переключается, но по странной формуле. Я нажимаю Alt+Shift. Ну и через 5 секунд она может переключится. А может и не переключится.
Тема закрыта! Вместо: Код (Text): if(PeekMessage(&message,window,0,0,PM_REMOVE)) { TranslateMessage(&message); DispatchMessage(&message); } Нужно было: Код (Text): if(PeekMessage(&message,0,0,0,PM_REMOVE)) { TranslateMessage(&message); DispatchMessage(&message); }
Мне кажется, слишком жадная обработка клавиатуры. Фукнция Key хапает все сообщения, даже tab пытается нарисовать. После запуска программы остается залипшим ctrl. Особо не тестил, код не вкусный -- windows .net like. И комментариев нет. С окном та же опера, по ощущениям. Все, мол, мое, сам нарисую, но не буду.
DarkWanderer Она не жадная. Она вызывается только тогда, когда пришло сообщение WM_KEYDOWN, то есть тогда, когда пользователь нажимает клавишу на клавиатуре при активном окне. А раз это происходит, то я тут же должен проанализировать что за кнопку нажал пользователь и предпринять действие.
DarkWanderer Пишу сервер для Flash-игры Марио. Второй программист пишет сам Марио на ActionScript 3.0 и редактор карт на Delphi.