请教各位大虾有关在vb.net中使用SetWindowsHookEx的问题

lliang2 2005-11-21 07:05:19
我在vb.net中使用SetWindowsHookEx函数老是出错,方法很简单,建立一个vb.net的工程,它就有个缺省的form,拷贝如下代码,运行,然后在出现的窗口上反复晃鼠标,必然要出错。

出错信息是:未处理的“System.NullReferenceException”类型的异常出现在 system.windows.forms.dll 中。

其他信息: 未将对象引用设置到对象的实例。


请教这是怎么回事?

下面是代码:

Imports System.Runtime.InteropServices

Public Class Form1
Inherits System.Windows.Forms.Form

Private isMousehooked As Boolean
Private hMousehook As Integer

Public Delegate Function HOOKPROC(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
'Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As HookType, ByVal lpfn As HOOKPROC, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As HOOKPROC, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer

Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer

Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal ncode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

Declare Function GetCurrentThreadId Lib "kernel32" Alias "GetCurrentThreadId" () As Integer


Private Const WH_MOUSE = 7

Private isMouseLeaved As Boolean = True

Private prevMousePoint As POINT

'Public Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
#Region " Enums and structs"
Public Enum Msg
WM_MOUSEMOVE = &H200
End Enum
Public Structure POINT
Public x As Integer
Public y As Integer
End Structure

Public Structure MOUSEHOOKSTRUCT
Public pt As POINT
Public hwnd As IntPtr
Public wHitTestCode As Integer
Public dwExtraInfo As IntPtr
End Structure
#End Region

Public Sub SetMouseHook()
If isMousehooked Then Exit Sub

hMousehook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc, 0, GetCurrentThreadId())
isMousehooked = True
End Sub

Public Sub RemoveMouseHook()
UnhookWindowsHookEx(hMousehook)
isMousehooked = False
End Sub

Public Function MouseProc(ByVal uCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

If wParam = Msg.WM_MOUSEMOVE Then ' And isMouseLeaved Then

Dim c As MOUSEHOOKSTRUCT = CType(Marshal.PtrToStructure( _
IntPtr.op_Explicit(lParam), GetType(MOUSEHOOKSTRUCT)), MOUSEHOOKSTRUCT)


If prevMousePoint.x = c.pt.x And prevMousePoint.y = c.pt.y Then
Else
If isMouseLeaved Then
isMouseLeaved = False
End If
prevMousePoint.x = c.pt.x
prevMousePoint.y = c.pt.y
End If
End If

MouseProc = CallNextHookEx(hMousehook, uCode, wParam, lParam)
End Function


#Region " Windows 窗体设计器生成的代码 "

Public Sub New()
MyBase.New()

'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub

'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(292, 273)
Me.Name = "Form1"
Me.Text = "Form1"

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SetMouseHook()
End Sub

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
RemoveMouseHook()
End Sub
End Class
...全文
415 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrtc 2006-02-06
  • 打赏
  • 举报
回复
不要在。net调试环境下运行,直接运行生成的exe文件就行了
hrtc 2006-02-06
  • 打赏
  • 举报
回复
我也碰到同样问题
内容概要:本文主要介绍了一个基于Matlab实现的无人机空通信仿真项目,旨在通过数值仿真手段研究无人机在空作为通信节点时的通信性能、信号传播特性和网络拓扑行为。该仿真涵盖了无人机飞行轨迹建模、无线信道建模(如路径损耗、多普勒效应、阴影衰落等)、通信链路建立与断判断、信号干扰分析以及网络性能评估(如吞吐量、延迟、连接可靠性等)。项目可能结合优化算法或智能控制策略,用于优化无人机位置部署或动态路径规划,以提升通信服务质量。整个仿真系统为研究人员提供了一套完整的工具链,用于验证新型无人机通信协议、协作机制和网络架构的有效性。; 适合人群:具备一定Matlab编程基础和通信原理基础知识,从事无人机、无线通信、网络优化等相关领域研究的研发人员和高校研究生。; 使用场景及目标:① 评估无人机作为空基站或继节点的通信覆盖能力和网络性能;② 设计和优化无人机集群的通信拓扑与协同策略;③ 验证新型无线资源分配、移动性管理和抗干扰算法在动态空地网络的有效性。; 阅读建议:使用者应结合Matlab代码深入理解仿真模型的构建逻辑,重点关注通信信道模块和无人机运动学模型的耦合关系,并可根据实际研究需求,对仿真参数(如环境噪声、飞行速度、天线增益)进行调整,以开展针对性的对比实验和性能分析。
内容概要:本文围绕微电网光伏发电系统经逆变器带负载的完整仿真模型展开研究,利用Simulink平台构建了从光伏阵列建模、DC-AC逆变器控制(包括PWM调制与电压电流双闭环控制)、并网策略到负载响应的全过程仿真系统。重点分析了系统在不同工况下的动态响应特性与电能质量表现,并对并网控制策略、最大功率点跟踪(MPPT)技术及系统稳定性进行了深入探讨和验证。该模型不仅可用于教学演示微电网的基本架构与运行机制,更为科研提供了可靠的仿真平台,支持对新型控制算法与系统优化方案的有效验证与评估。; 适合人群:具备一定电力电子技术、自动控制理论基础及Simulink/MATLAB操作经验的电气工程、自动化等相关专业的本科生、研究生及科研人员。; 使用场景及目标:①用于高校课程教学微电网系统结构与运行原理的直观演示;②为科研工作者提供光伏发电并网系统的仿真验证平台,支持开展逆变器控制算法(如双闭环控制、MPPT)、系统稳定性分析及电能质量管理等关键技术的研究与优化。; 阅读建议:建议学习者结合Simulink仿真环境动手搭建模型,重点关注各功能模块间的信号传递关系与关键参数设置,并通过调整光照强度、温度、负载大小等外部条件,观察系统动态响应过程,从而深化对微电网运行特性的理解与掌握。

16,718

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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