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 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一 ...
随机推荐
- Linux CentOS 6.5 使用自带jdk修改环境变量
首先声明,默认jdk指我们安装完CentOS后系统自带jdk,自己下载安装的jdk只需要下载,解压即可,之后步骤与此文一致 1.查看我们默认jdk的位置 指令: which java 我们去看一下发现 ...
- $'\r': command not found in Cygwin
这是因为windows下的回车符改为Unix下的回车符,用以下命令可以批量修改. dos2unix ./*
- 解决MySQL workbench的Can't connect to MySQL server on '127.0.0.1'(10061)问题
如题,今天打开MySQL时,出现了这种问题,无法连接到数据库 问题原因:The error (2003) Can't connect to MySQL server on 'server' (1006 ...
- Hadoop生态系统介绍
Hadoop生态系统Hadoop1.x 的各项目介绍1. HDFS2. MapReduce3. Hive4. Pig5. Mahout6. ZooKeeper7. HBase8. Sqoop9. Fl ...
- 一个简单的观察者模式的JS实现
这不是原创文章,主要是写给自己看的.原文比较详细容易让人,我提取最简单最好理解的部分,便于我以后用到.参考http://www.cnblogs.com/TomXu/archive/2012/03/02 ...
- 新书《Cocos2dx 3.x 3D图形学渲染技术讲解》问世
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- Zabbix proxy 3.2安装部署
zabbix proxy 前提环境: CentOS 6 LNMP(php) 版本:Zabbix-3.2.3 proxy安装 yum install -y net-snmp \ net-snmp-dev ...
- 对MYSQL慢查询slow query 日志记录内容的疑惑
初始:由于新装服务器出现CPU占用过高,响应不及时的问题排查,因为环境基于最基础的LAMP构架 想到开启 MYSQL slow_query_log 慢查询日志做原因分析: 但是看到日志内容之后有点茫然 ...
- BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)
2121: 字符串游戏 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 672 Solved: 376[Submit][Status][Discuss ...
- 360全景技术支持中心(KRPanoGUI三维全景制作软件)
http://www.360pano.cn/ http://www.360pano.cn/88/ http://www.suse.edu.cn/qjmy/hd/index.html