Форум: "WinAPI";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
ВнизHook на нажатие клавиш Найти похожие ветки
← →
Хинт © (2005-10-26 15:49) [0]Возможно ли реализовать подобное без DLL? Насколько я знаю - нет (единственное решение - GetKeyState, но это ооочень не удобно).
← →
Leonid Troyanovsky © (2005-10-26 15:53) [1]
> Хинт © (26.10.05 15:49)
> Возможно ли реализовать подобное без DLL? Насколько я знаю
WH_KEYBOARD_LL
--
Regards, LVT.
← →
hamster © (2005-10-26 18:24) [2]
> Насколько я знаю - нет
Кстати,меня всегда интересовало - а почему нет?
← →
fellix (2005-10-26 18:33) [3]Экспериментировал когда-то: DLL-ка требуется под Win9x, а под 2К можешь встроить хук в EXE-шник (не забудь только функцию экспортировать).
← →
hamster © (2005-10-26 18:59) [4]
> fellix (26.10.05 18:33) [3]
Кхм... да... А не подскажете как это сделать?
И еще, пишу:procedure WHKey(var Msg:TWMKey); message WH_KEYBOARD_LL;
Я правильно делаю? Почему-то на WH_KEYBOARD_LL компилятор ругается - undeclaired identifer. Что надо подключить?
← →
fellix (2005-10-26 19:26) [5]Литературы с примерами множество. И на этом сайте в т.ч.
Или посмотрите в MSDN.
WinUser.h
---------
#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL 13
#define WH_MOUSE_LL 14
#endif // (_WIN32_WINNT >= 0x0400)
← →
fellix (2005-10-26 19:31) [6]http://groups.google.com/group/fido7.ru.delphi.chainik/msg/ba088c4f6ad9649f
← →
Fay © (2005-10-26 19:58) [7]>> procedure WHKey(var Msg:TWMKey); message WH_KEYBOARD_LL
LOL!
8)
← →
programania © (2005-10-26 20:15) [8]
TForm1 = class(TForm)
.....
procedure WMHotkey(var a:TWMHotkey); message WM_HOTKEY;
....
end;
....
RegisterHotKey(form1.handle,29,MOD_CONTROL,37);//ctrl+Лево
.....
procedure TForm1.WMHotkey(var a:TWMHotkey);
......
unRegisterHotKey(unRegisterHotKey(form1.handle,29);
.....
← →
Fay © (2005-10-27 00:36) [9]2 Leonid Troyanovsky © (26.10.05 15:53) [1]
Хук WH_KEYBOARD_LL есть global only.
Из этого, как я понимаю, следует, что условие "реализовать подобное без DLL" не очень выполнимо. Так ведь?
← →
ShiFT (2005-10-27 06:26) [10]
> Хук WH_KEYBOARD_LL есть global only.
> Из этого, как я понимаю, следует, что условие "реализовать
> подобное без DLL" не очень выполнимо. Так ведь?
Вот как раз ЭТОТ хук, можно спокойно реализовывать в EXE.
LT> Установка системных WH_KEYBOARD_LL и WH_MOUSE_LL, т.е. хуков низкого
LT> уровня, не требуют библиотеки.
← →
Leonid Troyanovsky © (2005-10-27 11:13) [11]
> Fay © (27.10.05 00:36) [9]
> Из этого, как я понимаю, следует, что условие "реализовать
> подобное без DLL" не очень выполнимо. Так ведь?
msdn: LowLevelKeyboardProc Function, Remarks:
This hook is called in the context of the thread that installed it.
И, сл-но, dll не обязательна.
--
Regards, LVT.
← →
Fay © (2005-10-27 13:55) [12]2 Leonid Troyanovsky © (27.10.05 11:13) [11]
Если Вас не затруднит, объясните, каким образом фраза "This hook is called in the context of the thread that installed it" доказывает утверждение "И, сл-но, dll не обязательна".
Я не очень силён в американском языке, т.о. буду очень рад услышать буквальный перевод.
← →
ShiFT (2005-10-27 14:28) [13]
> Fay © (27.10.05 13:55) [12]
http://rsdn.ru/article/controls/WinHotkeyCtrl.xml (в одном из примечаний нашёл)
Как написано в документации PlatformSDK, большинство глобальных системных хуков должны обязательно находиться в динамически подключаемой библиотеке DLL. При этом DLL подгружается в адресное пространство процесса производящего какое-либо «отлавливаемое» действие (например, посылку сообщений окну в случае WH_GETMESSAGE).
Всё вышесказанное не относится к так называемым RAW INPUT хукам (WH_KEYBOARD_LL и WH_MOUSE_LL), появившимся в Windows NT 4.0 SP3. Их фильтрующая функция вызывается в том же потоке, который установил хук, методом посылки сообщения этому потоку. Таким образом, фильтрующая функция RAW INPUT хука может находиться и в EXE, а SetWindowsHookEx должна вызываться из GUI потока, имеющего очередь сообщений (окно).
← →
Leonid Troyanovsky © (2005-10-27 14:44) [14]
> Fay © (27.10.05 13:55) [12]
> 2 Leonid Troyanovsky © (27.10.05 11:13) [11]
>
> Если Вас не затруднит, объясните, каким образом фраза "This
> hook is called in the context of the thread that installed
> it" доказывает утверждение "И, сл-но, dll не обязательна".
>
> Я не очень силён в американском языке, т.о. буду очень рад
> услышать буквальный перевод.
"Этот хук вызывается в контексте установившего его потока."
Читай: выполняется тем же потоком (в том же процессе),
и, сл-но, местонахождение процедуры хука (exe or dll) безразлично.
--
Regards, LVT.
← →
Fay © (2005-10-27 14:45) [15]2 ShiFT (27.10.05 14:28) [13]
Ясненько. Спасибо!
← →
Leonid Troyanovsky © (2005-10-27 14:58) [16]
> ShiFT (27.10.05 14:28) [13]
> из GUI потока, имеющего очередь сообщений (окно).
Про окно там нет ничего, хотя в одном месте пишут:
The call is made by sending a message to the thread that installed the hook.
Хотя, вначале:
The system calls this function every time a new keyboard input event is about to be posted into a thread input queue.
Проверять же мне влом :)
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-10-27 15:04) [17]
> Leonid Troyanovsky © (27.10.05 14:58) [16]
> The system calls this function every time a new keyboard
> input event is about to be posted into a thread input queue.
Здесь, видимо, имелось ввиду клавиатурные события другого приложения.
Т.е., пусть "окно" будет.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c