Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2012, 13:11   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию wm_keydown

Здравствуйте. Обычно, для получения нажатой клавиши, я использовал параметр wParam.

Код:
WM_KEYDOWN:
if(wParam == VK_OEM_3)
...
Клавиша для открытия консоли, но когда меняю язык (Ctrl + Shift), то нажатие на тильду не выдает тот самый код, который необходим для открытия консоли. В исходниках Quake 3 Arena нашел, что для проверки нажатых клавиш используется вообще lParam. Printf("%d\n",lParam); показывает длинное число, и это число не меняется в зависимости от выбранной раскладки клавиатуры. Думаю это то, но как вывести нажатую клавишу из этого числа - не совсем понятно мне. Подскажите пожалуйста.
Артэс вне форума Ответить с цитированием
Старый 08.10.2012, 16:08   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
p51x вне форума Ответить с цитированием
Старый 08.10.2012, 17:02   #3
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Да читал я это, и на русском языке даже. Только значения не такие, как в справке, выводятся...

в исходниках нашел строку
Код:
modified = ( key >> 16 ) & 255; // где int key принимает значение от lParam
Поясните пожалуйста, что означают два знака >> и & после скобки?
Артэс вне форума Ответить с цитированием
Старый 08.10.2012, 23:40   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Если вы не знаете, что означают эти "два знака", то рано вы полезли в дебри.

Цитата:
Только значения не такие, как в справке, выводятся...
Может не стоит выдумывать? В справке написано:
Цитата:
16-23 The scan code. The value depends on the OEM.
p51x вне форума Ответить с цитированием
Старый 09.10.2012, 01:13   #5
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Цитата:
то рано вы полезли в дебри
Нет, не рано. По крайней мере теперь узнал.

Не совсем понимаю, что такое scan code, но узнав про >>, кажется понял. Оператор >> означает сдвиг вправо, а конкретно в примере, на 16 разрядов. Собственно в справке и шла речь о разрядах. Вообщем:

int key = (lParam >> 16) & 255;

Будет правильно возвращать номер клавиши независимо от раскладки или версии Виндовс?

Последний раз редактировалось Артэс; 09.10.2012 в 01:17.
Артэс вне форума Ответить с цитированием
Старый 09.10.2012, 08:10   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
что такое scan code
По факту это номер клавиши, который клавиатура посылает компу при нажатии клавиши. Эти коды отличаются от ASCII таблицы к примеру.
Цитата:
Будет правильно возвращать номер клавиши независимо от раскладки или версии Виндовс?
Не совсем. Будешь просто получать все в латинской раскладке в лучшем случае.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2012, 11:09   #7
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
По факту это номер клавиши, который клавиатура посылает компу при нажатии клавиши. Эти коды отличаются от ASCII таблицы к примеру.
Да, в Википедии видел. Вообщем, мне надо получать номер нажатой клавиши независимо от раскладки, а уже потом, своими функциями переведу в нужный символ.
Артэс вне форума Ответить с цитированием
Старый 09.10.2012, 22:20   #8
kovalev
 
Аватар для kovalev
 
Регистрация: 06.10.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Артэс Посмотреть сообщение
мне надо получать номер нажатой клавиши независимо от раскладки, а уже потом, своими функциями переведу в нужный символ.
Независимо от раскладки:



Код:
program Template;

uses
  Windows, Messages;

var
  wClass: TWndClass;
  Msg: TMsg;
  S1, S2: string;

function WindowProc(Win, Msg, WP, LP: Integer): Integer; stdcall;
begin
  case Msg of

    WM_KEYDOWN:
    begin
      Str(WP, S1);
      Str(LP, S2);
      SetWindowText(Win, PChar('wParam: ' + S1 + ',  lParam: ' + S2));
    end;

    WM_DESTROY:
      PostQuitMessage(0)

  end;
  Result := DefWindowProc(Win, Msg, WP, LP)
end;


BEGIN
  with wClass do
  begin
    lpszClassName:= 'asd';
    lpfnWndProc :=  @WindowProc;
    hbrBackground := 1;
    hCursor := LoadCursor(0, IDC_ARROW)
  end;
  RegisterClass(wClass);

  CreateWindow(wClass.lpszClassName, 'Заголовок программы',
    WS_OVERLAPPED or WS_SYSMENU or WS_MINIMIZEBOX or WS_VISIBLE,
    400, 300, 300, 50, 0, 0, hInstance, nil);


  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg)
  end;
END.
Или это не подходит?
kovalev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не срабатывает WM_KEYDOWN Sylvos Win Api 3 23.02.2012 04:02
SendMessage + WM_KEYDOWN fate Общие вопросы Delphi 6 28.01.2011 23:40
Как сразу после WM_KEYDOWN отправить WM_KEYUP ? Someb7 Win Api 2 17.10.2009 21:50
Обработка wm_keydown если на форме присутствует TFrame Oburec Компоненты Delphi 1 13.04.2009 10:01