Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2019.01.06;
Скачать: CL | DM;

Вниз

глобальный 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 вся ветка

Текущий архив: 2019.01.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.004 c
4-1290642303
delphi_forever
2010-11-25 02:45
2019.01.06
глобальный hook на клаву


2-1476366771
JohnKorsh
2016-10-13 16:52
2019.01.06
COM порт и BlueTooth


15-1476267406
Игорь Шевченко
2016-10-12 13:16
2019.01.06
Советую


15-1476048601
Юрий
2016-10-10 00:30
2019.01.06
С днем рождения ! 10 октября 2016 понедельник


4-1290338878
Denis_kas
2010-11-21 14:27
2019.01.06
автоматическое считывание с com порта