Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > hOOK


Автор: Bogus 12.4.2005, 19:16
имеется задача, как запустить определенную процедуру на событие: клик мышкой + смещение курсора на определенное расстояние (после клика). если без HOOKа не обойтись, то можно ли это сделать без библиотеки, т.е одним EXE- файлом. Клик и смещение курсора вне моего приложения.(Т.е. ловушка - глобальная). Чем подробнее, тем я признательнее. Заранее спасибо.


smile

Автор: bartram 12.4.2005, 20:59
Цитата(Bogus @ 12.4.2005, 19:16)
можно ли это сделать без библиотеки, т.е одним EXE- файлом. Клик и смещение курсора вне моего приложения.(

Без dll ни как не получиться, потому что это глобальная ловушка.

Автор: S.A.P. 13.4.2005, 08:07
Где то тут на форуме давно видел пример без dll ного хука через Direct Input, поищи. Еще как то oleg1973 делал хук, в качестве dll использовал сам exe шник, правда работает это только в XP.

Автор: Girder 13.4.2005, 08:57
Цитата(Perchilla @ 13.4.2005, 09:07)
Еще как то oleg1973 делал хук, в качестве dll использовал сам exe шник, правда работает это только в XP.
http://forum.vingrad.ru/index.php?showtopic=27143&st=0&#entry193106

Автор: Bogus 13.4.2005, 09:46
СПасибо, пойду попробую smile

Автор: Bogus 13.4.2005, 14:15
Где-то я чего-то не понимаю
Вот что я имею:
Код

unit Unit1;

interface

uses Wintypes, Winprocs, Messages,forms;

function SetHook: Boolean;
function UnHookHook: Boolean;
function HookProc(Code: integer; wParam: Word;
  lParam: Longint): Longint; export; stdcall;


var
  HookedAlready: Boolean;

implementation
 exports
        

HookProc index 1;

var
  ourHook: HHook;



function HookProc(Code: integer; wParam: word;
  lParam: Longint): Longint;
begin
  if (wParam = WM_LBUTTONDOWN) then
    MessageBeep(0);
  result := CallNextHookEx(ourHook, Code, wParam, lParam);
end;

function SetHook: Boolean;
begin
  if HookedAlready then
    exit;


 ourHook := SetWindowsHookEx(WH_MOUSE, HookProc, GetModuleHandle(nil), 0);
 {                         Тута пишет:
[color=red] [Error] Unit1.pas(41): Incompatible types: 'Integer' and 'Word'[/color]

Помогите как для чайника, пожалуйста. Никогда не работал с DLL-ками}

  HookedAlready := True;
end;
function UnHookHook: Boolean;
begin
  UnHookWindowsHookEx(ourHook);
  HookedAlready := False;
end;



end.


И тута: GetModuleHandle(nil), я хотел поиметь Handle своего приложения, я прав?
smile

Автор: RA 13.4.2005, 19:31
Вот мой пример
http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=261960

он с dll но dll исключительно для слежения за активной раскладкой, в общем можно и без неё.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)