Конференция "WinAPI" » глобальный hook на клаву
 
  • delphi_forever (25.11.10 02:45) [0]
    Попался в руки штрих-сканер, эмулирующий 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...

    Да кстати, к истокам вопроса. Штрих-сканер видимо не эмулирует нажатия, а отсылает сообщение, которое доходит до активного окна. вобщем не реагирует программа на звёздочки, что приходятот сканера, только если на клаве нажать...
 
Конференция "WinAPI" » глобальный hook на клаву
Есть новые Нет новых   [134431   +11][b:0][p:0.001]