上一篇 | 下一篇

如何使键盘、Mouse失效(JournalPlayBack Hook)

发布: 2008-6-26 09:05 | 作者: admin | 来源: | 查看: 1次

我们常见一些导览系统或教学系统,会自动移动Mouse与Keyin字,而那个时候,我们

不管Keyin或动Mouse都没有效,直到完成了导览系统的某个动作後才让使用者可以移

动Mouse与做Keyin的动作;想做到这个,要借重JournalPlayBack Hook。

JournalPlayBack Hook,它和JournalRecord Hook合称Journal Hook,它们作用

的范围是整个System,也就是挂上这个Hook後,影响的层面不单是这个Process,而是

所有的Process,而这两Hook又不用写在Dll之中,所以很好用。

首先我们要知道由键盘和Mouse输入等的硬体讯息,会存到一个System Queue而後OS会

到该System Queue看有没有讯息在其中,若有则撷取出来,看目前Active的Window是谁

而将讯息Post给它。而挂上JournalRecord Hook时,当有讯息被撷取出来时,会先执行

我们所设定的Hook Function(在vb中,一定要放在.BAS档之中)。这可以做什麽事呢?

例如们可以Check整个系统是否有按了键盘或有没有移动Mouse(一般来说,KeyUp,KeyDown

, MouseMove等Event只有Form在Active 时才收得到,挂上JournalRecord hook後,执行

Hook的thread便能收到所有这些讯息)。再如,它既然能收到Keyboard、Mouse的讯息,那

便可以将收到的讯息记录起来(记录於Memory或Disk都可以),之後再依方才的顺序重新

将讯息放送出来,可重新执行方才的动作(这不就是巨集的作法吗),或许

它叫JournalRecord便是这个原因。再来便是播放记录讯息的问题了,如果一面播放,一

面有其他讯息插队(如移动Mouse),那就不对了,所以JournalPlayBack这个Hook它会

让Mouse、Keyboard都失效,当OS 要求读System Queue时,便会启动这个Hook,就在此

时,我们可以把方才记录起来的讯息丢出一个出来,OS再要求读System Queue时,再丢

下一个讯息,如此达重播的效果(所以才叫JournalPlayBack),正因它会让键盘、Mouse

失效,拿它来做导览、教学系统的自动Move Mouse或文字显示是最适合的了。

Mouse的自动导引系统制作方式,可叁考如何自动移动Mouse

'以下在.Bas中

Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)

Const WM_MOUSELAST = &H209

Const WM_MOUSEFIRST = &H200

Public Const WM_KEYLAST = &H108

Public Const WM_KEYFIRST = &H100

Public Const WH_JOURNALRECORD = 0

Public Const WH_JOURNALPLAYBACK = 1

Type EVENTMSG

message As Long

paramL As Long

paramH As Long

time As Long

hwnd As Long

End Type

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

Declare Function UnhookWindowsHookEx Lib "user32" _

(ByVal hHook As Long) As Long

Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _

ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long

Public hNxtHook As Long ' handle of Hook Procedure

Public msg As EVENTMSG

Sub EnableHook()

hNxtHook = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf HookProc, App.hInstance, 0)

End Sub

Sub FreeHook()

Dim ret As Long

ret = UnhookWindowsHookEx(hNxtHook)

End Sub

Function HookProc(ByVal code As Long, ByVal wParam As Long, _

ByVal lParam As Long) As Long

HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam)

End Function

'以下在Form中,需求:一个Command1, 一个text1

Private Sub Command1_Click()

Dim str5 As String, len5 As Long, i As Long

Call EnableHook

str5 = "这是一个测试JournalPlayBackHook的程式"

len5 = Len(str5)

For i = 1 To len5

Text1.Text = Mid(str5, 1, i)

Text1.Refresh

Sleep (200)

Next

Call FreeHook

End Sub



字号: | 推荐给好友

评分:0

我来说两句