Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2008, 18:33   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
Злость Немогу разобраться с хуками!

Привет всем!
Я никак разобраться с хуками. Все исходники одинаковые и все какие-то супер-пупер закрученные перекрученные.
Короче кочу такой:
1) Без лишних наворотов (автозагрузка, автокопирование и т.д.), только запись в файл.
2) С установкой и снятием я разобрался.
3) Хук на клаву или мышь с записью значений в файл.
4) поробное пояснение к каждой строчке...

Большое спасибо заранее!!!

Код:
library dllLibrary;

uses
windows, sysUtils;

var
hookH: tHandle;

function onHookCall(code: integer; wParam, lParam: longInt): longInt; stdCall;
var
way: string;
f: textFile;
begin
 if code >= 0 then
  begin //исполняемый код
   Way:='d:\text.txt';
   assignfile(f,way);
   if fileexists(way) then
    append(f)
   else
    rewrite(f);
   writeln(inttostr(wParam));
   closefile(f);
  end
 else
  begin
   result:=CallNextHookEx(hookH, code,wParam,lParam);
   exit;
  end;
 result:=CallNextHookEx(hookH,code,wParam,lParam);
End;

procedure setHook(const setOrUnHook: boolean); stdCall;
begin
   if setOrUnHook then    
      hookH := setWindowsHookEx(WH_MOUSE, @onHookCall, hInstance, 0)
   else
      UnhookWindowsHookEx(hookH);
end;

exports setHook;

begin

end.

Последний раз редактировалось rpy3uH; 13.12.2008 в 13:53.
Altera вне форума Ответить с цитированием
Старый 12.12.2008, 18:35   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Чет я не понял это библиотека или магазин с халявой ? "Короче кочу такой:" очень смешно... вы бы еще дописали "в короткие сроки".

И так... это была преамбула. А вам стоит представить нам что у вас имеется на данный момент и то что у вас именно не выходит, а не запросы тут делать.
BOBAH13 вне форума Ответить с цитированием
Старый 12.12.2008, 18:53   #3
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

кочу я тебе сказать
1.невежливый вопрос
2.MSDN надо хотя бы читать
3.ставишь хук
Код:
Hook:=SetWindowsHookEx(WH_KEYBOARD,@KeyHookProc,hinstance,0);
4.процедура перехвата примерна такая
Код:
Function KeyHookProc(code:integer;wparam:wparam;lparam:lparam):longint;stdcall;
var
keyState:TkeyBoardState;
wnd:HWND;
count:integer;
buf:array[0..1] of char;
begin
result:=CallNextHookEx(hook,code,wparam,lparam);
if Code=HC_ACTION  then 
begin

тут свой код
wParam
код клавиши в параметре лежит
еще проверку можно сделать
if ((lparam and (1 shl 30))<>0) then
что нажата клавиша


end;
end;
P.S Борзеть тока не надо
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 12.12.2008, 19:00   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Ozerich Посмотреть сообщение
кочу я тебе сказать
1.невежливый вопрос
2.MSDN надо хотя бы читать
3.ставишь хук
Код:
Hook:=SetWindowsHookEx(WH_KEYBOARD,@KeyHookProc,hinstance,0);
4.процедура перехвата примерна такая
Код:
Function KeyHookProc(code:integer;wparam:wparam;lparam:lparam):longint;stdcall;
var
keyState:TkeyBoardState;
wnd:HWND;
count:integer;
buf:array[0..1] of char;
begin
result:=CallNextHookEx(hook,code,wparam,lparam);
if Code=HC_ACTION  then 
begin

тут свой код
wParam
код клавиши в параметре лежит
еще проверку можно сделать
if ((lparam and (1 shl 30))<>0) then
что нажата клавиша


end;
end;
P.S Борзеть тока не надо
Когда я "делал заказ", я делал его не зря, представленый вами код я найду в инете и у меня это займёт секунд 30, ну 40...
А мне нужен конкретный пеример. Твой пример у меня воляеться в 10 разных вариациях, однако он не записывает данные в файл. Это не так просто, иначе я бы не спрашивал...

Вот такой код мы тут насочиняли:
Код:
library dllLibrary;

uses
  Windows, Messages, SysUtils,  Classes, Graphics, Controls,
  Dialogs, ExtCtrls,  StdCtrls, XPMan, ExtDlgs;

{$R *.res}

var
H:THandle;
f:textfile; Way:string;

function hook(c0de, wParam, lParam : integer): Lresult; stdcall;
begin
 if c0de >= 0 then
  begin //исполняемый код
   writeln(f, inttostr(wParam));
  end
 else
  begin
   result:=CallNextHookEx(H, c0de,wParam,lParam);
   exit;
  end;
 result:=CallNextHookEx(H,c0de,wParam,lParam);
End;

procedure sethook;
begin
   assignfile(f,'text.txt');
   rewrite(f);
   H:=SetWindowsHookEx(WH_KEYBOARD,@hook,hInstance,0);
   if H=0 then showmessage('0');
end;

procedure unHook;
begin
   UnhookWindowsHookEx(H);
   closefile(f);
end;

exports
sethook,
unHook;

begin

end.
Работает только когда активно окно EXE файла, вызываемого DLL, причём при потере фокуса и при возобновление фокуса запись не возобновляется!

Последний раз редактировалось rpy3uH; 12.12.2008 в 19:57.
Altera вне форума Ответить с цитированием
Старый 12.12.2008, 19:26   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Не делайте так... не используйте WriteLn и вообще интерпритации паскаля в функции обработчика хука...просто довертесь что все работает... и все же не ясно что именно не выходит.... может просветите или опять пропустите мой пост ?
BOBAH13 вне форума Ответить с цитированием
Старый 12.12.2008, 19:29   #6
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Зачем стока модулей?Зачем{$R *.res}?

Такая проблема возникает когда хук локальный(на одну программу) а не глобальный(на всю систему)

Дай глянуть код Exe файла.
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 12.12.2008, 21:44   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
Я никак разобраться с хуками. Все исходники одинаковые и все какие-то супер-пупер закрученные перекрученные.
берём любой навороченный исходник и пошагово выкидываем из него всё лишнее, в результате получаем исходник с требуемой функциональностью.
rpy3uH вне форума Ответить с цитированием
Старый 13.12.2008, 06:22   #8
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
берём любой навороченный исходник и пошагово выкидываем из него всё лишнее, в результате получаем исходник с требуемой функциональностью.
Я хочу разобраться со всеми тёмными моментами этих Хуков!
Вот почему, когда в выше приведённом мной коде, я не записываю в файл, а просто меняю, скажем, заголовок активного окно, то всё прекрасно работает?

Цитата:
Зачем стока модулей?Зачем{$R *.res}?
Это вопрос не в тему!
Цитата:
Дай глянуть код Exe файла.
Ничё там такого нету, просто вызов процедуры установку хука.

Код:
procedure Tforma.Button1Click(Sender: TObject);
begin
   setHook;
end;

procedure Tforma.Button2Click(Sender: TObject);
begin
   unHook;
end;

procedure Tforma.FormCreate(Sender: TObject);
begin
   dll := loadLibrary('D:\Documents\Applicans filse\delphi\TESTING\dllLibrary\dllLibrary.dll');

   @setHook := getProcAddress(dll, 'sethook');
   @unHook := getProcAddress(dll, 'unHook');
end;
Altera вне форума Ответить с цитированием
Старый 13.12.2008, 13:05   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Altera, покури немного в бане. сам знаешь почему

Цитата:
Сообщение от Altera Посмотреть сообщение
Вот почему, когда в выше приведённом мной коде, я не записываю в файл, а просто меняю, скажем, заголовок активного окно, то всё прекрасно работает?
чтобы проблем не было, юзай API функции для записи в файл, ну или хотя бы класс TFileStream. и файл надо открывать каждый раз, когда ты загружаешься в какой-либо процесс. А в твоём коде ты открываешь файл один раз, а код DLL будучи в неком процессе не может использовать хендл полученный в другом процессе.

Последний раз редактировалось rpy3uH; 13.12.2008 в 13:55.
rpy3uH вне форума Ответить с цитированием
Старый 13.12.2008, 13:37   #10
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Цитата:
Вот такой код мы тут насочиняли:

Код:
...
...
...
Работает только когда активно окно EXE файла, вызываемого DLL, причём при потере фокуса и при возобновление фокуса запись не возобновляется!
Попробуй так:

Код:
function hook(c0de, wParam, lParam : Integer): Lresult; stdcall;
Var
f : TextFile;
begin
  if c0de >= 0 then
  begin //исполняемый код
  AssignFile(f,'text.txt');

  {$I-}
  Append(f);
  {$I+}

    If IOResult <> 0 Then
    Rewrite(f);
    
  Writeln(f,inttostr(wParam));
  CloseFile(f);
  end;
Result:=CallNextHookEx(H,c0de,wParam,lParam);
End;
В ловушке не тестировал, но может сработать .
Jupiter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Немогу зарегиться на regmefast.org Altera Свободное общение 2 28.07.2008 13:33
Немогу решить задачу Санячос Общие вопросы Delphi 2 11.06.2008 15:35
Немогу переделать(переписать) прогу!!!! metamfetamin Помощь студентам 0 25.11.2007 14:27
Немогу установить GLSCENE !!!! UnD)eaD)Snake Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 18.07.2007 14:06