Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Вниз

вопрос   Найти похожие ветки 

 
BURATINO   (2001-12-24 02:20) [0]

ПОЧЕМУ НИЖЕ ПРИВЕДЕННЫЙ HOOK НА МЫШКУ В WIN98 РАБОТАЕТ ВО ВСЕЙ WINDOWS, А В WIN2000 ТОЛЬКО В ПРЕДЕЛАХ МОЕГО ОКНА?
library Mouse;

uses
Windows,
Messages;
var
HookHandle: HHOOK = 0;

//функция обрабатывающая сообщения (мышиные)
function MouseProc(Code, W,l : Integer): LongInt; stdcall;
var
j,i:integer;
begin
if Code =HC_ACTION
then
begin
//составляем дополнительные параметры для нашего сообщения.
i:=makelparam(TMOUSEHOOKSTRUCT(Pointer(L)^).pt.x,TMOUSEHOOKSTRUCT(Pointer(L)^).pt.y);
j:=makeWparam(TMOUSEHOOKSTRUCT(Pointer(L)^).hwnd,w);
//отправляем сообщение наше программе.
SendMessage(FindWindow(nil,"MouseHook"), WM_USER,j ,i); // Уведомляем программу об этом.
end;
Result := CallNextHookEx(HookHandle, Code, W,L )
end;

function SetHook: LongBool; stdcall;
begin
//установка ловушки
HookHandle := SetWindowsHookEx(WH_Mouse, MouseProc, HInstance, 0);
Result := HookHandle <> 0 ;
end;

function RemoveHook: LongBool; stdcall;
begin
Result := UnHookWindowsHookEx(HookHandle)
//снятие ловушки
end;
exports
SetHook, RemoveHook; //экспортируемые функции
begin
end.

название окна запускающей программы должно быть соответственно MouseHook

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Forms,
Controls, StdCtrls, Classes;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
procedure user(var message:Tmessage) ; message wm_user;
{ Public declarations }
end;

var
Form1: TForm1;
function SetHook:longbool;stdcall; external "mouse" ;
function RemoveHook:longbool;stdcall; external "mouse" ;
// можно конечно и динамически подключать длл, но мне больше нравится так.
implementation
var
i:integer=0;
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption:="MouseHook"; // длл посылает сообщения нашему окну, ореинтируясь
//на его название
SetHook;// включаем ловушку, тут по идее надо бы сделать проверку запустилась она или нет
//т.е. если эта функция фернула False то ловушка не включилась.
end;

procedure tForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RemoveHook;// не забываем выключить ловушку по завершению программы
end;

procedure TForm1.user(var message:Tmessage);
{Эта процедура срабатывает каждый раз, когда в нашей библиотеке
проходит мышиное сообщение, соответственно тут можно просматривать какое сообщение
прошло, также это можно сделать и в самой длл-ке }
var
c:array [0..max_path] of char;
begin
i:=i+1;
label1.Caption:="К данному моменту мышь намотала "+inttostr(i)+" пикселей";
label2.Caption:="Координаты мыши по горизонтали = "+inttostr(message.LParamLo);
label3.Caption:="Координаты мыши по вертикали = "+inttostr(message.LParamHi);
label4.caption:="Дескриптор окна под мышью = "+inttostr(message.Wparamlo);
GetWindowText(message.Wparamlo,c,Sizeof(c));
label5.Caption:="Название окна под мышью = "+c;
GetClassName(message.Wparamlo,c,Sizeof(c));
label6.Caption:="Название класса окна под мышью = "+c;
Label7.Caption:=inttostr(message.WParamHi);
{как видно из показаний лейблов можно отслеживать любые сообщения лейбл №7 показывает
(в десятичном представлении) номер сообщения, в файле messages, если в него заглянуть,
можно увидить какому сообщению соответствует данное цифровое сочетание, только там
эти сочетания представленны в 16-ричном представлении}
end;
{Вобще-то если это должна быть программа типа шпиона , то лучше
делеать ее не используя VCL, тогда ее размер будет минимальным.}
end.


 
Flex   (2001-12-24 14:35) [1]

Сравни с моим обработчиком ->
function MProc(Code:integer;wParam:word;lParam:Longint):longint;stdcall;export;
var wnd:hWnd;
mhs:^tMOUSEHOOKSTRUCT;
begin
MProc:=0;
if(Code>=0)then begin
if code=hc_action then
begin
mhs:=pointer(lparam);lParam:=(mhs^.pt.x shl 16)+mhs^.pt.y;
wnd:=FindWindow(AppName,nil);if wnd<>0then SendMessage(Wnd,wm_nMouse,wParam,lParam);
end;
Result:=0;
end
else Result:=CallNextHookEx(mHook,Code,wParam,lParam);
end;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.014 c
4-79504
mikrom
2001-12-26 09:46
2002.02.25
Создание MDIChild из DLL


14-79449
False_Delirium
2002-01-08 05:49
2002.02.25
Так уж повелось...


1-79310
Egen
2002-02-07 13:03
2002.02.25
Освобождение ресурсов


1-79401
DimaIv
2002-02-08 19:51
2002.02.25
Программа на Delphi6 Требует библиотеку qtintf.dll почему


7-79492
ANDREY196
2001-11-18 23:37
2002.02.25
Как мне получить изображение с TV-карты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский