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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2014, 21:17   #1
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию Скан-код клавиши и её виртуальный код.

Снова добрый вечер! По одному доброму совету модератора, копнул поглубже в сторону хука и создания DLL'ки. вот кусочек кода - функция, в которой определяется скан-код клавиши и успешно отсылается моей форме.
Код:
function KeyHook(code,WParam,LParam:DWORD):DWORD;stdcall;
var ServerWnd:THandle;
    ScanCode:Integer;
begin
   if(code=HC_ACTION)then if((LParam or(1 shl 30))=LParam)then
   begin
      ServerWnd:=FindWindow(nil,'EXFar');
      GetKeyboardState(KeybrdState);
      ScanCode:=(LParam shr 16)and $FF;
      if(ToASCII(WParam,ScanCode,KeybrdState,@Symbol,0)>0)then PostMessage(ServerWnd,WM_KEYEVENT,ord(Symbol[0]),LParam)
      else PostMessage(ServerWnd,WM_KEYEVENT,0,LParam);
   end;
   Result:=CallNextHookEx(HookHandle,code,WParam,LParam);
end;
на форме просто компонент Label, в котором и отображается принятое сообщение LParam:
Код:
procedure TForm1.KeyMessageHandler(var Msg:TMessage);
var KeyName:array[0..99]of Char;
begin
   //GetKeyNameText(Msg.LParam,KeyName,sizeof(KeyName));
   Label1.Caption:=IntToStr(Msg.LParam);
end;
И всё работает хорошо, НО не отлично.
Каким макаром извлечь из скан-кода виртуальный код клавиши, то есть получить не ИМЯ (поэтому и закомментировал строку GetKeyNameText()), а ВИРТУАЛЬНЫЙ КОД, скажем 13 (ENTER), 27(ESC), 32(SPACE)... и т.д.
пока что выводит вот такую жуть:
-1073610751 и похожие длинные числа. И почему МИНУС? это переполнение разряда или что?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace на форуме Ответить с цитированием
Старый 22.12.2014, 22:27   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

MapVirtualKeyEx
далее согласно этому видим:
знаковый бит от lParam ставится в том случае если кнопка отпущена.
дальше у вас итак wParam это код символа
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2014, 22:44   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

хм, точно. исправил строку
Код:
Label1.Caption:=IntToStr(Msg.LParam);
на
Код:
Label1.Caption:=IntToStr(Msg.WParam);
и вроде как заработало, но функциональные клавиши, CTRL, ALT, стрелочки не определяет. пишет код: 0.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace на форуме Ответить с цитированием
Старый 22.12.2014, 22:49   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

всё, исправил в DLL'ке!
Код:
      GetKeyboardState(KeybrdState);
      PostMessage(FindWindow(nil,'EXFar'),WM_KEYEVENT,WParam,0);
работает для всех клавиш.
Тема закрыта.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 22.12.2014 в 23:04.
NetSpace на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа выдающая скан-код клавиши... Studik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 02.03.2011 01:27
Скан-код клавиши с функцией 00h Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.12.2010 12:51
Скан-код нажатой клавиши в dec(десятичной системе) Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.11.2010 16:33
скан-код клавиши CraZZZy-GameRRR Общие вопросы Delphi 12 26.05.2010 13:44