hook鼠标
library dllMouse;
uses
SysUtils,
Classes,
UnitHookDLL in 'UnitHookDLL.pas',
UnitHookConst in 'UnitHookConst.pas'; {$R *.res}
{ function StartHook(sender : HWND;MessageID : WORD) : BOOL; stdcall;
function StopHook: BOOL; stdcall;
procedure GetRbutton; stdcall;} exports
StartHook, StopHook,GetRbutton; begin
end. {
截获鼠标消息例子.
截获所有进程的鼠标消息,需要用到系统钩子,即要用到dll才能够截取,因此挂
钩函数封装在dll动态链接库中.由于需要跨进程共享数据,所以在dll使用内存映像
文件来共享数据.
}
unit UnitHookDLL;
// download by http://www.codefans.net
interface uses Windows, Messages, Dialogs, SysUtils,UnitHookConst; var
hMappingFile : THandle;
pShMem : PShareMem;
FirstProcess : boolean;
NextHook: HHook; function StartHook(sender : HWND;MessageID : WORD) : BOOL; stdcall;
function StopHook: BOOL; stdcall;
procedure GetRbutton; stdcall; implementation procedure GetRbutton; stdcall;
begin
pShMem^.IfRbutton:=true;
end; function HookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;
begin
Result := ;
If iCode < Then Result := CallNextHookEx(NextHook, iCode, wParam, lParam); case wparam of
WM_LBUTTONDOWN:
begin
end;
WM_LBUTTONUP:
begin
end;
WM_LBUTTONDBLCLK:
begin
end;
WM_RBUTTONDOWN:
begin
if pShMem^.IfRbutton then
begin
pShMem^.IfRbutton := false;
pShMem^.data2:=pMOUSEHOOKSTRUCT(lparam)^;
getwindowtext(pShMem^.data2.hwnd,pShMem^.buffer,);
SendMessage(pShMem^.data1[],pShMem^.data1[]+,wParam,integer(@(pShMem^.data2)) );
// 窗口 消息 坐标
end;
end;
WM_RBUTTONUP:
begin
end;
WM_RBUTTONDBLCLK:
begin
end;
WM_MBUTTONDOWN:
begin
end;
WM_MBUTTONUP:
begin
end;
WM_MBUTTONDBLCLK:
begin
end;
WM_NCMouseMove, WM_MOUSEMOVE:
begin
pShMem^.data2:=pMOUSEHOOKSTRUCT(lparam)^;
getwindowtext(pShMem^.data2.hwnd,pShMem^.buffer,);
SendMessage(pShMem^.data1[],pShMem^.data1[],wParam,integer(@(pShMem^.data2)) );
// 窗口 消息 坐标
end;
end;
end; function StartHook(sender : HWND;MessageID : WORD) : BOOL;
function GetModuleHandleFromInstance: THandle;
var
s: array[..] of char;
begin
GetModuleFileName(hInstance, s, sizeof(s)-);
Result := GetModuleHandle(s);
end;
begin
Result := False;
if NextHook <> then Exit;
pShMem^.data1[]:=sender;
pShMem^.data1[]:=messageid;
NextHook :=
SetWindowsHookEx(WH_mouse, HookHandler, HInstance, ); //全局
//SetWindowsHookEx(WH_mouse, HookHandler, GetModuleHandleFromInstance, GetCurrentThreadID); //实例
Result := NextHook <> ;
end; function StopHook: BOOL;
begin
if NextHook <> then
begin
UnhookWindowshookEx(NextHook);
NextHook := ;
//SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
end;
Result := NextHook = ;
end; initialization
hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);
if hMappingFile= then
begin
hMappingFile := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,,SizeOf(TShareMem),MappingFileName);
FirstProcess:=true;
end
else FirstProcess:=false;
if hMappingFile= then Exception.Create('不能建立共享内存!'); pShMem := MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,,,);
if pShMem = nil then
begin
CloseHandle(hMappingFile);
Exception.Create('不能映射共享内存!');
end;
if FirstProcess then
begin
pShmem^.IfRbutton := false;
end;
NextHook:=;
finalization
UnMapViewOfFile(pShMem);
CloseHandle(hMappingFile); end. unit Unitmain; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,UnitHookConst; type
TForm1 = class(TForm)
edt1: TEdit;
edt2: TEdit;
capture: TButton;
edt3: TEdit;
btn2: TButton;
lbl1: TLabel;
edt4: TEdit;
edt5: TEdit;
edt6: TEdit;
pnl1: TPanel;
procedure captureClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
procedure WndProc(var Messages: TMessage); override;
end; var
Form1: TForm1;
hMappingFile : THandle;
pShMem : PShareMem;
const MessageID = WM_User + ; implementation {$R *.DFM}
//dllMouse.dll DllMouse.DLL
function StartHook(sender : HWND;MessageID : WORD) : BOOL;stdcall; external 'dllMouse.dll';
function StopHook: BOOL;stdcall; external 'dllMouse.dll';
procedure GetRbutton; stdcall; external 'dllMouse.dll'; procedure TForm1.captureClick(Sender: TObject);
begin
if capture.caption='开始' then
begin
if StartHook(Form1.Handle,MessageID) then
capture.caption:='停止';
end
else begin
if StopHook then
capture.caption:='开始';
end;
end; procedure TForm1.btn2Click(Sender: TObject);
begin
if capture.caption<>'开始' then
begin
edt4.text:='';
edt5.text:='';
edt6.text:='';
GetRbutton;
end;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
pShMem := nil;
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if capture.caption='开始' then
begin
end
else begin
if StopHook then
capture.caption:='开始';
end;
end; procedure TForm1.WndProc(var Messages: TMessage);
var
x,y:integer;
s:array[..]of char;
begin
if pShMem = nil then
begin
hMappingFile := OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);
if hMappingFile= then Exception.Create('不能建立共享内存!');
pShMem := MapViewOfFile(hMappingFile,FILE_MAP_WRITE or FILE_MAP_READ,,,);
if pShMem = nil then
begin
CloseHandle(hMappingFile);
Exception.Create('不能映射共享内存!');
end;
end;
if pShMem = nil then exit;
if Messages.Msg = MessageID then
begin
x:=pShMem^.data2.pt.x;
y:=pShMem^.data2.pt.y;
edt3.text:='HWND:'+inttostr(pShMem^.data2.hwnd);
pnl1.caption:='x='+inttostr(x)+' y='+inttostr(y);
edt2.text:='WindowsText:'+string(pShMem^.buffer);
getClassName(pShMem^.data2.hwnd,s,);
edt1.text:='ClassName:"'+string(s)+'"';
end
else if Messages.Msg = MessageID+ then
begin
edt4.text:=inttostr(pShMem^.data2.hwnd);
edt5.text:='WindowsText:'+string(pShMem^.buffer);
getClassName(pShMem^.data2.hwnd,s,);
edt6.text:='ClassName:"'+string(s)+'"';
end
else Inherited;
end; end.
hook鼠标的更多相关文章
- hook 鼠标键盘消息实例分析
1.木马控制及通信方法包含:双管道,port重用.反弹技术.Hook技术,今天重点引用介绍一下hook的使用方法,hook信息后能够将结果发送到hacker邮箱等.实现攻击的目的. 转自:http:/ ...
- hook鼠标键盘记录和回放
unit Unit1; // download by http://www.codefans.net interface uses Windows, Messages, SysUtils, Class ...
- WndProc和hook区别
1)WndProc函数作用:主要在程序中拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息.这个函数就是默认的消息处理函数.你可以重载这个函数 ...
- JavaScript常用的Hook脚本
JavaScript常用的Hook脚本 本文Hook脚本 来自 包子 页面最早加载代码Hook时机 在source里 用dom事件断点的script断点 然后刷新网页,就会断在第一个js标签,这时候就 ...
- Visual C++2010开发权威指南 中文高清PDF - VC.NET
第一部分 Visual C++ 2010开发与新特性第1章 Visual C++ 2010开发环境简介 11.1 Visual C++ 2010简介 11.2 Visual C++ 2010下 ...
- SetWindowsHookEx失败
使用下面代码hook鼠标 res = SetWindowsHookEx(WH_MOUSE_LL, _mouseHookProcedure, Marshal.GetHINSTANCE(System.Re ...
- C# 编写 Windows 动态桌面软件实现(一)之桌面交互功能
DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能.这个功能不会影响性能,基本不占用 CPU.这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍 ...
- 分享一个WPF 实现 Windows 软件快捷小工具
分享一个WPF 实现 Windows 软件快捷小工具 Windows 软件快捷小工具 作者:WPFDevelopersOrg 原文链接:https://github.com/WPFDevelopers ...
- c# 使用hook来监控鼠标键盘事件的示例代码
如果这个程序在10几年前,QQ刚刚兴起的时候,有了这个代码,就可实现盗号了. 当然使用钩子我们更多的是实现"全局快捷键"的需求. 比如 程序最小化隐藏后要"某快捷键&qu ...
随机推荐
- angular.js开发 将多页面开发成单页面
用angulara.js做单页面开发时,由于不能跨页面取数据,又需要传参,可以采用:$scope.step=0/1来解决这个问题,设置初始值为想要的页面即可.
- 向量容器vector操作
1.向量容器vector 1.1 vector说明 进行vector操作前应添加头文件#include<vector>: vector是向量类型,可以容纳许多类型的数据,因此也被称为容器: ...
- uniapp 小程序 flex布局 v-for 4栏展示
注:本项目的图片资源来源于后端接口,所以使用的是v-for. 关键词:uniapp 小程序 flex布局 v-for 4栏展示 自适应 <view style="display: fl ...
- 格雷码(Grey Code)生成规则
(1) Grey码在FPGA实际应用中是实用的码,在8421BCD码累加计数器中,如果寄存器需要发生多位(两位或者以上)的跳变,会出现中间态,这样作为组合逻辑的输入是不稳妥的. 下面看两个中间态的例子 ...
- Golang的运算符-算数运算符
Golang的运算符-算数运算符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.算术运算符概述 常见的算术运算符: +: 可表示正号,如",结果为"Jaso ...
- RadioButton之互斥选择和Toast显示
前言: RadioButton用来单选并且用Toast来进行提示所选内容 RadioButton标签单独写的时候不能出现互斥现象,代码如下 <RadioButton android:layout ...
- l5213. 玩筹码
这道题本应该很简单的但是我把他复杂化了,所以没有在第一时间里A出来.我们来看看题目 看上去是不是很复杂,思路是有,但是,很难实现.我最开始的时候是认为有三种情况,左边筹码最多,右边筹码最多,中间筹码最 ...
- windows中的运行命令
首先按“开始”-“运行”,或按WIN键+R,进入『运行』窗口. 下面是常用的运行命令 (按英文字符顺序排列) appwize.cpl----添加.删除程序 access.cpl-----辅助功能选项 ...
- 【LeetCode】反转字符串
[问题] 编写一个函数,其作用是将输入的字符串反转过来. 示例 : 输入: "hello" 输出: "olleh" 示例 : 输入: "A man, ...
- 123-PHP类构造函数
<?php class ren{ //定义人类 private $name; //定义成员属性 public function __construct($name){ //定义构造函数 $thi ...