分享
 
 
 

深入浅出HOOKS(之肆)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

利用VB建立鼠标键盘操作回放

很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用

了Windows的Hook函数。本文介绍如何通过使用VB来实现鼠标键盘操作的纪录和回放。

Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows

消息,函数语法为:

Public Declare Function SetWindowsHookEx Lib "user32" _

Alias "SetWindowsHookExA" _

(ByVal idHook As Long, _

ByVal lpfn As Long, _

ByVal hmod As Long, _

ByVal dwThreadId As Long) As Long

其中参数idHook指定建立的监视函数类型。通过Windows MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同

的消息监视类型,在这里我们将使用WH_JOURNALRECORD和WH_JOURNALPLAYBACK来监视键盘和鼠标操作。参数lpfn指定消

息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。函数的一般形式为:

Hookproc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;

其中code为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。只要在程序中建立这样

一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。

在不需要监视系统消息时需要调用提供UnHookWindowsHookEx来解除对消息的监视。

WH_JOURNALRECORD和WH_JOURNALPLAYBACK类型是两种相反的Hook类型,前者获得鼠标、键盘动作消息,后者回放鼠

标键盘消息。所以在程序中我们需要建立两个消息函数,一个用于纪录鼠标键盘操作并保存到一个数组中,另一个用于

将保存的操作返给系统回放。

下面是具体的程序实现:首先建立一个新工程,在Form1中加入三个CommandButton控件用于控制消息钩子,另外还

可以增加若干Command或者TextBox控件用于检验操作回放的效果。然后在工程中增加一个模块文件,在模块中加入以下

定义和代码:

Option Explicit

Public Type EVENTMSG

message As Long

paramL As Long

paramH As Long

time As Long

hwnd As Long

End Type

Public Declare Function CallNextHookEx Lib "user32" _

(ByVal hHook As Long, _

ByVal ncode As Long, _

ByVal wParam As Long, _

ByVal lParam As Long) As Long

Public Declare Function SetWindowsHookEx Lib "user32" _

Alias "SetWindowsHookExA" _

(ByVal idHook As Long, _

ByVal lpfn As Long, _

ByVal hmod As Long, _

ByVal dwThreadId As Long) As Long

Public Declare Sub CopyMemoryT2H Lib "kernel32" _

Alias "RtlMoveMemory" _

(ByVal Dest As Long, _

Source As EVENTMSG, _

ByVal Length As Long)

Public Declare Sub CopyMemoryH2T Lib "kernel32" _

Alias "RtlMoveMemory" _

(Dest As EVENTMSG, _

ByVal Source As Long, _

ByVal Length As Long)

Public Declare Function UnhookWindowsHookEx Lib "user32" _

(ByVal hHook As Long) As Long

Public Const WH_JOURNALPLAYBACK = 1

Public Const WH_JOURNALRECORD = 0

Public Const HC_SYSMODALOFF = 5

Public Const HC_SYSMODALON = 4

Public Const HC_SKIP = 2

Public Const HC_GETNEXT = 1

Public Const HC_ACTION = 0

Public EventArr(1000) As EVENTMSG

Public EventLog As Long

Public PlayLog As Long

Public hHook As Long

Public hPlay As Long

Public recOK As Long

Public canPlay As Long

Public bDelay As Boolean

Public Function HookProc(ByVal iCode As Long, ByVal wParam As Long, _

ByVal lParam As Long) As Long

Dim Result As Long

recOK = 1

Result = 0

If iCode < 0 Then 'iCode小于0必须直接调用下一个消息钩子函数

Result = CallNextHookEx(hHook, iCode, wParam, lParam)

ElseIf iCode = HC_SYSMODALON Then '不允许纪录

recOK = 0

ElseIf iCode = HC_SYSMODALOFF Then '允许纪录

recOK = 1

ElseIf ((recOK > 0) And (iCode = HC_ACTION)) Then

'将消息纪录在纪录队列中

CopyMemoryH2T EventArr(EventLog), lParam, Len(EventArr(EventLog))

EventLog = EventLog + 1

If EventLog >= 1000 Then

'当纪录大于1000后释放消息钩子

UnhookWindowsHookEx hHook

End If

End If

HookProc = Result

End Function

Public Function PlaybackProc(ByVal iCode As Long, ByVal wParam As Long, _

ByVal lParam As Long) As Long

Dim Result As Long

canPlay = 1

Result = 0

If iCode < 0 Then 'iCode小于0必须直接调用下一个消息钩子函数

Result = CallNextHookEx(hPlay, iCode, wParam, lParam)

ElseIf iCode = HC_SYSMODALON Then '不允许回放

canPlay = 0

ElseIf iCode = HC_SYSMODALOFF Then '允许回放

canPlay = 1

ElseIf ((canPlay = 1) And (iCode = HC_GETNEXT)) Then

If bDelay Then

bDelay = False

Result = 50

End If

'从纪录队列中取出消息并赋予lParam指针指向的EVENTMSG区域

CopyMemoryT2H lParam, EventArr(PlayLog), Len(EventArr(EventLog))

ElseIf ((canPlay = 1) And (iCode = HC_SKIP)) Then

bDelay = True

PlayLog = PlayLog + 1

End If

If PlayLog >= EventLog Then

UnhookWindowsHookEx hPlay

End If

PlaybackProc = Result

End Function

在Form1的代码窗口中加入以下代码:

Option Explicit

Private Sub Command1_Click()

EventLog = 0

hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, _

App.hInstance, 0)

Command2.Enabled = True

Command1.Enabled = False

End Sub

Private Sub Command2_Click()

UnhookWindowsHookEx hHook

hHook = 0

Command1.Enabled = True

Command2.Enabled = False

Command3.Enabled = True

End Sub

Private Sub Command3_Click()

PlayLog = 0

hPlay = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf PlaybackProc, _

App.hInstance, 0)

Command3.Enabled = False

End Sub

Private Sub Form_Load()

Command1.Caption = "纪录"

Command2.Caption = "停止"

Command3.Caption = "回放"

Command2.Enabled = False

Command3.Enabled = False

End Sub

运行程序,点击“纪录”按钮,然后在TextBox中输入一些文字或者在窗口上移动光标后再按“停止”键停止消息

纪录,然后按“回放”按钮,可以看到刚才鼠标键盘的操作被丝毫不差的回放了出来。

从上面的程序可以看到:通过WH_JOURNALRECORD可以建立一个鼠标键盘消息钩子,当每一个鼠标键盘消息产生时被

钩子函数被调用。在钩子函数中可以将消息保存在消息事件队列中。然后通过WH_JOURNALPLAYBACK建立消息回放钩子,

当每一次系统可以回放消息时就会调用钩子函数,在钩子函数中就可以从消息队列中取出原来纪录的消息返回给系统。

这样就实现了鼠标键盘操作的纪录和回放。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有