网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > linux > 系统管理 > 系统管理 > 一份很有价值的子类化的源代码  

一份很有价值的子类化的源代码

2004-08-16  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  新建一个 ActiveX DLL 工程,名称 SmartSubClassLib
  
  ' 以下代码放在标准模块里,模块名 mSmartSubClass
  
  ' ----------------------------------------------------
  ' Module mSmartSubClass
  '
  ' Version... 1.0
  ' Date...... 24 April 2001
  '
  ' Copyright (C) 2001 Andr閟 Pons (andres@vbsmart.com)
  ' ----------------------------------------------------
  
  'API declarations:
  Option Explicit
  
  Public Const SSC_OLDPROC = "SSC_OLDPROC"
  Public Const SSC_OBJADDR = "SSC_OBJADDR"
  
  Private Declare Function GetProp Lib "user32" Alias "GetPropA" ( _
    ByVal hWnd As Long, _
    ByVal lpString As String) As Long
  
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    Destination As Any, _
    Source As Any, _
    ByVal Length As Long)
  
  ' Function StartSubclassWindowProc()
  '
  ' This is the first windowproc that receives messages 网管u家u.bitsCN.com
  ' for all subclassed windows.
  ' The aim of this function is to just collect the message
  ' and deliver it to the right SmartSubClass instance.
  '
  Public Function SmartSubClassWindowProc( _
    ByVal hWnd As Long, _
    ByVal uMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
  
    Dim lRet As Long
    Dim oSmartSubClass As SmartSubClass
  
    'Get the memory address of the class instance...
    lRet = GetProp(hWnd, SSC_OBJADDR)
    
    If lRet <> 0 Then
      'oSmartSubClass will point to the class instance
      'without incrementing the class reference counter...
      CopyMemory oSmartSubClass, lRet, 4
      
      'Send the message to the class instance...
      SmartSubClassWindowProc = oSmartSubClass.WindowProc(hWnd, _
        uMsg, wParam, lParam)
  
      'Remove the address from memory...
网管u家u.bitscn@com

      CopyMemory oSmartSubClass, 0&, 4
    End If
    
  End Function
  
  ' 以下代码放在类模块里,模块名 SmartSubClass
  
  ' ----------------------------------------------------
  ' Class SmartSubClass
  '
  ' Version... 1.0
  ' Date...... 24 April 2001
  ' ----------------------------------------------------
  
  Option Explicit
  
  'Public event:
  Public Event NewMessage( _
    ByVal hWnd As Long, _
    ByRef uMsg As Long, _
    ByRef wParam As Long, _
    ByRef lParam As Long, _
    ByRef Cancel As Boolean)
  
  'Private variables:
  Private m_hWnds() As Long
  
  'API declarations:
  Private Const GWL_WNDPROC = (-4)
  
  Private 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" ( _

网管网www.bitscn.com


    ByVal hWnd As Long, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long
    
  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
  
  Private Declare Function GetProp Lib "user32" Alias "GetPropA" ( _
    ByVal hWnd As Long, _
    ByVal lpString As String) As Long
    
  Private Declare Function SetProp Lib "user32" Alias "SetPropA" ( _
    ByVal hWnd As Long, _
    ByVal lpString As String, _
    ByVal hData As Long) As Long
  
  Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" ( _
    ByVal hWnd As Long, _
    ByVal lpString As String) As Long
  
  Private Declare Function IsWindow Lib "user32" ( _
    ByVal hWnd As Long) As Long
  

网管论坛bbs_bitsCN_com


  '
  ' Function SubClassHwnd
  '
  ' This is the core function in this class.
  ' You can use it to both subclass and unsubclass a window.
  ' Once a window is subclassed the event NewMessage will
  ' be raised every time a message is sent to the window.
  '
  Public Function SubClassHwnd(ByVal hWnd As Long, _
    ByVal bSubClass As Boolean) As Boolean
  
    Dim lRet As Long
    
    lRet = 0
    
    'Make sure that hWnd is a valid window handler...
    If IsWindow(hWnd) Then
    
      If bSubClass Then
      'We are subclassing a window...
        
        'Make sure that the window wasn't already subclassed...
        If GetProp(hWnd, SSC_OLDPROC) = 0 Then
        
          'Now we subclass the window by changing its windowproc
          lRet = SetWindowLong(hWnd, GWL_WNDPROC, _
             AddressOf SmartSubClassWindowProc) 网管联盟bitsCN_com
          
          'Check if we've managed to subclass...
          If lRet <> 0 Then
            'Store the old windowproc and the memory
            ' address of this class...
            SetProp hWnd, SSC_OLDPROC, lRet
            SetProp hWnd, SSC_OBJADDR, ObjPtr(Me)
            
            'Add the window to an internal list of
            ' subclassed windows...
            pAddHwndToList hWnd
          End If
        End If
      Else
      'We are unsubclassing a window...
      
        'Get the old windowproc...
        lRet = GetProp(hWnd, SSC_OLDPROC)
        
        If lRet <> 0 Then
          'Unsubclass the window...
          lRet = SetWindowLong(hWnd, GWL_WNDPROC, lRet)
        End If
         网管有家bitscn.net
        'Remove any extra information...
        RemoveProp hWnd, SSC_OLDPROC
        RemoveProp hWnd, SSC_OBJADDR
        
        'Remove the window from the internal list...
        pRemoveHwndFromList hWnd
      End If
    Else
      'If hWnd is not a valid window,
      'make sure that there isn't stored garbage...
      RemoveProp hWnd, SSC_OLDPROC
      RemoveProp hWnd, SSC_OBJADDR
      
      pRemoveHwndFromList hWnd
    End If
     
    SubClassHwnd = (lRet <> 0)
    
  End Function
  
  '
  ' Function WindowProc
  '
  ' This is the link between the windowproc and the class instance.
  ' Every time SmartSubClassWindowProc receives a window message,
  ' it will post it to the right class instance.
  '
  Friend Function WindowProc( _
    ByVal hWnd As Long, _
    ByVal uMsg As Long, _ 网管u家bitscn.net
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
  
    Dim lRet As Long
    Dim bCancel As Boolean
    
    bCancel = False
    
    WindowProc = 0
    
    'Raise the event NewMessage...
    'This will tell the owner of the class variable that a
    'new message is ready to be processed.
    'The owner will be able to cancel the message by setting
    'the variable bCancel to True.
    RaiseEvent NewMessage(hWnd, uMsg, wParam, lParam, bCancel)
    
    'If the event hasn't been canceled by the owner
    'we need to send it to the original windowproc
    If Not bCa
 上一篇:超越单CUP:超线程加快了 Linux 的速度   下一篇:完美解决Linux启动问题解决方法(修改稿)
一份很有价值的子类化的源代码 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: