中易网

VB的回调函数问题

答案:2  悬赏:0  
解决时间 2021-04-28 06:47
  • 提问者网友:神仙爷爷
  • 2021-04-27 07:55

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个问题都回答下 ,谢谢

最佳答案
  • 二级知识专家网友:末路丶一枝花
  • 2021-04-27 08:10

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楼网友:滚出爷的世界
  • 2021-04-27 09:17

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

1说不清

2指Text以前的Long

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

4我也不知道

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息