Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.16;
Скачать: CL | DM;

Вниз

Глобальный хук   Найти похожие ветки 

 
Cosmic ©   (2002-11-29 19:43) [0]

Кто-нибудь может поделиться НОРМАЛЬНЫМ кодом, отлавливающим все клавиши, нажатые в Винде и выводящим их коды, скажем в Мемо? Заранее сенкс :::)))


 
Song ©   (2002-11-29 19:46) [1]

WH_GETMESSAGE+WM_CHAR
Этого для программиста должно быть достаточно.


 
Cosmic ©   (2002-11-29 20:18) [2]

Для программиста - да, а для меня - нет. Я взял стандартный пример (тот, который с beep"ом в обработчике), а вот как вместо этого beep"а вывести букву, нажатую на клавиатуре - я без понятия. Пишу ShowMessage(chr(Msg.Wparam)) (теоретически должно работать) - выводит букву "д" при нажатии на ЛЮБУЮ клавишу.
Если можно - дай примерчик, плиз :)


 
Song ©   (2002-11-29 20:25) [3]

Примерчик в есть статье "Хуки. Аспекты реализации". Статья - в соответствующем разделе.
Как написать call-back ф-ию для WH_GETMESSAGE - в хэлпе по SetWindowsHookEx(). Т.е. делаем вывод: вам нужна статья (1), пример из неё (2) и переделать пример для WH_GETMESSAGE (3) руководствуясь хэлпом WinSDK или MSDN по SetWindowsHookEx() (4)
По-моему всё объяснил доступно.


 
Morfein ©   (2002-11-29 21:00) [4]

Вообще модальные окошки какие-либо показывать ОЧЕНЬ нежелательно
из callback-функции... система упасть может...


 
Cosmic ©   (2002-11-30 13:26) [5]

Ага. Я всё так и написал. И запустил. И нажал резет, т.к. всё к чертям повисло... :) Ну дайте примерчик...


 
Cosmic ©   (2002-11-30 21:33) [6]

To Song >
Тот примерчик не компилируется под Делфи 3 - ну никак. Пишет Invalid Stream Format. Что делать? Пробовал GetAsyncKeyState в таймере, но ведь это же извращение... ХОЧУ НОРМАЛЬНУЮ ЛОВУШКУ! Смысл - хочу написать игрушку с консолью, которая будет открываться при нажатии ~. Но игрушка будет использовать несколько приложений - поэтому нужно ставить глобальную ловушку. И не могу понять, как...


 
Morfein ©   (2002-11-30 21:51) [7]

2 Cosmic : вот те исходник... прога есть клавиатурный шпион под Win9x.
В обработчике нажатой клавиши была ещё запись в файл, но тебе она не нужна.
Работает без доп. DLL, но только под Win9x!
Если надо под NT, перетащи KeyboardHandler() в dll-ку, и поправь путь в LoadLibrary().


program Project1;

uses Windows, SysUtils;

var
P : TFnHookProc;
H : HHOOK;
Inst : THandle;

function KeyboardHandler(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
if code < 0 then
Result:=CallNextHookEx(WH_KEYBOARD, code, wParam, lParam);

if (lparam or KF_UP) = lparam then
exit;

// обработка нажатой клавиши
end;

exports KeyboardHandler;

begin
inst:=LoadLibrary(PCHAR(ParamStr(0)));
if Inst = 0 then
exit;

p:=TFnHookProc(GetProcAddress(Inst, "KeyboardHandler"));
h:=SetWindowsHookEx(WH_KEYBOARD, P, Inst, 0);

sleep(INFINITE);

UnhookWindowsHookEx(H);
FreeLibrary(Inst);
end.


 
Song ©   (2002-12-01 11:20) [8]

Без дополнительной dll будет работать в любой ОС, но ловить будет только сообщения приходящие от окон текущего процесса.
Глобальный хук устанавливается только с dll.

2Morfein © (30.11.02 21:51)
Если это локальная лоовушка, тогда последний параметр в SetWindowsHookEx() не может быть 0. Если это глобальная - нужна dll, в любой ОС.


 
TankMan ©   (2002-12-01 22:24) [9]

Он сам ехе шник и загружает как dll-ку(насколько я понял)... так что по идее должно работать...


 
Cosmic ©   (2002-12-01 23:04) [10]

РАБОТАЕТ! Оч-ч-чень оригинальная идея, никогда бы не додумался :) Спасибо!



Страницы: 1 вся ветка

Текущий архив: 2003.01.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
3-48948
ИБМ
2002-12-23 10:51
2003.01.16
Для каждого клента должен быть заказ


1-49134
Алексей П
2003-01-04 18:27
2003.01.16
Class TButton not found


4-49367
Serbor
2002-12-01 17:55
2003.01.16
Дата и время


14-49266
Дмитрий К.К.
2002-12-27 06:09
2003.01.16
Именинники 27 декабря


1-48992
ShelbiX
2003-01-06 23:41
2003.01.16
Фокус