vb 2008 接收消息的问题。

brouno 2009-04-20 04:16:31
我用vb6作了一个接收消息的程序,没问题。
把该程序转移到vs2008的时候就出现了问题:
'UPGRADE_WARNING: Add a delegate for AddressOf WindowProc

运行也出现错误, 通过查询很多资料后,勉强可以,可是有warning。
期待高人。
vb6的代码大概如下:
Private Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Function Hook(ByVal hwnd As Long) As Long
Dim pOld As Long

pOld = SetWindowLong(hwnd, GWL_WNDPROC,AddressOf WindowProc)

SetWindowLong hwnd, GWL_USERDATA, pOld
Hook = pOld
End Function

Public Sub Unhook(ByVal hwnd As Long, ByVal lpWndProc As Long)
Dim temp As Long
temp = SetWindowLong(hwnd, GWL_WNDPROC, lpWndProc)
End Sub

Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_USER + 1 Then
MsgBox "msg received" & wParam 'wParam
End If
Dim lpPrevWndProc As Long
lpPrevWndProc = GetWindowLong(hw, GWL_USERDATA)
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function

...全文
82 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
brouno 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lyserver 的回复:]
以前弄过,机器重装后没状VS2008,无法给你代码,你搜索一下,有许多现成的说明。
[/Quote]

按照那些说明作了,还是有问题的。
lyserver 2009-04-20
  • 打赏
  • 举报
回复
以前弄过,机器重装后没状VS2008,无法给你代码,你搜索一下,有许多现成的说明。
brouno 2009-04-20
  • 打赏
  • 举报
回复
是,可是vb不熟悉,委托也没搞过。
lyserver 2009-04-20
  • 打赏
  • 举报
回复
需要用委托.
brouno 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lyserver 的回复:]
肯定要出问题,在使用SetWindowLong后,有可能窗口会发生一些消息,而这时SetWindowLong hwnd, GWL_USERDATA, pOld 还没被运行,从而使WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) 调用出错,要是在VB6是不会的,但VB.NET却可能出现。
解决办法,将
引用楼主 brouno 的帖子:
Public Function Hook(ByVal hwnd As Long) As Long
Dim pOld As Long

pOld = SetWindowLong(hwnd, …
[/Quote]




谢谢,可是这样错误是: error BC30581: 'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type.
lyserver 2009-04-20
  • 打赏
  • 举报
回复
肯定要出问题,在使用SetWindowLong后,有可能窗口会发生一些消息,而这时SetWindowLong hwnd, GWL_USERDATA, pOld 还没被运行,从而使WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) 调用出错,要是在VB6是不会的,但VB.NET却可能出现。
解决办法,将
[Quote=引用楼主 brouno 的帖子:]
Public Function Hook(ByVal hwnd As Long) As Long
Dim pOld As Long

pOld = SetWindowLong(hwnd, GWL_WNDPROC,AddressOf WindowProc)

SetWindowLong hwnd, GWL_USERDATA, pOld
Hook = pOld
End Function
[/Quote]
改为:
Public Function Hook(ByVal hwnd As Long) As Long
pOld=GetWindowLong(hwnd,GWL_WNPROC)
SetWindowLong hwnd, GWL_USERDATA, pOld
SetWindowLong(hwnd, GWL_WNDPROC,AddressOf WindowProc)
End Function
另外,建议使用Window的属性保存函数指针,因为某些窗口类会使用USERDATA,从而造成不可未知的问题。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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