VB HOOK是怎么一回事?

贝隆 2009-06-15 10:25:12
经常在论坛中看到HOOK一说,知道它是比较高深的东西,兄弟不才,想窥其一二,百度几次,没有得到好的答案。所以发帖请教各位高手!

HOOK到底是怎么一回事?!
...全文
258 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-06-22
  • 打赏
  • 举报
回复
谢谢各位!!!!!!!!!
贝隆 2009-06-19
  • 打赏
  • 举报
回复
用21楼的方法,还是没有解决我想解决的问题。
问题:
进程B中装载钩子函数,用以获取进程A中获得光标的控件的句柄。

现在的现象:
在同一进程中没有问题,但不同进程就不行了。

rmini 2009-06-19
  • 打赏
  • 举报
回复
值得学习!
贝隆 2009-06-19
  • 打赏
  • 举报
回复
非常感谢!
一笑拔剑 2009-06-19
  • 打赏
  • 举报
回复
http://www.symental.com/sfw?f=GetHwndAndClass



On Error Resume Next
Dim tPoint As POINTAPI
Dim hWin As Long
Dim Rtn As Long
Dim strControl As String * 255
Dim Txt(64000) As Byte
Static lngLastHwnd&
GetCursorPos tPoint '获得当前鼠标位置
hWin = WindowFromPoint(tPoint.x, tPoint.y) '获得窗口名柄
If lngLastHwnd = hWin Then Exit Sub Else lngLastHwnd = hWin

GetClassName hWin, strControl, 255 '获得窗口类
SendMessage hWin, &HD, 64000, Txt(0) '获得窗口标题(也可使用 API 函数:GetWindowText,但效果不佳)
Text1.Text = StrConv(Txt, vbUnicode)
Text2.Text = hWin
Text3.Text = strControl

If Not isShowAll Then Exit Sub
Text4.Text = "句柄" & Space(6) & "ID" & Space(4) & "类名" & Space(21) & "文本内容" & vbCrLf
Rtn = EnumChildWindows(hWin, AddressOf EnumChildProc, 0&)
一笑拔剑 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 lyserver 的回复:]
LZ的需求准确地说是子类化,跨进程子类人需要使用线程注入或标准DLL进行处理。
如果仅仅是获得光标所在位置的控件或窗体句柄,则可以使用以下函数:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
[/Quote]
这个可以

但是就跟钩子就无关了

你可以去网上搜索一个屏幕取色的代码

就是用了这两个函数完成获取句柄的任务的
lyserver 2009-06-19
  • 打赏
  • 举报
回复
LZ的需求准确地说是子类化,跨进程子类人需要使用线程注入或标准DLL进行处理。
如果仅仅是获得光标所在位置的控件或窗体句柄,则可以使用以下函数:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
贝隆 2009-06-18
  • 打赏
  • 举报
回复
如果这样:有进程A和进程B,A中有一个文本框,当鼠标点击它时,它获得焦点,我想在B中通过HOOK函数来取得它的句柄,该用什么消息来监视?API函数GetFocus可以取得拥有光标的控件的句柄,我用WH_MOUSE消息、WH_CBT消息试验了一下都没有成功。希望高手指点我一下。
贝隆 2009-06-18
  • 打赏
  • 举报
回复
受教!明天去试一试。
一笑拔剑 2009-06-18
  • 打赏
  • 举报
回复
这个是网上流传的鼠标键盘钩子

Private sub AddHook()
'键盘钩子
lHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0)
'鼠标钩子
lHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)
End Sub
'卸钩子
Private sub DelHook()
UnhookWindowsHookEx lHook(0)
UnhookWindowsHookEx lHook(1)
End Sub
'---------------------------------
'模块
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 Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Public Type KEYMSGS
vKey As Long '虚拟码 (and &HFF)
sKey As Long '扫描码
flag As Long '键按下:128 抬起:0
time As Long 'Window运行时间
End Type
Public Type MOUSEMSGS
X As Long 'x座标
Y As Long 'y座标
a As Long
b As Long
time As Long 'Window运行时间
End Type
Public Type POINTAPI
X As Long
Y As Long
End Type
Public Const WH_KEYBOARD_LL = 13
Public Const WH_MOUSE_LL = 14
Public Const Alt_Down = &H20
'-----------------------------------------
'消息
Public Const HC_ACTION = 0
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
'键盘消息
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105
'鼠标消息
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MBUTTONDBLCLK = &H209
Public Const WM_MOUSEACTIVATE = &H21
Public Const WM_MOUSEFIRST = &H200
Public Const WM_MOUSELAST = &H209
Public Const WM_MOUSEWHEEL = &H20A
Public Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Public strKeyName As String * 255
Public Declare Function GetActiveWindow Lib "user32" () As Long
Public keyMsg As KEYMSGS
Public MouseMsg As MOUSEMSGS
Public lHook(1) As Long
'----------------------------------------
'模拟鼠标
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4
Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute move
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
'--------------------------------------
'模拟按键
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
'鼠标钩子
Public Function CallMouseHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim pt As POINTAPI

If code = HC_ACTION Then
CopyMemory MouseMsg, lParam, LenB(MouseMsg)

Form1.txtMsg(1).Text = "X=" + Str(MouseMsg.X) + " Y=" + Str(MouseMsg.Y)
Form1.txtHwnd(1) = Format(wParam, "0")

If wParam = WM_MBUTTONDOWN Then '把中键改为左键
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
CallMouseHookProc = 1
End If

If wParam = WM_MBUTTONUP Then
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
CallMouseHookProc = 1
End If

End If

If code <> 0 Then
CallMouseHookProc = CallNextHookEx(0, code, wParam, lParam)
End If

End Function
'键盘钩子
Public Function CallKeyHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lKey As Long
Dim strKeyName As String * 255
Dim strLen As Long

If code = HC_ACTION Then
CopyMemory keyMsg, lParam, LenB(keyMsg)
Select Case wParam
Case WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP, WM_KEYUP:


lKey = keyMsg.sKey And &HFF '扫描码
lKey = lKey * 65536
strLen = GetKeyNameText(lKey, strKeyName, 250)
Form1.txtMsg(0).Text = "键名:" + Left(strKeyName, strLen) + " 虚拟码:" + Format(keyMsg.vKey And &HFF, "0") + " 扫描码:" + Format(lKey / 65536, "0")

Form1.txtHwnd(0) = ""
If (GetKeyState(vbKeyControl) And &H8000) Then
Form1.txtHwnd(0) = Form1.txtHwnd(0) + "Ctrl "
End If

If (keyMsg.flag And Alt_Down) <> 0 Then
Form1.txtHwnd(0) = Form1.txtHwnd(0) + "Alt "
End If

If (GetKeyState(vbKeyShift) And &H8000) Then
Form1.txtHwnd(0) = Form1.txtHwnd(0) + "Shift"
End If

'keyMsg.vKey And &HFF 虚拟码
'lKey / 65536 扫描码

If (keyMsg.vKey And &HFF) = vbKeyY Then '把Y键替换为N
If wParam = WM_SYSKEYDOWN Or wParam = WM_KEYDOWN Then
keybd_event vbKeyN, 0, 0, 0
End If
CallKeyHookProc = 1 '屏蔽按键
End If

End Select
End If

If code <> 0 Then
CallKeyHookProc = CallNextHookEx(0, code, wParam, lParam)
End If
End Function


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/c945124/archive/2005/05/23/379248.aspx
一笑拔剑 2009-06-18
  • 打赏
  • 举报
回复
你把你代码贴上来

键盘鼠标信息是可以挂钩子的

vb鼠标钩子有相关代码的
贝隆 2009-06-18
  • 打赏
  • 举报
回复
我的就是捕获鼠标消息,只是跨进程的而已,没有办法吗?
我认为问题的关键在于:
hmod: HINST; {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}
dwThreadId: DWORD {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}

这两个参数的设置。我就是这个问题没有解决。
一笑拔剑 2009-06-18
  • 打赏
  • 举报
回复
如果要设置系统级钩子, 钩子函数必须在 DLL 中.
--------------------------------------------------------------------------------

SetWindowsHookEx(
idHook: Integer; {钩子类型}
lpfn: TFNHookProc; {函数指针}
hmod: HINST; {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}
dwThreadId: DWORD {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}
): HHOOK; {返回钩子的句柄; 0 表示失败}

//钩子类型 idHook 选项:
WH_MSGFILTER = -1; {线程级; 截获用户与控件交互的消息}
WH_JOURNALRECORD = 0; {系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录}
WH_JOURNALPLAYBACK = 1; {系统级; 回放由 WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列}
WH_KEYBOARD = 2; {系统级或线程级; 截获键盘消息}
WH_GETMESSAGE = 3; {系统级或线程级; 截获从消息队列送出的消息}
WH_CALLWNDPROC = 4; {系统级或线程级; 截获发送到目标窗口的消息, 在 SendMessage 调用时发生}
WH_CBT = 5; {系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等}
WH_SYSMSGFILTER = 6; {系统级; 截获系统范围内用户与控件交互的消息}
WH_MOUSE = 7; {系统级或线程级; 截获鼠标消息}
WH_HARDWARE = 8; {系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息}
WH_DEBUG = 9; {系统级或线程级; 在其他钩子调用前调用, 用于调试钩子}
WH_SHELL = 10; {系统级或线程级; 截获发向外壳应用程序的消息}
WH_FOREGROUNDIDLE = 11; {系统级或线程级; 在程序前台线程空闲时调用}
WH_CALLWNDPROCRET = 12; {系统级或线程级; 截获目标窗口处理完毕的消息, 在 SendMessage 调用后发生}

事实上除非你使用一些特殊手段

vb能完成的hook只有键盘鼠标钩子,而跨进程的其他类型钩子,则无法完成

因为通常情况下vb生成的不是动态dll
贝隆 2009-06-18
  • 打赏
  • 举报
回复
不同进程间,怎么设置SetWindowsHookEx的参数?也就是该函数的最后两个参数怎么设置?我现在只能完成同一进程中的。
zzyong00 2009-06-18
  • 打赏
  • 举报
回复
如果是鼠标点击哪个文本框获得焦点,可以HOOK这个:WH_MOUSE_LL
东方之珠 2009-06-17
  • 打赏
  • 举报
回复
偷看...
舉杯邀明月 2009-06-16
  • 打赏
  • 举报
回复
不清楚,友情Up......
HL4567 2009-06-16
  • 打赏
  • 举报
回复
不懂的路过,顶
嗷嗷叫的老马 2009-06-16
  • 打赏
  • 举报
回复
VB要做其它类型HOOK,总需要辅助手段,比如用别的语言写DLL,或者内嵌汇编之类....
贝隆 2009-06-16
  • 打赏
  • 举报
回复
......
simon_sun这一刻你不是一个人!你是一个神!我太崇拜你了!!!
加载更多回复(9)

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧