![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Есть программа консольная, так сказать записывает нажатия клавиш. Проблема в том что все символы не зависимо от того как были введены, заглавные или нет пишутся как заглавные (верхнего региста). Как отличить и сделать чтобы выводились так как они вводятся.
Код:
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
|
||||
|
||||
|
Так у вас идёт отлов клавиш от 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Последний раз редактировалось angvelem, 23.05.2015 в 01:13. |
|
#3
|
|||
|
|||
|
Откопал такой код, методом хука. но проблема осталась та же.
Код:
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. |