Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
1-49031
LITTEL[MF]
2003-01-07 22:35
2003.01.16
Оформление winXP


3-48883
Chery
2002-12-20 10:27
2003.01.16
Установка SyBase


1-49123
Grab
2003-01-05 14:08
2003.01.16
Как вывести на печать активную форму приложения?


4-49360
ed30
2002-11-29 13:30
2003.01.16
Освобождение памяти после работы внешней программы


1-48988
Tornado
2003-01-06 18:07
2003.01.16
Меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский