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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2010, 18:25   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию HOOK на перемещение мыши

написал dll с хуком:
Код:
library MouseMessage;

uses
    Windows, Messages;

Const
  HookMsg=Wm_User+$125;

{$R *.res}

Var
Pt: TPoint;
MouseHook: THandle;
MouseHookMsg: Cardinal;

Function MousePosition(Ncode, Wparam, Lparam: Longint): LRESULT; stdcall;
Var
Msg: PMouseHookStruct;
Wnd: HWND;
x,y:integer;
Begin
  if Ncode<0 then
  begin
    result:= CallNextHookEx(MouseHook, Ncode, Wparam, Lparam);
    exit;
  end;
  Msg:=PMouseHookStruct(Lparam);
  If Wparam=WM_MOUSEMOVE then
  begin
    Wnd:=FindWindow(nil,PChar('Graphic'));
    Pt:=msg^.pt;
    SendMessage(Wnd, HookMsg {MouseHookMsg}, Wparam, Lparam);
  end;
Result:= CallNextHookEx(MouseHook, Ncode, Wparam, Lparam);
End;

Procedure SetHook;
Begin
  //MouseHookMsg:=RegisterWindowMessage(PChar(MouseHook));
  MouseHook:=SetWindowsHookEx(WH_MOUSE, @MousePosition, HInstance, 0);
  if MouseHook=0 then
  MessageBox(0,'ваыв','ывпывп',mb_ok)
  else
  MessageBox(0,'ывпí','ывп',mb_ok);
End;

Procedure UnSetHook;
Begin
  //FreeMemory(@MouseHookMsg);
  UnhookWindowsHookEx(MouseHook);
End;

Exports
SetHook index 1 name 'SetHook',
UnSetHook index 2 name 'UnSetHook';

begin
end.
Использую эту длл так:
Код:
unit Unit1;

interface

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

Const
  HookMsg=Wm_User+$125;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure WndProc(var Msg: TMessage); override;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  //ýêñïîðòèðóåì äâå ôóíêöèè èç áèáëèîòåêè ñ ÍÎÎÊ'àìè
  procedure SetHook; external 'MouseMessage.dll' name 'SetHook';
  procedure UnSetHook; external 'MouseMessage.dll' name 'UnSetHook';

implementation

{$R *.dfm}

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

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

procedure TForm1.WndProc(var Msg: TMessage);
var
SC: integer;
x,y:Longint;
begin
inherited ;
  if Msg.Msg = HookMsg then
    begin
    y := msg.lParam shr 16;   // GET_X_LPARAM
    //Y := SMALLINT( (msg.lParam shr 16) and $FFFF);   // GET_Y_LPARAM
    Memo1.Text:=inttostr(y);
    End;
end;

end.
Но не работает как надо, какие-то левые числа появляются в мемо... В чем дело подскажите?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 02.10.2010, 18:45   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

пара коррекций:
Код:
SendMessage(Wnd, HookMsg {MouseHookMsg}, pt.X, pt.Y);
Код:
Memo1.Text:= format('v1: %d; v2: %d;', [msg.WParam, msg.LParam]);
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 02.10.2010, 19:32   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

raxp, небольшой вопрос... почему не считываются координаты курсора на границе любого окна. Если навести при запущенной проге на самый верх экрана курсор, при максимизированном окне, координата не будет считана... Как это исправить? И как правильно использовать MouseHookMsg:=RegisterWindowMessage (PChar(MouseHook)); На случай если пользователь тоже программер и он выбрал у себя константу с одинаковым значением как у меня.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 02.10.2010 в 19:56.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
masm32 - hook для сообщений клавиатуры/мыши и т.д. Wardrag Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 20.08.2010 10:49
Перемещение курсора мыши UNREALcv Помощь студентам 1 11.04.2010 11:39
[Delphi]Перемещение компонента к щелчку мыши. Fiery Fox Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 07.03.2010 10:01
Программное перемещение указателя мыши по экрану. LENINGOLD Общие вопросы Delphi 3 30.11.2009 01:58