vb.net Invoke”类型的已垃圾回收委托进行了回调

美薇 2019-04-19 12:32:34
做个签名版二次开发,运行刚开始正常,过一会儿出现下面面错误,应该是哪个委托声明错误,不知怎么解决



WindowsApplication1.Module1+SubClassProcDelegate::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Module1.SubclassWindow(Me.Handle)
End Sub




[code=textModule Module1

Public Const HD_OK As Integer = 31111
Public Const HD_CANCEL As Integer = 31112
Public Const HD_REALTIMEDATA As Integer = 31113
Public inkingWindowWidth As Integer
Public inkingWindowHeight As Integer
Private Const GWL_WNDPROC = (-4)
Private procOld As Integer

Private Declare Function CallWindowProc Lib "USER32.DLL" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Integer, ByVal hWnd As Integer, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As SubClassProcDelegate) As Integer '重载API函数,最后一个参数为委托类型,注意Long类型参数变成了Integer.

Delegate Function SubClassProcDelegate(ByVal hwnd As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer '定义窗口过程的委托类型

Public Sub SubclassWindow(ByVal hWnd As Integer)
procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubWndProc)
End Sub


Public Function SubWndProc(ByVal hWnd As Integer, ByVal iMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
If hWnd = Form1.Handle.ToInt32 Then
Dim X, Y, Pressure, IsPenDown As Integer
X = wParam And 65535
Y = (wParam / 65536) And 65535

X = (X / 65535 * inkingWindowWidth) And 65535
Y = (Y / 65535 * inkingWindowHeight) And 65535

Pressure = lParam And 65535
IsPenDown = (lParam / 65536) And 65535

SubWndProc = True
Exit Function
End If
SubWndProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
End Function

End Module
][/code]
...全文
201 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 元老 2019-04-25
  • 打赏
  • 举报
回复
嗷鼠标钩子,这个事儿啊。。。问题就在于那个Addressof .....把它拿出来,在模块里面声明一个私有的变量就可以保持不被垃圾回收干掉了。
private replProc as SubClassProcDelegate = new SubClassProcDelegate(AddressOf SubWndProc)
嗯。。。。。嗯。。然后稍微改一下代码
procOld = SetWindowLong(hWnd, GWL_WNDPROC, replProc)


就可以咯。
stherix 2019-04-19
  • 打赏
  • 举报
回复
代码不全 不是这里的问题 是你向winapi注册的回调方法(委托)所在的实例已经被释放掉了 这时候回调方法是个无效的函数指针

16,554

社区成员

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

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