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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 21:04   #1
anGeee
Пользователь
 
Аватар для anGeee
 
Регистрация: 18.11.2008
Сообщений: 94
По умолчанию Перехват нажатия ЛКМ [Delphi/Hooks]

По-тихоньку пытаюсь изучать хуки. Взял из инета пример для разбора, однако, он не работает. По идее, по нажатию ЛКМ должен проигрываться системный звук... Возможно, я как-то неправильно работаю работаю с библиотекой, так как в примере был только код библиотеки..
Вот исходник библиотеки MouseBeep.dll
Код:
library mousebeep;
    
uses
  Windows, Messages,Sysutils, Dialogs;

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;

procedure SetHook; stdcall; export;
begin  
  if ourHook = 0 then
    exit;
  ourHook := SetWindowsHookEx(WH_MOUSE, @HookProc, HInstance, 0);
end;   
    
procedure UnHookHook; stdcall; export;
begin
  if ourHook <> 0 then
    begin
      UnHookWindowsHookEx(ourHook);
      OurHook := 0;
    end;
end;

exports
  SetHook, UnHookHook;
    
begin
  OurHook := 0;
end.
Исходник самой программы:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure SetHook; stdcall; external 'mousebeep.dll';
procedure UnHookHook; stdcall; external 'mousebeep.dll';

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadLibrary(PChar('mousebeep.dll'));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetHook;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  UnHookHook;
end;

end.
anGeee вне форума Ответить с цитированием
Старый 07.12.2009, 00:58   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

исправьте тут:
Код:
library mousebeep;
...


function HookProc(Code: integer; wParam: Word;   
  lParam: Longint): longint; stdcall;
begin
  if (wParam = WM_LBUTTONDOWN) then
    windows.Beep(1000,100);
  result := CallNextHookEx(ourHook, Code, wParam, lParam);
end;

procedure SetHook; stdcall;
begin  
  // if ourHook = 0 then exit; // смысла нет, он и так вначале ноль
  ourHook := SetWindowsHookEx(WH_MOUSE, @HookProc, HInstance, 0);
end; exports SetHook;
...
и тут:
Код:
unit Unit1;
...
var 
procedure SetHook; stdcall; external 'mousebeep.dll';
procedure UnHookHook; stdcall; external 'mousebeep.dll';

implementation
{$R *.dfm}


//не нужно, так как вы явно уже вызвали подключение
procedure TForm1.FormCreate(Sender: TObject);
begin
  //LoadLibrary(PChar('mousebeep.dll')); // сие нужно, если вы динамически хотите, а так у вас в var-ах уже это сделано
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetHook
end;
и все будет работать
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перехват нажатия клавиш skalt12 Общие вопросы Delphi 4 17.08.2009 13:06
Перехват события нажатия мышки в любой области экрана _Zergatul Win Api 10 06.07.2009 16:29
Перехват нажатия кнопок мыши DarkEvil Win Api 7 15.06.2009 22:38
Перехват нажатия клавиш. Vi_russ Общие вопросы Delphi 1 02.12.2008 20:25
Перехват нажатия Ctrl Lonix Win Api 3 13.09.2007 18:20