Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение нажатия клавиши, Как отловить, какая нажата клавиша? 
:(
    Опции темы
Piton
  Дата 22.9.2003, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.8.2003

Репутация: нет
Всего: нет



Есть проблема! Надо отловить все нажатия клавиш пользователя и определить, какая именно клавиша нажата.
Под Windows все работает, но с DOS есть неувязки!
Я использую комманду GetAsyncKeyState, может есть другой путь решения?
PM MAIL   Вверх
oleg1973
Дата 22.9.2003, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



ну так GetAsyncKeyState это из виндосовского АПИ так что под досом не заработает 100%
используй какуюнить стандартную функцию как к примеру getchar() в Си
в паскале не знаю просто как


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
neutrino
Дата 22.9.2003, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Однозначно тебе нужно использовать Хук. Перехват всех событий в Windows (в том числе и событий от клавиатуры) выполняется с помощью вызова функции SetWindowsHook[Ex](). Данная функция регистрирует в системе Windows ловушку (hook) для определенного типа событий/сообщений. Ловушка - это пользовательская процедура, которая будет обрабатывать указанное событие.

Цитата

Var CountChars:Integer; //Количество выловленных символов
       Str:String; //Накопитель выловленых символов
       HookHandle: hHook; //Хранит значение предыдущего обработчика клавы, который был по умолчанию

//Объявление функции обработки нажатии клавиатуры
Function KeyboardProc(Code: integer; WParam: WParam; LParam: LParam): LResult; stdcall; //Обработчик событий от клавиатуры
  Type TWParamTranslation=Record
                           Byte12:Word;
                           Byte3:Byte;
                           Byte4:Byte;
                          End;

Begin
  If TWParamTranslation(LParam).Byte4 and 128<>0 Then //Отлавливается сообщение, в котором
                                                      //содержится символ
  Begin
   Inc(CountChars);
   Str:=Str+Chr(WParam);
  End;
  If Length(Str)>20 Then SendMessage(fMain.Handle,WM_Received,0,0); //Останавливаем перехват
                       //клавиатуры в случае, когда выловлено необходимое количество символов
End;


Procedure StartHook; //Начинает перехват событий от клавиатуры
Begin
   CountChars:=0;
   Str:='';
   HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, Hinstance, 0);
End;

Procedure StopHook; //Прекращает перехват событий от клавиатуры
Begin
  UnhookWindowsHookEx(HookHandle);
End;




--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
neutrino
Дата 22.9.2003, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Небольшое дополнение: можно вызвать прежний обработчик клавиатуры, вызвав функцию CallNextHookEx()

И еще, все объявления находятся тут: WinTypes, WinProcs;


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
oleg1973
Дата 22.9.2003, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



neutrino не будет оно в дос сессии ловить кнопочки
покрайне мере я делал не получилось
в виндосе все ловит прекрасно
просто вопрос так поставлен что его можно по разному понять еслиб Piton
уточнил что он имеет в виду под словом DOS (чистый дос, дос сессию (эмуляцию) в виндосе)
тогдаб можно было и по конкретней обьяснить


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
neutrino
Дата 22.9.2003, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Угу, в эмуляции запустить :etWindowsHook будет крайне тяжело.
smile.gif
А мой способ с Дос окном должен работать...


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
dm9
Дата 22.9.2003, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Если надо под чистым ДОСом, могу написать программу. (Ну, типа клавиатурный шпион). А под винду - хуки. Это уже написали.
PM MAIL ICQ   Вверх
cot
Дата 23.9.2003, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 4.6.2003

Репутация: нет
Всего: нет



Ловит нажатие любой клавиши в DOC, но это правдв чистый Паскаль
function ReadKeyWord:word;
var Regs:Registers;
begin
with Regs do begin
AH:=0;
intr($16,Regs);
ReadKeyWord:=AX
end
end;
Вообще ничего такого, чтобы не работало в Delphi здесь нет.

PM MAIL   Вверх
Akella
Дата 23.9.2003, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Сколько хуков я не перепробовал...
нормально работают только хуки в самой программе, т.е. в самом хуке, а отлавливать в во всей системе тяжело, это надо быть очень умным, у меня есть три или четыре примера и ни один нормально не работает.
PM MAIL   Вверх
dm9
Дата 23.9.2003, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



cot, боюсь что это не все клавиши.
С Shift-Ctrl-Alt, с xxxxLock, с PrintScreen, c Pause/Break работать не будет.
PM MAIL ICQ   Вверх
oleg1973
Дата 23.9.2003, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



dsergey
ну не знаю недавно написал кейлогер
все ловит окромя доссесии
обычный глобальный хук на клаву использовал


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Akella
Дата 23.9.2003, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



давай я пришлю свои, а ты посмотришь чего я на партачил, отпиши адрес, если ты не против.
А то я уже совсем замучился с этими хуками.
PM MAIL   Вверх
dm9
Дата 23.9.2003, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



dsergey, прочитай статью и посмотри прилагаемые к ней исходники.

http://www.delphimaster.ru/articles/hooks/index.html

Это уже классика жанра smile.gif
PM MAIL ICQ   Вверх
cot
Дата 24.9.2003, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 4.6.2003

Репутация: нет
Всего: нет



cot, боюсь что это не все клавиши.
Насчет клавиш не знаю по идее должно перехватывать все. Дело в другом в Делфи нет Паскалевого модуля Dos или WinDos , которые содержат запись Register
PM MAIL   Вверх
dm9
Дата 24.9.2003, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



cot, да не в этом дело. Это можно сделать на асме. Твоя функция:

Код
function ReadKeyWord : Word;
var R : Word;
begin
  asm
     mov ah,0
     int 16h
     mov R,AX
  end;
  Result := R;
end


Только это не даст тебе возможности ловить клавиши всех процессов. Не путай ДОС с многозадачной системой.
PM MAIL ICQ   Вверх
Piton
Дата 29.9.2003, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.8.2003

Репутация: нет
Всего: нет



Здравствуйте, извините, что долго не отвечал - болел и на работу не ходил!

Хочется чуть пояснить - нужна программа, отлавливающая в системе нажатия клавиш с буквами и цифрами, но проблема в том, что пользователь частенько сидит в редакторе под Norton Commander (в DOS сессии), и вот здесь я уже не могу что-либо отловить. Хуки тоже не срабатывают!

Цитата

Однозначно тебе нужно использовать Хук. Перехват всех событий в Windows (в том числе и событий от клавиатуры) выполняется с помощью вызова функции SetWindowsHook[Ex](). Данная функция регистрирует в системе Windows ловушку (hook) для определенного типа событий/сообщений. Ловушка - это пользовательская процедура, которая будет обрабатывать указанное событие.


Кстати, neutrino, как можно передать дальнейшую обработку системе событий, поступающих с клавы, т.к. после установки данного хука, клава "замолкает", а файлик растет!
PM MAIL   Вверх
oleg1973
Дата 29.9.2003, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



ну ты его ставиш с SetWindowsHookEx
а потом после получения кнопочки передаеш дальше с CallNextHookEx


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.