Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

глобальный hook на клаву


delphi_forever   (25.11.10 02:45

Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил поэкспериментировать - набросал простенькую прогу для приема команд от него (приём хоть в TMemo напр.).
Но если программа неактивна, сообщения шлются или в текущее окно или на рабочий стол. Получится ли обойти этот трабл, установив глобальный хук на событие клавы (давно хуки не обрабатывал...)?
Думаю что анализируя последовательность от сканера, к примеру если 5 звёздочек (это можно насроить в префиксах сканера), то далее - код, иначе передаём символы в обработчик по умолчанию?


Германн ©   (25.11.10 05:42[1]


> Попался в руки штрих-сканер, эмулирующий USB-клаву. Решил
> поэкспериментировать - набросал простенькую прогу для приема
> команд от него (приём хоть в TMemo напр.).
> Но если программа неактивна

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


delphi_forever   (25.11.10 10:35[2]


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

запущенную программу в корзину :)
Просто юзер может нажать кнопку "Пуск", что-то позапускать, закрыть, при этом, возможно, окно будет висеть но будет неактивным. В результате считанный код будет передан не известно куда...


Leonid Troyanovsky ©   (25.11.10 11:57[3]


> delphi_forever   (25.11.10 10:35) [2]

> неактивным. В результате считанный код будет передан не
> известно куда...

Почему неизвестно?
Foreground окну.

--
Regards, LVT.


DiamondShark ©   (25.11.10 12:38[4]

WH_KEYBOARD_LL


delphi_forever   (25.11.10 18:16[5]


> WH_KEYBOARD_LL

Ок, попробую...


delphi_forever   (25.11.10 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 ©   (26.11.10 08:15[7]


> delphi_forever   (25.11.10 22:17) [6]

> Слабал DLL'ку:

Это лишнее.

--
Regards, LVT.


DiamondShark ©   (26.11.10 11:14[8]


>  Откуда второе?

От отпускания?


DiamondShark ©   (26.11.10 11:19[9]


> function MyFunc(Code: integer; wParam: word;  lParam: longint):
>  longint; stdcall;

WinDef.h нам кагбэ намекает, что

typedef UINT_PTR WPARAM;

Я понимаю, что на стеке всё, вроде бы, выравнивается по DWORD, но всё же, всё же...


Anatoly Podgoretsky ©   (26.11.10 12:00[10]

Да без разницы как выравнивает и сколько места занимает на стеке. На стек всегда 32 бита в 32 битных системах появляются, хоть байт туда посылай.


delphi_forever   (26.11.10 14:24[11]


> От отпускания?

нет. Тогда бы нажал - мессаг, отпустил - мессаг.
В реальности если нажать и держать - мессэнджей будет куча, если нажать и отпустить очень быстро - их 2...

Да кстати, к истокам вопроса. Штрих-сканер видимо не эмулирует нажатия, а отсылает сообщение, которое доходит до активного окна. вобщем не реагирует программа на звёздочки, что приходятот сканера, только если на клаве нажать...


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо