中易网

VB的回调函数问题

答案:2  悬赏:0  
解决时间 2021-04-28 06:47

Public OldProc As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_CONTEXTMENU = &H7B&

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long

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 Function TextWndProc(ByVal hWnd As Long, ByVal wMsg As Long, _
                            ByVal wParam As Long, ByVal lParam As Long) As Long
    If wMsg = WM_CONTEXTMENU Then
        TextWndProc = 0
        Exit Function
    End If
    TextWndProc = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
End Function

'窗体
Private Sub Form_Load
     OldProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
     SetWindowLong Text1.hWnd, GWL_WNDPROC, AddressOf TextWndProc
End Sub
'解除禁止
Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Text1.hWnd, GWL_WNDPROC, OldProc
End Sub


请问:
1.GWL_WNDPROC是该窗口的窗口函数的地址,那请问什么叫窗口的窗口函数的地址???
2.GetWindowLong的返回值OldProc指的是什么???
3.SetWindowLong函数的第三个参数是什么??为什么设置了函数的入口地址AddressOf TextWndProc,而解除禁止为什么还用了OldProc??
4. TextWndProc = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)  在回调函数中,为什么一个要写CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam),难道写TextWndProc=1或者TextWndProc=0不行吗???
请大家4个问题都回答下 ,谢谢

最佳答案

1和2问题,请查MSDN可以知道:GetWindowLong用于返回窗口的一些信息,而GWL_WNDPROC表示要返回该窗口的处理程序的地址,而且这个处理程序必须用CAllWindowProc函数来调用,所以返回值是个窗口处理程序的地址OldProc


SetWindowLong用于改变窗口的一些属性,包括改变窗口的处理程序.
SetWindowLong Text1.hWnd, GWL_WNDPROC, AddressOf TextWndProc
意思是改变Text1的窗口处理程序为 TextWndProc,因为把窗口原来的处理程序换成这个过程了,
解除时当然要恢复原来的窗口处理程序OldProc了
   If wMsg = WM_CONTEXTMENU Then  '如果是右击消息,
    TextWndProc = 0'就不处理这个消息,退出函数.
    Exit Function
    End If
    TextWndProc = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
'否则就用原来的窗口处理程序来处理其它的消息,如果不调用原来的处理程序,文本框就会有异常,因为没有处理相关的消息嘛



全部回答

这个说不清,会用就行了,我试着解说下,听不懂也没办法,我语文不好-_-

1说不清

2指Text以前的Long

3要为Text设置的新Long,因为OldProc是Text以前的Long,所以用这个解除

4我也不知道

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为何我的问道就是刷不出道王的水平!
人可不可以回头,如果一切能重来,命运是否能
人心会丑陋吗?
那索爱w380要怎样才能完整下载繁体字呢?
帮我取个英文名字哈、
请问北京正规的量贩KTV工资有多少?
地下城能够与勇士狂战士速度装备
你怎么看今天的股市?
找个游戏.网游老手进.
为什么进入叶面时显示错璇的缃关
仁誉通物流地址在什么地方,想过去办事
一首黑人说唱的歌。
求几张蒂皮长大后的照片
我拳头很硬了,为什么打人脸上自己的手骨骨折
靠美术就能上大学吗?
推荐资讯
如何在本手机刷新QQ群?现在的,自己在电脑上
QQ三国这个怎么弄?
伊山派出所任三庄警务室地址有知道的么?有点
请教一个9年级英语题
罪恶都市C点所有任务
赵薇旳鼻子-章子怡旳嘴-刘亦菲旳头发-李宇春
急需一个排球场地详细平面图~~有的帮忙给一下
方特欢乐世界官网
在上海新大洲要多少钱?
请问知情人士,伤残鉴定级别与伤情恢复时间的
悉尼的大学中哪所大学的护士专业好?
好烦啊,没有你的信息,我的心里怎么空空的,有
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?