![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
глобальный hook на клаву
delphi_forever © (2010-11-25 02:45:00)Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил поэкспериментировать - набросал простенькую прогу для приема команд от него (приём хоть в TMemo напр.).
Но если программа неактивна, сообщения шлются или в текущее окно или на рабочий стол. Получится ли обойти этот трабл, установив глобальный хук на событие клавы (давно хуки не обрабатывал...)?
Думаю что анализируя последовательность от сканера, к примеру если 5 звёздочек (это можно насроить в префиксах сканера), то далее - код, иначе передаём символы в обработчик по умолчанию?
delphi_forever (2010-11-26 14:24:00) [1]
> От отпускания?
нет. Тогда бы нажал - мессаг, отпустил - мессаг.
В реальности если нажать и держать - мессэнджей будет куча, если нажать и отпустить очень быстро - их 2...
Да кстати, к истокам вопроса. Штрих-сканер видимо не эмулирует нажатия, а отсылает сообщение, которое доходит до активного окна. вобщем не реагирует программа на звёздочки, что приходятот сканера, только если на клаве нажать...
Anatoly Podgoretsky (2010-11-26 12:00:00) [2]Да без разницы как выравнивает и сколько места занимает на стеке. На стек всегда 32 бита в 32 битных системах появляются, хоть байт туда посылай.
DiamondShark (2010-11-26 11:19:00) [3]
> function MyFunc(Code: integer; wParam: word; lParam: longint):
> longint; stdcall;
WinDef.h нам кагбэ намекает, что
typedef UINT_PTR WPARAM;
Я понимаю, что на стеке всё, вроде бы, выравнивается по DWORD, но всё же, всё же...
DiamondShark (2010-11-26 11:14:00) [4]
> Откуда второе?
От отпускания?
Leonid Troyanovsky (2010-11-26 08:15:00) [5]
> delphi_forever (25.11.10 22:17) [6]
> Слабал DLL'ку:
Это лишнее.
--
Regards, LVT.
delphi_forever (2010-11-25 22:17:00) [6]Слабал DLL'ку:
library MyHook;
uses
SysUtils, Classes, Windows, Dialogs;
var
MyMainHook: HHook;
function MyFunc(Code: integer; wParam: word; lParam: longint): longint; stdcall;
begin
if Code = HC_ACTION then
if wParam = VK_MULTIPLY then
begin
MessageDlg('Key "*" was pressed!', mtInformation, [mbOk], 0);
end;
result:= CallNextHookEx(MyMainHook, Code, wParam, lParam);
end;
procedure StartHook; export; stdcall;
begin
MyMainHook:= SetWindowsHookEx(WH_KeyBoard, @MyFunc, HInstance, 0);
end;
procedure StopHook; export; stdcall;
begin
UnhookWindowsHookEx(MyMainHook);
end;
exports StartHook name 'StartHook',
StopHook name 'StopHook';
begin
end.
Ничего хитрого, но когда запускается приложение, вызывающее StartHook, при нажатии '*' высвакивают дваокна с сообщением. Откуда второе?
delphi_forever (2010-11-25 18:16:00) [7]
> WH_KEYBOARD_LL
Ок, попробую...
DiamondShark (2010-11-25 12:38:00) [8]WH_KEYBOARD_LL
Leonid Troyanovsky (2010-11-25 11:57:00) [9]
> delphi_forever (25.11.10 10:35) [2]
> неактивным. В результате считанный код будет передан не
> известно куда...
Почему неизвестно?
Foreground окну.
--
Regards, LVT.
delphi_forever (2010-11-25 10:35:00) [10]
> Если программа не активна, то ну её в корзину.
запущенную программу в корзину :)
Просто юзер может нажать кнопку "Пуск", что-то позапускать, закрыть, при этом, возможно, окно будет висеть но будет неактивным. В результате считанный код будет передан не известно куда...
Германн (2010-11-25 05:42:00) [11]
> Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил
> поэкспериментировать - набросал простенькую прогу для приема
> команд от него (приём хоть в TMemo напр.).
> Но если программа неактивна
Если программа не активна, то ну её в корзину.