delphi 中还不是一样?

解决方案 »

  1.   

    SetWindowLong(gHW, GWL_WNDPROC, @WindowProc)
      

  2.   

    AddressOf WindowProc中,WindowProc是自定义的过程还是windows的过程,是否可以在其中处理接收到的消息了???
        在下面的VB程序中
    Public Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If uMsg = WM_COPYDATA Then
            Call PacketHandle(lParam)
        ElseIf uMsg = TRAY_CALLBACK Then
            If lParam = WM_RBUTTONUP Then
                TheForm.PopupMenu TheMenu
            ElseIf lParam = WM_LBUTTONUP Then
                TheForm.WindowState = vbNormal
                TheForm.Visible = True            TheForm.SetFocus
            End If
        End If
        WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
    End Function
    PacketHandle(lParam)是对参数的处理,CallWindowProc是取消息吗???
      

  3.   

    在delphi中一般不需要自己写消息过程,这样很危险,可以使用消息函数接收消息procedure WMCopyData(var M: TMsg); message WM_COPYDATA;procedure WMCopyData(var M: TMsg); message WM_COPYDATA;
    begin
      ShowMessage('收到WM_COPYDATA消息');
    end;
      

  4.   

    这个回调函数是持续运行的吧????
    另外用消息函数接受时怎样处理参数lparam????
      

  5.   

    我不太明白你的意思?比如系统以前处理画图是这样的,你现在用SetWindowLong用你自己的函数处理,那么系统的处理函数就没有用了,就按照你自己的处理进行处理。不知道我回答的是不是你想要知道的。
    lparam的处理在消息里他是一个Word 型的数,
    消息的不同他代表的意义也不同,比如WM_MouseMOVE中他的LParam的高2位代表y坐标
    低两位代表y坐标,WM_Paint中他的Lparam就没有用。
    在Delphi中将消息进行了2次封装,所有比如WM_MouseMOve封装成一个记录型TWMMOUSEMOVE然后他可以很方便的将坐标为你分开,不需你自己费力
      

  6.   

    那么SetWindowLong到底有什么用处呢??是用来回应跟某一个窗体有关的消息的吗?我还是有些糊涂,请指教!!