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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hook не пашет, в чем ошибка? 
:(
    Опции темы
DragonFire
Дата 13.6.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

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



Не могу понять как нужно организовать програмный цикл. Устанавливаю Hook а процедура, обрабатывающая его не вызывается и программа закрывается сразу же(
Код

program myhook1;

uses
  Windows,
  Messages;

var
  Hook:HHook=0;

function ReadHook(Code: integer; wParam: Word; lParam: LongInt): LongInt; stdcall;
begin
  
ОБРАБАТЫВАЮ ВСЯКО РАЗНО
  
 Result:=CallNextHookEx(Hook, code, wParam, lParam);
end;

procedure DestroyHOOK(); stdcall;
begin
  unhookwindowshookex(Hook);
  Hook:=0;
end;


begin
  Hook:=setwindowshookex(WH_KEYBOARD,@ReadHook,hInstance,0);
end.


если написать так:
Код

begin
  Hook:=setwindowshookex(WH_KEYBOARD,@ReadHook,hInstance,0);
  while Hook= (или <> неохота опять проверять:) )0 begin
  end;
end.

то программа вылетает... 

как быть? 


--------------------
PM MAIL ICQ   Вверх
drkot
Дата 13.6.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Вобще хуки рекомендуют в длл выносить, а уж оттуда вызывать.
Цитата(DragonFire @  13.6.2006,  09:36 Найти цитируемый пост)
то программа вылетает... 

сразу или спустя немного времени
Цитата(DragonFire @  13.6.2006,  09:36 Найти цитируемый пост)
программа закрывается сразу же(

таки и должна завершится, там так и написано: хук поставили и навылет. 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
DragonFire
Дата 13.6.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

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



Ага поставил я его, а он ничего не делает, в DLL пробовал выносить, что-то не получилось опять же... 


--------------------
PM MAIL ICQ   Вверх
drkot
Дата 13.6.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



http://forum.vingrad.ru/index.php?showtopic=21411
смотри сравнивай - и найдеш где глючиш 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Fin
Дата 13.6.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


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

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



DragonFire, Хуки есть двух видов. Локальные и глобальные. Если ты хук определяеш в основном модуле, то это локальный хук. И он будет действовать только в пределах твоего процесса, Если ты загружаеш хук с Dll это глобальный хук. Он будет действовать на всю систему. 


--------------------
Пролетал мимо.
PM MAIL   Вверх
DragonFire
Дата 13.6.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

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



Ага спасибо, ща буду разбиратся... 

drkot
Что-то я не нашел там про хуки... может монитор глючит) 

Это сообщение отредактировал(а) DragonFire - 13.6.2006, 22:21


--------------------
PM MAIL ICQ   Вверх
drkot
Дата 14.6.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Цитата(DragonFire @  13.6.2006,  22:18 Найти цитируемый пост)
Что-то я не нашел там про хуки...


там есть пост
Цитата

Пример реализации Русско-Английского KeyLoggera Средствами WinApi

Присоединённый файл ( Кол-во скачиваний: 89 ) 
  xKeyLoger.rar


наворочено реализован, но работает стабильно. 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
RA
Дата 15.6.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

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



Навороченно это мягко сказанно, там я явно палку перегнул, а всё от того, что не знал как кодировку определить, вот и придумал фишку с ДЛЛ.

А вобще по данному способу очень хорошо высказался Rouse_, за что ему нечеловеческий респект, и медалька. 

А высказался он вот таким кодом:


Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

var
  hHook: THandle;

{$R *.dfm}

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;

const
  RPT_WPARAM_DATA = 'Keyboard message = %s ';
  RPT_LPARAM_DATA = 'scan code = %s [%d]';
var
  StrResult: String;
begin
  StrResult := '';
  if nCode = HC_ACTION then
    Result := CallNextHookEx(hHook, nCode, WParam, LParam);
  case WParam of
    WM_KEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYDOWN']);
    WM_KEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYUP']);
    WM_SYSKEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYDOWN']);
    WM_SYSKEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYUP']);
  end;

  StrResult := StrResult + Format(RPT_LPARAM_DATA, [
    Chr(PKbdDllHookStrukt(LParam)^.vkCode), PKbdDllHookStrukt(LParam)^.vkCode]);
  Form1.Memo1.Lines.Add(StrResult);
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   Вверх
DragonFire
Дата 16.6.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

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



Как все просто то  smile 
Спасибо  smile  


--------------------
PM MAIL ICQ   Вверх
drkot
Дата 16.6.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Цитата(RAdmin @  15.6.2006,  14:29 Найти цитируемый пост)
А высказался он вот таким кодом:

высказавание очнь хорошее, тока проблема кодировки не решена  smile  


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
RA
Дата 16.6.2006, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

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



Цитата(drkot @  16.6.2006,  18:26 Найти цитируемый пост)
высказавание очнь хорошее, тока проблема кодировки не решена


А у меня всё пучком почему-то .... 
PM   Вверх
drkot
Дата 19.6.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Может потомы, что у меня локаль инглуцкая стоит  smile  


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Rondo
Дата 27.8.2006, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

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



Люди! А почему прога не перехватывает клавиши с других приложений.. точнее он перехватывает, но буквы только в большлм регистре.

так она себя ведет если фокус стоит на форме самого логгера:
Keyboard message = WM_KEYDOWN scan code = b [98]2
Keyboard message = WM_KEYDOWN scan code = c [99]3
Keyboard message = WM_KEYDOWN scan code = Q [81]q
Keyboard message = WM_KEYDOWN scan code = W [87]w

Когда форма логгера несфокусирована то:
Keyboard message = WM_KEYDOWN scan code = 3 [51]
Keyboard message = WM_KEYDOWN scan code = Q [81]
Keyboard message = WM_KEYDOWN scan code = W [87]

P.S WM_KEYUP нестал писать т.к всегда получается как на несфокусированной форме..

Это сообщение отредактировал(а) Rondo - 27.8.2006, 04:41
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
drkot
Дата 28.8.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Это не буквы, а скан коды клавиш. они не зависят от регистра (зависят развешто от кнопок режимов но они только на навороченых влавиатурах встречаются)
Регистр распознавать самостоятельно надо.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
JeronimoIn
Дата 20.10.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(RA @ 15.6.2006,  14:29)
Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

var
  hHook: THandle;

{$R *.dfm}

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;

const
  RPT_WPARAM_DATA = 'Keyboard message = %s ';
  RPT_LPARAM_DATA = 'scan code = %s [%d]';
var
  StrResult: String;
begin
  StrResult := '';
  if nCode = HC_ACTION then
    Result := CallNextHookEx(hHook, nCode, WParam, LParam);
  case WParam of
    WM_KEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYDOWN']);
    WM_KEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYUP']);
    WM_SYSKEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYDOWN']);
    WM_SYSKEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYUP']);
  end;

  StrResult := StrResult + Format(RPT_LPARAM_DATA, [
    Chr(PKbdDllHookStrukt(LParam)^.vkCode), PKbdDllHookStrukt(LParam)^.vkCode]);
  Form1.Memo1.Lines.Add(StrResult);
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   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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