Форум: "WinAPI";
Текущий архив: 2019.01.06;
Скачать: [xml.tar.bz2];
Внизглобальный hook на клаву Найти похожие ветки
← →
delphi_forever (2010-11-25 02:45) [0]Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил поэкспериментировать - набросал простенькую прогу для приема команд от него (приём хоть в TMemo напр.).
Но если программа неактивна, сообщения шлются или в текущее окно или на рабочий стол. Получится ли обойти этот трабл, установив глобальный хук на событие клавы (давно хуки не обрабатывал...)?
Думаю что анализируя последовательность от сканера, к примеру если 5 звёздочек (это можно насроить в префиксах сканера), то далее - код, иначе передаём символы в обработчик по умолчанию?
← →
Германн © (2010-11-25 05:42) [1]
> Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил
> поэкспериментировать - набросал простенькую прогу для приема
> команд от него (приём хоть в TMemo напр.).
> Но если программа неактивна
Если программа не активна, то ну её в корзину.
← →
delphi_forever (2010-11-25 10:35) [2]
> Если программа не активна, то ну её в корзину.
запущенную программу в корзину :)
Просто юзер может нажать кнопку "Пуск", что-то позапускать, закрыть, при этом, возможно, окно будет висеть но будет неактивным. В результате считанный код будет передан не известно куда...
← →
Leonid Troyanovsky © (2010-11-25 11:57) [3]
> delphi_forever (25.11.10 10:35) [2]
> неактивным. В результате считанный код будет передан не
> известно куда...
Почему неизвестно?
Foreground окну.
--
Regards, LVT.
← →
DiamondShark © (2010-11-25 12:38) [4]WH_KEYBOARD_LL
← →
delphi_forever (2010-11-25 18:16) [5]
> WH_KEYBOARD_LL
Ок, попробую...
← →
delphi_forever (2010-11-25 22:17) [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, при нажатии "*" высвакивают два окна с сообщением. Откуда второе?
← →
Leonid Troyanovsky © (2010-11-26 08:15) [7]
> delphi_forever (25.11.10 22:17) [6]
> Слабал DLL"ку:
Это лишнее.
--
Regards, LVT.
← →
DiamondShark © (2010-11-26 11:14) [8]
> Откуда второе?
От отпускания?
← →
DiamondShark © (2010-11-26 11:19) [9]
> function MyFunc(Code: integer; wParam: word; lParam: longint):
> longint; stdcall;
WinDef.h нам кагбэ намекает, что
typedef UINT_PTR WPARAM;
Я понимаю, что на стеке всё, вроде бы, выравнивается по DWORD, но всё же, всё же...
← →
Anatoly Podgoretsky © (2010-11-26 12:00) [10]Да без разницы как выравнивает и сколько места занимает на стеке. На стек всегда 32 бита в 32 битных системах появляются, хоть байт туда посылай.
← →
delphi_forever (2010-11-26 14:24) [11]
> От отпускания?
нет. Тогда бы нажал - мессаг, отпустил - мессаг.
В реальности если нажать и держать - мессэнджей будет куча, если нажать и отпустить очень быстро - их 2...
Да кстати, к истокам вопроса. Штрих-сканер видимо не эмулирует нажатия, а отсылает сообщение, которое доходит до активного окна. вобщем не реагирует программа на звёздочки, что приходятот сканера, только если на клаве нажать...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2019.01.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.001 c