Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.05.2015, 00:07
Anton93 Anton93 вне форума
Прохожий
 
Регистрация: 20.02.2015
Сообщения: 27
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Различить вид регистра

Есть программа консольная, так сказать записывает нажатия клавиш. Проблема в том что все символы не зависимо от того как были введены, заглавные или нет пишутся как заглавные (верхнего региста). Как отличить и сделать чтобы выводились так как они вводятся.

Код:
 procedure LoggingKey; 
 var 
 X:integer; 
 begin 
 for X:=65 to 90 do 
      begin 
      if GetAsyncKeyState(X)=-32767 then 
        Write(Chr(X)); 
      end; 
 end; 

 var 
 mesg:tmsg; 
 begin 
 SetTimer(0, 0, 1, @LoggingKey); 
 While GetMessage(Mesg,0,0,0) do 
     begin 
      TranslateMessage(Mesg); 
      DispatchMessage(Mesg); 
     end; 
 end.

P.S. Или если возможно предложить другие вариант, отловить нажатия. Отлавливаю лишь буквы англ. и цифры. Заморочки с раскладкой других языков не интересует. Главное чтобы регистр был правильный и без dll.

Последний раз редактировалось Anton93, 23.05.2015 в 00:58.
Ответить с цитированием
  #2  
Старый 23.05.2015, 01:09
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Так у вас идёт отлов клавиш от A до Z ($41..$63). a..z = $61..$7A.
То есть:
Код:
for X:=65 to 122 do
begin
  if X in [65..90, 97..122] then 
    if GetAsyncKeyState(X)=-32767 then
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 23.05.2015 в 01:13.
Ответить с цитированием
  #3  
Старый 23.05.2015, 01:28
Anton93 Anton93 вне форума
Прохожий
 
Регистрация: 20.02.2015
Сообщения: 27
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Откопал такой код, методом хука. но проблема осталась та же.

Код:
type
  PKbdDllHookStrukt = ^TKbdDllHookStrukt;
  _KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: PDWORD;
  end;
  TKbdDllHookStrukt = _KBDLLHOOKSTRUCT;

const
  RPT_WPARAM_DATA = 'Keyboard message = %s ';
  RPT_LPARAM_DATA = 'scan code = %s [%d]';

var
  StrResult: String;


var
  Form1: TForm1;
  hHook: THandle;

implementation

{$R *.dfm}



function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
begin
  StrResult := '';
  if nCode = HC_ACTION then
    Result := CallNextHookEx(hHook, nCode, WParam, LParam);
  case WParam of
    WM_KEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYDOWN']);
    WM_KEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYUP']);
    WM_SYSKEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYDOWN']);
    WM_SYSKEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYUP']);
  end;
  StrResult := StrResult + Format(RPT_LPARAM_DATA, [Chr(PKbdDllHookStrukt(LParam)^.vkCode), PKbdDllHookStrukt(LParam)^.vkCode]);
  Form1.Memo1.Lines.Add(StrResult);
end;


procedure TForm1.FormCreate(Sender: TObject);
const
  WH_KEYBOARD_LL = 13;
begin
  hHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  if hHook = 0 then RaiseLastOSError;
end;

end.

Последний раз редактировалось Anton93, 23.05.2015 в 20:16.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025