2012-06-22 3 views
0

Я пытаюсь сделать простой текстовый редактор с winapi, его работаю для простой буквы, но не с заглавной буквой или клавишей смены.keybord input using Winapi

char keys[256]; 
int  x = 0; 
while (1) 
{ 
    for (x = 0; x <= 256; x++) 
    { 
     if (GetAsyncKeyState(x) == -32767) 
      { 
       char c[5]; 
       GetKeyboardState(keys); 
       ToAscii(x, MapVirtualKey(x, 0), keys, c, 0); 
       putchar(c[0]); 
      } 
     } 
} 

ответ

0

Try позвонить

GetKeyState(VK_CAPITAL); 

перед тем

GetKeyboardState(keys); 
+0

хорошо, это работает, можете ли вы объяснить мне почему? – gfauchart

+0

Объясняется [здесь] (http://www.gamedev.net/topic/484351-virtual-key-vs-ascii-key/) –

1

Поведение ввода с клавиатуры намного сложнее, чем вы думаете. Ваш метод не работает, потому что:

  1. GetAsyncKeyState может пропустить ключи. Что происходит, когда пользователь нажимает клавишу между вызовами?
  2. Что происходит, когда вы удерживаете клавишу? Как насчет повторения клавиатуры?
  3. Наиболее критически важно, что ваш код предполагает соотношение 1: 1 между ключом и символом. У вас нет механизма борьбы с такими комбинациями, как состояние блокировки/закрытия или мертвые ключи.

Было бы лучше, если бы вы попытались объяснить, что вы пытаетесь сделать, и вы можете получить совет по правильному пути к нему. Попытка переосмыслить поведение такого фундаментального устройства ввода вряд ли будет лучшим подходом.

+0

Я пытаюсь сделать текстовый редактор, как блокнот. Но вместо использования ToAscii я мог бы сделать свою собственную интерпретацию, такую ​​как VK_SHIFT + 0x41, сделать «A» ... но я буду отличаться от azerty и qwerty правильно? – gfauchart

+0

Вы должны использовать цикл сообщений и обрабатывать 'WM_CHAR', если вы пишете свой собственный редактор. 'TranslateMessage' генерирует это сообщение на основе активности клавиатуры; вы не должны пытаться заново изобрести это колесо. – tenfour

1

GetAsyncKeyState, скорее всего, не путь здесь: реальный способ сделать элемент управления типа текстовый редактор, чтобы вместо того, чтобы справиться с WM_KEYDOWN и WM_CHAR Сообщения. Windows отправит их на ваш WndProc, когда ваш HWND имеет фокус. Это метод, используемый элементами управления Windows EDIT и RichEdit.

Используйте WM_KEYDOWN для обработки несимметричных клавиш - например, стрелки (VK_LEFT, VK_RIGHT), вверх и так далее; и используйте текстовые символы WM_CHAR. WM_KEYDOWN сообщает вам, что клавиша нажата, используя значение VK_, и не учитывает состояние переключения; в то время как WM_CHAR принимает состояние сдвига, поэтому дает вам «A» или «a» или «1» против »! при необходимости. (Обратите внимание, что для этого вам нужно иметь TranslateMessage в вашей цепочке сообщений).

Сказав все это, еще проще и лучше сделать, просто использовать существующие элементы управления Windows EDIT или RichEdit и позволить им выполнять работа для вас - редко есть веская причина изобретать колесо - если вы не играете ради удовольствия и не изучаете Win32. Написание правильного текстового редактора довольно сложно; есть много неочевидных вещей, которые следует учитывать, особенно когда вы попадаете в текст без текста: вам нужно убедиться, что он работает правильно с текстом справа налево (арабский, иврит), работает с IME, которые используются для введите японские и китайские символы. И вы должны убедиться, что ваш контроль доступен для чтения с экрана, чтобы пользователи с нарушениями зрения все еще могли использовать элемент управления. EDIT и RichEdit делают все это за вас.

Фактическое приложение «Блокнот», например, является просто оберткой для элемента управления EDIT; в то время как WordPad просто обертывает элемент управления RichEdit; оба позволяют управлению выполнять всю тяжелую работу и просто добавляют дополнительные функции пользовательского интерфейса и сохранения файлов/загрузки сверху.

Смежные вопросы