不知后两种子类化如何实现?

解决方案 »

  1.   

    你小子考我,其实,我也是在学习当中!
    全局我做过.这儿有个老魏的例子:   http://blog.csdn.net/modest/archive/2006/10/21/1344213.aspx
    后一个,以前在网上见过报道.但,从未做过.
      

  2.   

    呵呵,没有哪个意思,我是真不知道全局子类化怎么实现!
    貌似HOOK和子类还不是一个概念,老魏哪个是HOOK
    实际上我就是想知道跨进程的子类化!
      

  3.   

    SubClass是名词,它是对“用SetWindowLong修改窗口函数的地址”等一系列操作的称呼   
    HOOK也是名词,它是对“用SetWindowsHookEx设置钩子”等一系列操作的称呼
      

  4.   

    哈哈我来和老魏唱反调了
    我觉得SubClass和Hook都是动词~~哈哈~~
      

  5.   

    我认为HOOK与SubClass都单词........
      

  6.   

    何为PK?PK 就是爬开的意思! 
      

  7.   

    这段话的出处在这:  http://www.java-asp.net/vc/200601/t_22529.html
    还是来看MFC的。全局子类化一个编辑框控件以及为它移除子类化:LONG FAR PASCAL SubClassFunc(HWND hWnd,UINT,Message,WORD wParam,LONG lParam);
    FARPROC lpfnOldClassWndProc;
    HWND hEditWnd;//
    // Create an edit control and subclass it.
    // Notice that the edit control is not visible.
    // Other details of this particular edit control are not important.
    //
    hEditWnd = CreateWindow("EDIT", "EDIT Test",
                            WS_CHILD,
                            0, 0, 50, 50,
                            hWndMain,
                            NULL,
                            hInst,
                            NULL);lpfnOldClassWndProc = (FARPROC)SetClassLong(hEditWnd, GCL_WNDPROC, (DWORD)SubClassFunc);
    .
    .
    .
    //
    // To remove the subclass:
    //
    SetClassLong(hEditWnd, GWL_WNDPROC, (DWORD) lpfnOldClassWndProc);
    DestroyWindow(hEditWnd);这个地址很全面,还有超类化的祥细介绍:  http://www.cnblogs.com/tonybain/archive/2006/01/24/322708.html
      

  8.   

    SetClassLong...........头一次见........哎~~~~真是~~~知识学不完啊...
      

  9.   

    汇编中应该说太需要超类化了...
    面向对象的语言中就显得不那么重要了,因为通过对象包装,我们可以以SDK的方式对单个
    控件进行控制,多次引用后效果和超类化一样
    而且.... 相对于VB来说,更简单了... 
    sub CommandButton_click(Index As Integer)
    用这个来解决....当然以效率来说,最适合SDK开发的非超类化莫属了
      

  10.   

    哈哈,真是太感谢 东方之珠 了
    进程内全局子类化已经实现,并能运用于VB的控件中了!大家想看我的代码吗?还是想自己研究研究?
    有时间再研究一下:超类化(superclassing)
      

  11.   


    那个DLL没代码,是一个老外做的
      

  12.   

    老马,你把它反编译一下:
    机器语言===>汇编语言===>高级语言(VB)这就搞定了 ^_^
      

  13.   

    ''ModSubClass_Global.bas
    ''本模块用来实现进程内全局子类化
    ''
    ''by zzyong00 ,08-04-14
    Option Explicit
    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 LongPrivate Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function CreateWindowEx Lib "user32" _
                    Alias "CreateWindowExA" (ByVal dwExStyle As Long, _
                                             ByVal lpClassName As String, _
                                             ByVal lpWindowName As String, _
                                             ByVal dwStyle As Long, _
                                             ByVal x As Long, _
                                             ByVal y As Long, _
                                             ByVal nWidth As Long, _
                                             ByVal nHeight As Long, _
                                             ByVal hWndParent As Long, _
                                             ByVal hMenu As Long, _
                                             ByVal hInstance As Long, _
                                             lpParam As Any) As Long
    Private Const WS_CHILD = &H40000000
    Private Const WS_VISIBLE = &H10000000
    Private Const WS_BORDER = &H800000Private Const GCL_WNDPROC = (-24)
    Private Const WM_COPY       As Long = &H301
    Private Const WM_PASTE       As Long = &H302
    Private Const WM_CUT As Long = &H300
    Private PrevWndProc  As LongPublic Function SubClass_G(ByVal Hwnd As Long)
    PrevWndProc = SetClassLong(Hwnd, GCL_WNDPROC, AddressOf SubWndProc)
    End Function
    Private Function SubWndProc(ByVal Hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
            Select Case MSG                       '在这里进行消息过滤.
                    Case WM_COPY, WM_PASTE, WM_CUT
                            SubWndProc = 1
                            Exit Function
            End Select
            SubWndProc = CallWindowProc(PrevWndProc, Hwnd, MSG, wParam, lParam)   
    End Function
    Public Function UnSubClass_G(ByVal Hwnd As Long)
    SetClassLong Hwnd, GCL_WNDPROC, PrevWndProc
    End Function''在form中
    Option ExplicitDim h As Long '初始类实例句柄
    Dim WithEvents T As TextBox
    Dim Idx As Integer
    Private Sub Command1_Click()
    Set T = Controls.Add("vb.textbox", "t" & Idx)
    Idx = Idx + 1
    T.Move (Idx - 2) * 100, 0, 100, 25
    T.Visible = True
    End SubPrivate Sub Form_Load()
    '''''''全局子类化
    Set T = Controls.Add("vb.textbox", "t" & Idx)
    Idx = Idx + 1
    h = T.Hwnd
    SubClass_G h
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    UnSubClass_G h
    End Sub以上代码可实现:点击command1产生的所有textbox都被子类化,这些textbox都无法复制、剪切和粘贴呵呵,是不是很简单啊
      

  14.   

    怎么样,不复杂吧!哦,还需要在Form_Load()中加一句才行:me.scalemode=3
      

  15.   

    哦,差点忘了,恭喜楼主荣升二星!===========================================这种用法,其实跟编写回调函数差不多。所不同的是,回调函数用的是:setwindowlong,而全局子类化用的是setclasslong。另外需要注意的是,在开发环境运行,一定要关闭窗体,卸载子类化,才能正常退出,不能去按VB开发环境中的“结束”按钮,否则VB会崩溃终止!
      

  16.   

    看起来,我们一般所使用那种子类化就是"实例子类化".而"超类化",我只在学WIN32汇编时见过介绍,也没实际做过.至于"全局子类化",头一次见~~~学习了.
      

  17.   

    这个子类化是什么:
    '类模块[WindowMessage]
    Option ExplicitPublic Function Message(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'Nothing
    End Function
    '模块[WindowMessage]
    Option ExplicitGlobal Const FORM_PROP_MSGTARGET = "MsgTarget"
    Global Const FORM_PROP_ORGWNDPROC = "OrgWndProc"Global Const GWL_WNDPROC = (-4)Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As GWL_flags, ByVal dwNewLong As Long) As Long
    Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hWnd As Long, ByVal lpString As String) As Long
    Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hWnd As Long, ByVal lpString As String) As Long
    Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hWnd As Long, ByVal lpString As String, ByVal hData As Long) As LongSub SubClass(ByVal hWnd As Long, hClient As WindowMessage)
        Dim lngOrgProc As Long
        Dim ptrObj As Long
        
        ptrObj = ObjPtr(hClient)
        
        lngOrgProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc_WindowSubClass)
        
        Call SetProp(hWnd, FORM_PROP_MSGTARGET, ptrObj)
        Call SetProp(hWnd, FORM_PROP_ORGWNDPROC, lngOrgProc)
    End SubPublic Sub Unsubclass(ByVal hWnd As Long)
        Dim lngOrgProc As Long
        
        lngOrgProc = GetProp(hWnd, FORM_PROP_ORGWNDPROC)
        
        Call SetWindowLong(hWnd, GWL_WNDPROC, lngOrgProc)
        
        Call RemoveProp(hWnd, FORM_PROP_MSGTARGET)
        Call RemoveProp(hWnd, FORM_PROP_ORGWNDPROC)
    End SubPrivate Function WndProc_WindowSubClass(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim hClient As WindowMessage
        Dim ptrObj As Long
        
        On Error Resume Next
        
        ptrObj = GetProp(hWnd, FORM_PROP_MSGTARGET)
        
        Call CopyMemory(hClient, ptrObj, 4)
        WndProc_WindowSubClass = hClient.Message(hWnd, Msg, wParam, lParam)
        Call CopyMemory(hClient, 0&, 4)
    End Function'窗体
    Option ExplicitImplements WindowMessagePrivate Sub Form_Load()
        SubClass hWnd, Me
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Unsubclass hWnd
    End SubPrivate Function WindowMessage_Message(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        '在窗体内部的消息处理过程,可创建多个此窗体的实例相互不会有影响
        Dim lngOrgProc As Long
        lngOrgProc = GetProp(hWnd, FORM_PROP_ORGWNDPROC)
        WindowMessage_Message = CallWindowProc(lngOrgProc, hWnd, Msg, wParam, lParam)
    End Function
      

  18.   

    Sorry,忘了声明CallWindowProc了,自己搞定~
      

  19.   

    Sandrer 贴出来的实例子类化实在太精妙了,封装性很好,而且又应用接口技术,可以轻松自定义要拦截的消息,最关键的是,不用修改模块和类的一行代码,这样,完全可以做成了ActiveX DLL
      

  20.   


    现在有 VC,还有一大堆反汇编工具,“机器语言===>汇编语言”这一步没有任何难度。
    麻烦的还是在“汇编语言===>高级语言”这一步。你的大学老师,我只当他在“放屁” 
      

  21.   

    超类化(也被称作窗口类克隆)是创建一个新的窗口类。
    这个新窗口类使用一个已经存在的窗口类的窗口过程,来为它自己添加和已经存在的窗口类一样的功能。
    说白了一句话,超类化就是继承一个基类并拓展自己的新功能!
    在VB中,完全没有必须用走超类化,因为,用“用户控件”或“ActiveX 控件"+实例子类化 就完成可以实现和超类化一样的功能,所以,我不想再研究超类化了!
    本贴到了结贴的时候了