VB指针操作和消息钩子
真实的数组
End Type
(Destination As Any, Source As Any, ByVal Length As Long)
PVOID Destination,
CONST VOID *Source,
DWORD Length
);
outputArray() As Byte
pOutputArray =
VarPtr(outputArray(0))
有时候,系统函数库调用中会要求有回调函数,而将回调函数以参数进行传递时,并不能传入回调函数名,而是需要将回调函数的地址传参,这时候,我们就需要得到回调函数的地址。
'GetWindowLong从指定窗口的结构中取得信息
prevWndProc =
GetWindowLong(hwnd, GWL_WNDPROC)
'SetWindowLong在窗口结构中为指定的窗口设置信息
SetWindowLong hwnd, GWL_WNDPROC, AddressOf WndProc
DesthWnd = hwnd
End
Sub
VB一直被认为是一个可以通过简单的方法,完成Windows界面应用程序的一个语言。对Windows系统方面的编程似乎首先想到的绝对不是VB,而大部分程序员想到的一定是VC。我们今天就介绍一种用VB截获Windows全局消息的方法。
例如:鼠标在自定义的窗口中移动的位置,我们可以通过这个Form中的相关方法获取,然而,如果鼠标并没有在自己的Form中移动又该怎么获得其位置呢?
对单片机有了解的朋友都知道,鼠标和键盘的操作都是利用的是“中断”触发事件来完成的,那么当系统“中断”的时候,就会发出消息给操作系统,而这些消息就是Windows全局消息。
钩子是通过英文Hook翻译过来的,所谓的钩子就是在Windows全局消息传递到操作系统之前进行截获,经过处理后再传递给操作系统或者其他钩子的程序。
但是,钩子其本身并不是病毒,而是提供给我们程序员一种获取操作系统动作的一个方法,这个方法有时候非常有用,可以非常方便的开发针对操作系统的优质程序。
这两种消息是发送到窗口过程的消息,系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC,并且在窗口过程处理完消息之后调用WH_CALLWNDPRO
。
2) 系统钩子:监视系统中的所有线程的事件消息。
0)
ByVal lparam As Long) As Long
Dim typMHS As MSLLHOOKSTRUCT, pt As
POINTAPI
Call CopyMemory(typMHS, ByVal
lparam, LenB(typMHS))
pt = typMHS.pt
'If PtInRect(hRT,
pt.x, pt.y) <> 0 Then
' HookProc = 1 '取消原本要完成的動作
'Else
Form1.Caption = "mouse Cursor at " + CStr(pt.x) + "," +
CStr(pt.y)
HookProc = 0 '令待完成的動作繼續完成
'End If
End If
If wParam = WM_LBUTTONDOWN Then
Debug.Print
"l"
End If
If wParam = WM_RBUTTONDOWN Then
Debug.Print "r"
End If
'If nCode < 0 Then
HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
' Exit
Function
'End If
End Function
ByVal lparam As Long) As Long
wParam,lParam:包含了拦截到的消息内容,同样它也与Hook的种类和nCode的值不同而不同。比如在键盘钩子(KeyBoard)中,wParam则是按键返回码。如果是鼠标事件,那么包含的鼠标的位置信息和按键信息。
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias
"RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As
Long)
Private 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
Private Declare Function
UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode
As Long, ByVal wParam As Long, lparam As Any) As Long
Private Const WH_MOUSE_LL As Long =
14
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN =
&H201
Private Const WM_LBUTTONUP = &H202
Private Const
WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN =
&H204
Private Const WM_RBUTTONUP = &H205
Private Const
WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDOWN =
&H207
Private Const WM_MBUTTONUP = &H208
Private Const
WM_MBUTTONDBLCLK = &H209
Private Const WM_MOUSEACTIVATE =
&H21
Private Const WM_MOUSEFIRST = &H200
Private Const
WM_MOUSELAST = &H209
Private Const WM_MOUSEWHEEL = &H20A
'以上是鼠标的各个值
x As Long
y As Long
End Type
pt As POINTAPI
mouseData As
Long
Flags As Long
time As Long
dwExtraInfo As Long
End
Type
If hHook = 0 Then
hHook =
SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End
If
End Sub
If hHook <> 0 Then
Call
UnhookWindowsHookEx(hHook)
hHook = 0
End If
End Sub
lparam As Long) As Long
Dim typMHS As MSLLHOOKSTRUCT, pt As
POINTAPI
Call CopyMemory(typMHS, ByVal
lparam, LenB(typMHS))
pt = typMHS.pt
Debug.Print "mouse
Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
End If
If
wParam = WM_LBUTTONDOWN Then
Debug.Print "l"
End If
If wParam = WM_RBUTTONDOWN Then
Debug.Print "r"
End
If
HookProc = CallNextHookEx(hHook, nCode, wParam,
lparam)
End Function
EnableHook
End Sub
FreeHook
End
Sub
VB指针操作和消息钩子的更多相关文章
- windows消息钩子注册底层机制浅析
标 题: [原创]消息钩子注册浅析 作 者: RootSuLe 时 间: 2011-06-18,23:10:34 链 接: http://bbs.pediy.com/showthread.php?t= ...
- 2019-11-12-WPF-添加窗口消息钩子方法
title author date CreateTime categories WPF 添加窗口消息钩子方法 lindexi 2019-11-12 18:46:53 +0800 2019-06-05 ...
- Win64 驱动内核编程-28.枚举消息钩子
枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之 ...
- VB.NET操作Excel
VB.NET操作Excel的基本方法与例子:
- C#指针操作Marshal实例
static void Main(string[] args) { ,,,}; ,,,}; IntPtr pt = Marshal.AllocHGlobal(a.Length); //从source数 ...
- 【转】VC++消息钩子编程
VC++消息钩子编程
- windows消息钩子
1.消息钩子的概念: Windows应用程序是基于消息驱动的,不论什么线程仅仅要注冊窗体类都会有一个消息队列用于接收用户输入的消息和系统消息.为了拦截消息,Windows提出了钩子的概念.钩子(Hoo ...
- C语言指针操作
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...
- Day4:T1小技巧(类似于指针操作)T2搜索+小细节
Day4:其中有很多小技巧get T1 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一 ...
随机推荐
- vscode的keybindings.json 和 AHK 脚本映射Win键
vscodehotkey.ahk https://github.com/m2nlight/AHKVSCodeLikeMac ; Shortcuts like mac ; Written by Bob ...
- tomcat 容器下web项目由http改为https操作步骤及相关的坑
一.https介绍: HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP ...
- mysql 常见数据类型
---恢复内容开始--- MySQL常见的数据类型 一.数据类型是什么? 数据类型是指列.存储过程参数.表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型. 有一些数据是要存储为 ...
- Digitalocean+DNSPod搭建Meteor.js博客Telescope.js
1. 什么是Meteor.js 基于Node.js的一个快速开发平台. 简言之,Node.js>Meteor.js 对等于Ruby>Ruby on Rails的关系. 官网:http:// ...
- hdu3572
题解: 网络流 判断是否为漫流 代码: #include <cstdio> #include <cstring> #include <algorithm> #inc ...
- java之double类型数值的比较
先看demo: public class L26 { /** * @param args */ public static void main(String[] args) { // TODO Aut ...
- linux查看端口对应的程序及pid
linux中查看特定端口对应的进程以及进程的pid可以使用下面指令: lsof -i:port_number 杀死进程的指令是: kill -s 9 pid
- HDU1501 dfs
像这样有维度的一定要记忆化啊........... #include<cstdio> #include<cstdlib> #include<iostream> #i ...
- 使用TortoiseGit+码云管理项目代码
1.下载安装msysgit. 2.下载安装tortoisegit. 3.创建ssh密钥. 开始–所有程序–TortoiseGit–PuTTYgen 生成方法:点击“Generate”后,鼠标在key下 ...
- noi.ac上的一套(假)NOI题
noi.ac上的一套(假)NOI题 本来想着可以刷点通过量的,结果发现好像并不是这样的. 整数 description 给你\(n,p\),要你求\(\sum_{k=1}^n\sum_{i=1}^k\ ...