Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

глобальный 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 напр.).
> Но если программа неактивна

Если программа не активна, то ну её в корзину.


Наверх

Титульная страница Поиск, карта сайта Написать письмо