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 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一 ...
随机推荐
- 002PHP文件处理——文件处理 is_dir mkdir getcwd chdir rmdir
<?php /** * 66 文件处理 is_dir mkdir getcwd chdir rmdir */ //is_dir() 判断一个目录是否存在 //var_dump(is_dir('6 ...
- Sonar在ant工程中读取单元测试和覆盖率报告
虽然sonar支持ant工程的构建,但目前最大的不足是无法在分析过程中产生单元测试和覆盖率报告,这样在sonar面板上覆盖率板块就始终没有数据.但幸运的是,sonar可以读取已经生成好的报告,让报告的 ...
- SharePoint Development - Custom List using Visual Studio 2010 based SharePoint 2010
博客地址 http://blog.csdn.net/foxdave 之前两次我们定义了内容类型和字段,我们现在用它们为这一讲服务--创建一个自定义列表. 打开Visual Studio,打开之前的工程 ...
- New Concept English Two 13 31
$课文29 出租汽车 294. Captain Ben Fawcett has bought an unusual taxi and has begun a new service. 本.弗西特机长买 ...
- CentOS7进程管理systemd详解
概述: 系统启动过程中,当内核启动完成,后加载根文件系统,后就绪的一些用户空间的服务的管理工作,就交由init进行启动和管理,在CentOS6之前的init的管理方式都类似,相关的内容我们在之前的 ...
- 开始yaf之旅
目录结构 + public //网站根目录 - index.php //入口文件 - .htaccess //重写规则 + conf |- application.ini //配置文件 applica ...
- [QT_FFMPEG]学习问题: 刚开始移植ffmpeg,测试时出现 undefined reference to `avcodec_configuration()'
使用环境: window: win7 x64 QT: qt5.8.0 MinGW530 移植的教程: 流若浅 Qt ffmpeg环境搭建 : http://www.cnblogs.com/liuru ...
- StreamSets 部署 Pipelines 到 SDC Edge
可以使用如下方法: 下载edge 运行包并包含pipeline定义文件. 直接发布到edge 设备. 在data colelctor 机器配置并配置了edge server 地址(主要需要网络可访问) ...
- cratedb nodejs 试用
安装cratedb docker run -d -p 4200:4200 crate nodejs 项目初始化 yarn yarn init -y 添加依赖 yarn add node-crate 基 ...
- 用VSTS进行网站压力测试
情境压力测试即主体向被观察者布置一定任务和作业,借以观察个体完成任务的行为.工作样本测验.无领导小组讨论都可算作情境压力测验. 在软件工程中,压力测试是对系统不断施加压力的测试,是通过确定一个系统的 ...