-
Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил поэкспериментировать - набросал простенькую прогу для приема команд от него (приём хоть в TMemo напр.). Но если программа неактивна, сообщения шлются или в текущее окно или на рабочий стол. Получится ли обойти этот трабл, установив глобальный хук на событие клавы (давно хуки не обрабатывал...)? Думаю что анализируя последовательность от сканера, к примеру если 5 звёздочек (это можно насроить в префиксах сканера), то далее - код, иначе передаём символы в обработчик по умолчанию?
-
> Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил > поэкспериментировать - набросал простенькую прогу для приема > команд от него (приём хоть в TMemo напр.). > Но если программа неактивна
Если программа не активна, то ну её в корзину.
-
> Если программа не активна, то ну её в корзину.
запущенную программу в корзину :) Просто юзер может нажать кнопку "Пуск", что-то позапускать, закрыть, при этом, возможно, окно будет висеть но будет неактивным. В результате считанный код будет передан не известно куда...
-
> delphi_forever (25.11.10 10:35) [2]
> неактивным. В результате считанный код будет передан не > известно куда...
Почему неизвестно? Foreground окну.
-- Regards, LVT.
-
WH_KEYBOARD_LL
-
> WH_KEYBOARD_LL
Ок, попробую...
-
Слабал 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 (25.11.10 22:17) [6]
> Слабал DLL'ку:
Это лишнее.
-- Regards, LVT.
-
> Откуда второе?
От отпускания?
-
> function MyFunc(Code: integer; wParam: word; lParam: longint): > longint; stdcall;
WinDef.h нам кагбэ намекает, что
typedef UINT_PTR WPARAM;
Я понимаю, что на стеке всё, вроде бы, выравнивается по DWORD, но всё же, всё же...
-
Да без разницы как выравнивает и сколько места занимает на стеке. На стек всегда 32 бита в 32 битных системах появляются, хоть байт туда посылай.
-
> От отпускания?
нет. Тогда бы нажал - мессаг, отпустил - мессаг. В реальности если нажать и держать - мессэнджей будет куча, если нажать и отпустить очень быстро - их 2...
Да кстати, к истокам вопроса. Штрих-сканер видимо не эмулирует нажатия, а отсылает сообщение, которое доходит до активного окна. вобщем не реагирует программа на звёздочки, что приходятот сканера, только если на клаве нажать...
|