Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передеча данных в Hook 
V
    Опции темы
Gonzo
Дата 10.7.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Пишется программа для для дисплейного модуля на электровоз и встала следующая проблемма.
Необходимо перехватывать нажатия определенных клавишьи писать их в лог-файл вместе с текущей координатой, для создания базы препятствий. 
Создал ловушку, а вот как передать в нее переменную для записи в файл никак не пойму...

Инициализация ловушки
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  hinstDLL: HINST;
  hkprcKeyboard: TFNHookProc;
  msg: TMsg;
begin
  hinstDLL := LoadLibrary('Hook.dll');
  hkprcKeyboard := GetProcAddress(hinstDLL, 'KeyboardProc');
  SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, hinstDLL, 0);
end;



Сама ловушка

Код

library hook;

uses
  shellapi,
  windows,
  SysUtils;

var
 g_hhk: HHOOK;

function KeyboardProc(nCode: Integer; wParam: wParam; lParam: lParam ): LParam; stdcall;
var
 f:textfile;
 begin
 assignfile(f, 'c:\log.txt');
 try
  append(f);
  except
  rewrite(f);
 end;
  case wParam of
           65:writeln(f,'sv:vh '+inttostr(BUF_KLUBDI[4]));
           68:writeln(f,'sv:vy '+inttostr(BUF_KLUBDI[4]));
           83:writeln(f,'sv:ma '+inttostr(BUF_KLUBDI[4]));
           70:writeln(f,'sv:pr '+inttostr(BUF_KLUBDI[4]));
           80:writeln(f,'zapre '+inttostr(BUF_KLUBDI[4]));
           81:writeln(f,'pr:no '+inttostr(BUF_KLUBDI[4]));
           87:writeln(f,'pr:ox '+inttostr(BUF_KLUBDI[4]));
           69:writeln(f,'perex '+inttostr(BUF_KLUBDI[4]));
           82:writeln(f,'putep '+inttostr(BUF_KLUBDI[4]));
           84:writeln(f,'gazop '+inttostr(BUF_KLUBDI[4]));
           89:writeln(f,'ponab '+inttostr(BUF_KLUBDI[4]));
           85:writeln(f,'svist '+inttostr(BUF_KLUBDI[4]));
           73:writeln(f,'om:na '+inttostr(BUF_KLUBDI[4]));
           79:writeln(f,'om:ko '+inttostr(BUF_KLUBDI[4]));
           90:writeln(f,'pl:na '+inttostr(BUF_KLUBDI[4]));
           88:writeln(f,'pl:ko '+inttostr(BUF_KLUBDI[4]));
           67:writeln(f,'mo:na '+inttostr(BUF_KLUBDI[4]));
           86:writeln(f,'mo:ko '+inttostr(BUF_KLUBDI[4]));
           66:writeln(f,'tu:na '+inttostr(BUF_KLUBDI[4]));
           78:writeln(f,'tu:ko '+inttostr(BUF_KLUBDI[4]));
           71:writeln(f,'pt:na '+inttostr(BUF_KLUBDI[4]));
           72:writeln(f,'pt:ko '+inttostr(BUF_KLUBDI[4]));
           74:writeln(f,'et:na '+inttostr(BUF_KLUBDI[4]));
           75:writeln(f,'et:ko '+inttostr(BUF_KLUBDI[4]));

end;
 close(f);
end;

exports
 KeyboardProc;
begin
end.



BUF_KLUBDI[4] переменная типа integer  из вызывающей программы.
PM MAIL   Вверх
kami
Дата 10.7.2009, 21:13 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Gonzo @  10.7.2009,  17:25 Найти цитируемый пост)
Необходимо перехватывать нажатия определенных клавишьи писать их в лог-файл вместе с текущей координатой

Почему для этого не воспользоваться WH_KEYBOARD_LL, который можно не выносить в dll, и который, соответственно, вызывается в контексте "своего" процесса, а значит - не нужно думать "как передать это и это", один раз передали - и "это" при вызове хука "никуда не денется"?

Добавлено через 1 минуту и 22 секунды
я так понимаю, что нужно передать хендл открытого файла, чтобы не открывать/закрывать его каждый раз при вызове хука, так?
PM MAIL WWW   Вверх
Gonzo
Дата 11.7.2009, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Цитата(kami @  10.7.2009,  21:13 Найти цитируемый пост)
я так понимаю, что нужно передать хендл открытого файла, чтобы не открывать/закрывать его каждый раз при вызове хука, так? 

не совсем понимаю, зачем это нужно делать?

Вроде вот так работает...
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

var
  hHook: THandle;


function LowLevelKeyboardProc(nCode: Integer;
  WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
type
  PKbdDllHookStrukt = ^TKbdDllHookStrukt;
  _KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: PDWORD;
  end;
  TKbdDllHookStrukt = _KBDLLHOOKSTRUCT;

var
  f:TextFile;
begin
  if ncode < 0 then
    begin
      Result := CallNextHookEx(hHook, nCode, WParam, LParam);
      Exit;
    end;
if WParam = WM_KEYDOWN then
 begin
    assignfile(f, 'c:\log.txt');
     try
      append(f);
     except
       rewrite(f);
     end;
     case PKbdDllHookStrukt(LParam)^.vkCode  of
           65:writeln(f,'sv:vh '+inttostr(BUF_KLUBDI[4]));
           68:writeln(f,'sv:vy '+inttostr(BUF_KLUBDI[4]));
           83:writeln(f,'sv:ma '+inttostr(BUF_KLUBDI[4]));
           70:writeln(f,'sv:pr '+inttostr(BUF_KLUBDI[4]));
           80:writeln(f,'zapre '+inttostr(BUF_KLUBDI[4]));
           81:writeln(f,'pr:no '+inttostr(BUF_KLUBDI[4]));
           87:writeln(f,'pr:ox '+inttostr(BUF_KLUBDI[4]));
           69:writeln(f,'perex '+inttostr(BUF_KLUBDI[4]));
           82:writeln(f,'putep '+inttostr(BUF_KLUBDI[4]));
           84:writeln(f,'gazop '+inttostr(BUF_KLUBDI[4]));
           89:writeln(f,'ponab '+inttostr(BUF_KLUBDI[4]));
           85:writeln(f,'svist '+inttostr(BUF_KLUBDI[4]));
           73:writeln(f,'om:na '+inttostr(BUF_KLUBDI[4]));
           79:writeln(f,'om:ko '+inttostr(BUF_KLUBDI[4]));
           90:writeln(f,'pl:na '+inttostr(BUF_KLUBDI[4]));
           88:writeln(f,'pl:ko '+inttostr(BUF_KLUBDI[4]));
           67:writeln(f,'mo:na '+inttostr(BUF_KLUBDI[4]));
           86:writeln(f,'mo:ko '+inttostr(BUF_KLUBDI[4]));
           66:writeln(f,'tu:na '+inttostr(BUF_KLUBDI[4]));
           78:writeln(f,'tu:ko '+inttostr(BUF_KLUBDI[4]));
           71:writeln(f,'pt:na '+inttostr(BUF_KLUBDI[4]));
           72:writeln(f,'pt:ko '+inttostr(BUF_KLUBDI[4]));
           74:writeln(f,'et:na '+inttostr(BUF_KLUBDI[4]));
           75:writeln(f,'et:ko '+inttostr(BUF_KLUBDI[4]));

     end;
    close(f);
  end;

 Result := CallNextHookEx(hHook, nCode, WParam, LParam);

end;


procedure TForm1.FormCreate(Sender: TObject);
const
  WH_KEYBOARD_LL = 13;

begin
 hHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  if hHook = 0 then RaiseLastOSError;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if not UnhookWindowsHookEx(hHook) then RaiseLastOSError;

end;

end.



PM MAIL   Вверх
kami
Дата 11.7.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Gonzo @  10.7.2009,  17:25 Найти цитируемый пост)
как передать в нее переменную для записи в файл

Цитата(kami @  10.7.2009,  21:13 Найти цитируемый пост)
нужно передать хендл открытого файла,... так?

Цитата(Gonzo @  11.7.2009,  01:22 Найти цитируемый пост)
не совсем понимаю, зачем это нужно делать?

То ли лыжи не едут... smile 
PM MAIL WWW   Вверх
Gonzo
Дата 11.7.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Цитата(kami @  11.7.2009,  08:06 Найти цитируемый пост)
То ли лыжи не едут...   

а по-подробнее smile 
PM MAIL   Вверх
kami
Дата 11.7.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Gonzo @  11.7.2009,  09:06 Найти цитируемый пост)
а по-подробнее

А чего подробнее?
Ты спросил, как передать переменную в хук для записи в файл. В моем понимании переменная для записи в файл - это хендл файла, или указатель на типизированный файл, как у тебя в коде. Я иногда так делаю, чтобы не заниматься на каждый чих открытием/закрытием файла. И тут выясняется, что передать-то нужно было не это. А вот что? Единственное, что вижу - это наконец-то появился в коде CallNextHookEx.

Пытаясь опять включить телепатор, предполагаю, что передать нужно было не "файловую переменную", а HHook.
Но это слабое объяснение - на Win2000 и выше в CallNextHookEx можно вместо него передавать 0, система это поймет.
В общем - телепатор отказал напрочь.  smile

Добавлено через 9 минут и 22 секунды
В общем, ладно, забыли.
"Работает - ничего не трогай!" (с) чье-то smile
PM MAIL WWW   Вверх
Gonzo
Дата 11.7.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Цитата(kami @  11.7.2009,  12:58 Найти цитируемый пост)
И тут выясняется, что передать-то нужно было не это. А вот что? 

BUF_KLUBDI[4] переменная типа integer  из вызывающей программы - вот что надо было передать в хук, а вы куда-то в дебри полезли =)
Извиняюсь, если не корректно поставил вопрос изначально.

PM MAIL   Вверх
artemxxl
Дата 24.5.2012, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.5.2010

Репутация: нет
Всего: нет



создаешь в dll стартовую функцию с параметрами (которые тебе надо туда передать) и в ней стартуешь все хуки.
Из твоего приложения вызываешь эту функцию и передаешь нужные параметры. 
PM MAIL   Вверх
XperT
Дата 24.5.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 1
Всего: 4



Как вариант, для обмена данными, есть еще мапед файлы
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.