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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не работает глобальный hook сообщений 
:(
    Опции темы
dbgrid
  Дата 11.6.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте Уважаемые..
Третий день дрючусь с хуками))
ничего не получается....
есть DLL для установки глобального хука и записи в файл хэндлов окон которые шлют сообщения (для примера!!!)

Код

library dllhooook;

uses
  Windows, SysUtils,
  Messages, classes, unit1;

var
 SysHook : HHook = 0;
 Wnd : Hwnd = 0;
 f:TextFile;
 mmsg:MSG;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
    if code<0 then begin
       SysMsgProc:=CallNextHookEx(SysHook,code,wParam,lparam);
       Exit;
    end;

   Wnd := TMsg(Pointer(lParam)^).hwnd;

        AssignFile(f,'log.txt');
        if not FileExists('log.txt') then Rewrite(f) else Reset(f);
         Append(f);
         Writeln(f,inttohex(Wnd,0));
         CloseFile(f);
  end;
end;

procedure RunStopHook(State : Boolean) export; stdcall;
begin
 if State then SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0)
 else
  begin
   UnhookWindowsHookEx(SysHook);
   SysHook := 0;
end;

exports RunStopHook index 1;

begin
end.
 
теоретически всё просто...и должно работать....
но в файл записываются только хэндлы программы которая включает этот хук....и всё, все остальные окна игнорируются...
что здесь не так??

Кстати...переодически при использовании это DLL слетает explorer.exe

Это сообщение отредактировал(а) dbgrid - 11.6.2009, 11:24
PM MAIL   Вверх
Romikgy
Дата 11.6.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



а где вызов этого же 
Цитата(dbgrid @  11.6.2009,  09:44 Найти цитируемый пост)
CallNextHookEx(SysHook,code,wParam,lparam);

после того как ты залогировал событие ? или у тя по логике должны все сообщения убиватся ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Эксперт
***


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

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



Цитата(dbgrid @  11.6.2009,  10:44 Найти цитируемый пост)
Код

AssignFile(f,'log.txt');

А в папках программ файл log.txt не пробовали поискать? smile 
Вы ведь открываете файл в текущей директории для вызвавшего хук процесса.

Добавлено через 3 минуты и 47 секунд
Цитата(dbgrid @  11.6.2009,  10:44 Найти цитируемый пост)
Кстати...переодически при использовании это DLL слетает explorer.exe

Потому что не выполнено требование, озвученное Romikgy.
PM MAIL WWW   Вверх
dbgrid
Дата 11.6.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Romikgy @  11.6.2009,  12:28 Найти цитируемый пост)
после того как ты залогировал событие ? или у тя по логике должны все сообщения убиватся ? 


Спасибо, согласен, explorer теперь не слетает


Цитата(kami @  11.6.2009,  12:34 Найти цитируемый пост)
А в папках программ файл log.txt не пробовали поискать? smile 
Вы ведь открываете файл в текущей директории для вызвавшего хук процесса.


)))))Спасибо....это многое объясняет.....например появление log.txt на рабочес столе)))))
Исправил на C:\log.txt

НО!!!
Всё равно, запускаю прогу, беру окно БЛОКНОТЫ, перемещаю его, закрываю прогу...
захожу в log но там хэндла БЛОКНОТА нету...
Сравниваю с результатами spy++

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


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



а после твоей длл пробовал блокнот запускать ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
dbgrid
Дата 11.6.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Romikgy @  11.6.2009,  13:33 Найти цитируемый пост)
а после твоей длл пробовал блокнот запускать ? 

пробовал
На самом деле ХУК действительно ГЛОБАЛЬНЫЙ....записывает в log кучу окон
но блокнота там нет
я использовал функцию
Код

Writeln(f,GetModuleName(GetClassLong(Wnd,GCL_HMODULE)));

для того чтобы по хэндлу сразу записывалось имя процесса.....
но блокнота там нет....((((

вообще изначальная задумка была такая
например в блокноте открываешь файл, или нажимаешь какой нибудь пункт в меню....генерируется сообщение...моя dll эти сообщения фильтрует....и регестрирует в ЛОге

PM MAIL   Вверх
Romikgy
Дата 11.6.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



дай полный текст этой длл  и проекта запуска ее буду бета тестером smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Новичок



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

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



DLL
Код

library dllhooook;

uses
  Windows, SysUtils,
  Messages, classes, unit1;

var
 SysHook : HHook = 0;
 Wnd : Hwnd = 0;
 f:TextFile;
 mmsg:MSG;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
    if code<0 then begin
       SysMsgProc:=CallNextHookEx(SysHook,code,wParam,lparam);
       Exit;
    end;

   Wnd := TMsg(Pointer(lParam)^).hwnd;

        AssignFile(f,'C:\log.txt');
        if not FileExists('C:\log.txt') then Rewrite(f) else Reset(f);
           Append(f);
//         Writeln(f,inttohex(Wnd,0));
           Writeln(f,GetModuleName(GetClassLong(Wnd,GCL_HMODULE)));
           CloseFile(f);
       SysMsgProc:=CallNextHookEx(SysHook,code,wParam,lparam);
end;

procedure RunStopHook(State : Boolean) export; stdcall;
begin
 if State then SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0)
 else
  begin
   UnhookWindowsHookEx(SysHook);
   SysHook := 0;
  end;
end;

exports RunStopHook index 1;

begin
end.


сама форма
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
procedure RunStopHook(State : Boolean) stdcall; external 'dllhooook.dll' index 1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
RunStopHook(true);
caption:='ВКЛ';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
RunStopHook(false);
caption:='ВЫКЛ';
end;

end.


Добавлено через 4 минуты и 6 секунд
Я запустил хук
после чего запустил блокнот.....пощёлкал по менюшкам.....закрыл блокнот

а в ЛОГе сохранилось

Код

C:\Documents and Settings\XXX\Рабочий стол\hook\Project1.exe
C:\Documents and Settings\XXX\Рабочий стол\hook\Project1.exe
C:\Documents and Settings\XXX\Рабочий стол\hook\Project1.exe
C:\Documents and Settings\XXX\Рабочий стол\hook\Project1.exe
C:\WINDOWS\Explorer.EXE
D:\MozilaFirefox\firefox.exe
D:\MozilaFirefox\firefox.exe


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


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



система не грузит эту длл  ко всем процессам , странно и не понятно , для меня ((


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
dbgrid
Дата 11.6.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Romikgy @  11.6.2009,  14:47 Найти цитируемый пост)
система не грузит эту длл  ко всем процессам , странно и не понятно , для меня (( 

))))ну хоть не мне одному непонятно))))))
PM MAIL   Вверх
dbgrid
Дата 23.6.2009, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



разобрался сам...
кому интересно..
функция перехвата будет выглядеть так
Код

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
mes,lpam,wpam,logf:string;
begin
    if code<0 then begin
       SysMsgProc:=CallNextHookEx(SysHook,code,wParam,lparam);
       Exit;
    end;

   Wnd := TMsg(Pointer(lParam)^).hwnd;
   mes:=IntToHex(TMsg(Pointer(lParam)^).message,8);
   lpam:=IntToHex(TMsg(Pointer(lParam)^).lParam,8);
   wpam:=IntToHex(TMsg(Pointer(lParam)^).wParam,8);

   if not(GetModuleName(GetClassLong(Wnd,GCL_HMODULE))='C:\Program Files\The KMPlayer\KMPlayer.exe') then exit; //перехват событий только из программы KMPlayer или ВЫХОД

        AssignFile(f,'log.txt');
        if not FileExists('log.txt') then Rewrite(f) else Reset(f);  //LOG файл всётаки приходится создавать в директории проги за которой следишь
           Append(f);
           Writeln(f,mes+' ---> '+lpam+' - '+wpam); //список событий в чистом виде))))
           CloseFile(f);

       SysMsgProc:=CallNextHookEx(SysHook,code,wParam,lparam);
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.

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


 




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


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

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