这段话的出处在这: 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
汇编中应该说太需要超类化了... 面向对象的语言中就显得不那么重要了,因为通过对象包装,我们可以以SDK的方式对单个 控件进行控制,多次引用后效果和超类化一样 而且.... 相对于VB来说,更简单了... sub CommandButton_click(Index As Integer) 用这个来解决....当然以效率来说,最适合SDK开发的非超类化莫属了
''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都无法复制、剪切和粘贴呵呵,是不是很简单啊
这个子类化是什么: '类模块[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
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
全局我做过.这儿有个老魏的例子: http://blog.csdn.net/modest/archive/2006/10/21/1344213.aspx
后一个,以前在网上见过报道.但,从未做过.
貌似HOOK和子类还不是一个概念,老魏哪个是HOOK
实际上我就是想知道跨进程的子类化!
HOOK也是名词,它是对“用SetWindowsHookEx设置钩子”等一系列操作的称呼
我觉得SubClass和Hook都是动词~~哈哈~~
还是来看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
面向对象的语言中就显得不那么重要了,因为通过对象包装,我们可以以SDK的方式对单个
控件进行控制,多次引用后效果和超类化一样
而且.... 相对于VB来说,更简单了...
sub CommandButton_click(Index As Integer)
用这个来解决....当然以效率来说,最适合SDK开发的非超类化莫属了
进程内全局子类化已经实现,并能运用于VB的控件中了!大家想看我的代码吗?还是想自己研究研究?
有时间再研究一下:超类化(superclassing)
那个DLL没代码,是一个老外做的
机器语言===>汇编语言===>高级语言(VB)这就搞定了 ^_^
''本模块用来实现进程内全局子类化
''
''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都无法复制、剪切和粘贴呵呵,是不是很简单啊
'类模块[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
现在有 VC,还有一大堆反汇编工具,“机器语言===>汇编语言”这一步没有任何难度。
麻烦的还是在“汇编语言===>高级语言”这一步。你的大学老师,我只当他在“放屁”
这个新窗口类使用一个已经存在的窗口类的窗口过程,来为它自己添加和已经存在的窗口类一样的功能。
说白了一句话,超类化就是继承一个基类并拓展自己的新功能!
在VB中,完全没有必须用走超类化,因为,用“用户控件”或“ActiveX 控件"+实例子类化 就完成可以实现和超类化一样的功能,所以,我不想再研究超类化了!
本贴到了结贴的时候了