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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2015, 00:05   #1
Anton931
Пользователь
 
Регистрация: 20.02.2015
Сообщений: 35
По умолчанию Различить вид регистра

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

Код:
 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.

Последний раз редактировалось Anton931; 23.05.2015 в 00:58.
Anton931 вне форума Ответить с цитированием
Старый 23.05.2015, 15:51   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А может дело не в бобине?
Изображения
Тип файла: png 7.png (53.6 Кб, 62 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 23.05.2015, 16:55   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Это потому что код клавиши не зависит от регистра
Цитата:
Сообщение от unit Winapi.Windows
{ Virtual Keys, Standard Set }
{$EXTERNALSYM VK_LBUTTON}
VK_LBUTTON = vkLButton; {1}
...
{$EXTERNALSYM VK_SNAPSHOT}
VK_SNAPSHOT = vkSnapShot; {44}
{$EXTERNALSYM VK_INSERT}
VK_INSERT = vkInsert; {45}
{$EXTERNALSYM VK_DELETE}
VK_DELETE = vkDelete; {46}
{$EXTERNALSYM VK_HELP}
VK_HELP = vkHelp; {47}
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }

{$EXTERNALSYM VK_LWIN}
VK_LWIN = vkLWin; {91}
{$EXTERNALSYM VK_RWIN}
VK_RWIN = vkRWin; {92}
...
Нужно самому проверять нажатие [Shift] и состояние [CapsLock].
Sibedir вне форума Ответить с цитированием
Старый 23.05.2015, 18:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
if GetAsyncKeyState(X)=-32767 then
А может лучше хук поставить клавиатурный? Оно то конечно и так логировать можно, но не оч. надежно...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.05.2015, 20:16   #5
Anton931
Пользователь
 
Регистрация: 20.02.2015
Сообщений: 35
По умолчанию

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

Код:
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.
Anton931 вне форума Ответить с цитированием
Старый 23.05.2015, 21:48   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Думаю твою проблему решит MapVirtualKeyEx
http://www.programmersforum.ru/showthread.php?t=24821
http://programmersforum.ru/showthrea...apVirtualKeyEx
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как различить текст кнопки Scooper C# (си шарп) 5 20.10.2011 15:55
Преобразовать все буквы нижнего регистра в буквы верхнего регистра druger Помощь студентам 5 18.09.2011 17:27
Указать минимальное количество первых букв, по которым можно различить слова из заданного списка. bingooo Паскаль, Turbo Pascal, PascalABC.NET 3 18.04.2010 19:27
Как различить 16-бит exe и 32? Alex Cones Операционные системы общие вопросы 14 10.03.2010 14:58
Как различить два процесса одного приложения? viter.alex Win Api 1 31.03.2009 21:01