无崩溃(VB IDE)子类技术实现

简介: 如果简单的用几个API来实现子类,那么只要你非正常关闭窗体或者加入中断点调试,不好意思,VB IDE崩溃,所有的一切都要重来。

凡是用VB做相对高深一些的东西的时候,不可避免都会或多或少用到子类技术,我上一篇文章介绍的www.vbaccelerator.com 网站,上面关于控件、图形等等几乎都用到了子类技术。

但是如果简单的用几个API来实现子类,那么只要你非正常关闭窗体或者加入中断点调试,不好意思,VB IDE崩溃,所有的一切都要重来。

有没有无崩溃的子类技术呢?我这里目前不光有一种,还有两种:)

第一种,也就是www.vbaccelerator.com 网站常用的技术,就是用VB做了一个进程内组件DLL(SSubTmr6.dll),由它实现子类。效果不错,但是需要挂接一个COM组件,有背绿色软件之道,所以这个技术就不介绍了(详细代码,请上vba...网站,上面有源码)。

第二种,其实这是我看 HookMenu源码的心得,是高手的结晶,这里不敢夺爱。HookMenu作者高就高在,用汇编代码实现了窗口消息处理函数,然后编译成二进制码,由VB程序进行调用,这样仅需要在程序中添加一个类(外引用一个该类的接口文件SubclassingSink.tlb),就可以很绿色,并且无崩溃的实现了子类化,由于作者原代码包含内容较多,所以我简化了一下,自己重新封装了一个类,然后又做了一个示例。这样让高端技术平民化,让每一个VB爱好者都会使用。

示例代码如下:

'**模 块 名:frmDemo
'**说    明:Sky Walker(天行者) 版权所有2006 - 2007(C)
'**创 建 人:叶帆
'**日    期:2006-01-02 17:29:24
'**修 改 人:
'**日    期:
'**描    述:窗口子类化示例(无崩溃)
'**        :叶帆Blog:http://blog.csdn.net/yefanqiu
'**版    本:V1.0.0
'*************************************************************************
Option Explicit
Implements ISubclassingSink         '接口定义 需引用接口文件SubclassingSink.tlb
Private mSubclass As CSubclass      '实现类

Private Const WM_SIZE = &H5
Private Const WM_MOUSEWHEEL = &H20A
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205

'*************************************************************************
'**函 数 名:Form_Load
'**输    入:无
'**输    出:无
'**功能描述:初始化子类
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2006-01-02 17:33:02
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub Form_Load()
    Set mSubclass = New CSubclass    '初始化一个子类
    '添加消息 (前截获)
    mSubclass.AddBeforeMsgs WM_MOUSEWHEEL, WM_SIZE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK
    '添加消息 (后截获)
    mSubclass.AddAfterMsgs WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP
     
    '获取全部的消息
    'mSubclass.AllAfterMsgs = True
    'mSubclass.AllBeforeMsgs = True
    
    '添加子类
    mSubclass.Subclass hWnd, Me
End Sub

'*************************************************************************
'**函 数 名:Form_Unload
'**输    入:Cancel(Integer) -
'**输    出:无
'**功能描述:卸载子类
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2006-01-02 17:35:16
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub Form_Unload(Cancel As Integer)
    mSubclass.UnSubclass
End Sub

'*************************************************************************
'**函 数 名:ISubclassingSink_After
'**输    入:lReturn(Long)      -
'**        :ByVal hwnd(Long)   -
'**        :ByVal uMsg(Long)   -
'**        :ByVal wParam(Long) -
'**        :ByVal lParam(Long) -
'**输    出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2006-01-02 17:36:40
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub ISubclassingSink_After(lReturn As Long, ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
    Debug.Print "ISubclassingSink_After " & " - " & Hex(uMsg) & " - " & Timer
End Sub

'*************************************************************************
'**函 数 名:ISubclassingSink_Before
'**输    入:bHandled(Boolean) -
'**        :lReturn(Long)     -
'**        :hwnd(Long)        -
'**        :uMsg(Long)        -
'**        :wParam(Long)      -
'**        :lParam(Long)      -
'**输    出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2006-01-02 17:36:41
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub ISubclassingSink_Before(bHandled As Boolean, lReturn As Long, hWnd As Long, uMsg As Long, wParam As Long, lParam As Long)
    Debug.Print "ISubclassingSink_Before " & " - " & Hex(uMsg) & " - " & Timer
    'bHandled = True   'ISubclassingSink_After消息不在触发,并且该消息不向原窗体下发
    'lReturn=mSubclass.CallOrigWndProc(uMsg, wParam, lParam)   '向原窗体发送消息
End Sub

类的代码就不在列举了,请大家看源码

源码下载地址:http://www.sky-walker.com.cn/YeFan/SourceCode/ISubClass.rar

相关文章
|
IDE 开发工具
无崩溃(VB IDE)子类技术实现
        凡是用VB做相对高深一些的东西的时候,不可避免都会或多或少用到子类技术,我上一篇文章介绍的www.vbaccelerator.com 网站,上面关于控件、图形等等几乎都用到了子类技术。
685 0
|
6月前
|
网络协议 IDE 网络安全
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
695 0
|
IDE Go 开发工具
Go开发IDE全览:GoLand vs VSCode全面解析
Go开发IDE全览:GoLand vs VSCode全面解析
497 0
|
17天前
|
IDE 开发工具 C++
AvaloniaUI项目离线开发全攻略:IDE安装、模板应用与NuGet私有化部署一站式解决
本文详细介绍了在离线环境中开发Avalonia UI项目的完整解决方案,包括Visual Studio 2022和JetBrains Rider的离线安装、Avalonia UI模板的配置、私有NuGet服务的部署与使用,以及NuGet包的制作和上传。通过这些步骤,您可以在网络受限或完全离线的环境中顺利进行Avalonia UI项目的开发。
AvaloniaUI项目离线开发全攻略:IDE安装、模板应用与NuGet私有化部署一站式解决
|
23天前
|
机器学习/深度学习 存储 监控
AllData数据中台核心菜单五:实时开发IDE
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
6月前
|
IDE 测试技术 项目管理
集成开发环境(IDE)的使用:提升Visual Basic开发效率的工具和技巧
【4月更文挑战第27天】本文探讨了如何使用Visual Basic IDE提升开发效率,包括理解IDE组件、利用代码编辑器的智能功能、通过界面设计器设计GUI、使用调试和测试工具、有效管理项目与版本控制、掌握快捷键和宏、定制IDE以及利用学习资源。通过充分利用这些工具和技巧,开发者能更快地编写高质量代码,高效管理项目,从而提升整体开发效率。随着IDE的持续发展,开发者应不断学习新特性以适应进步。
152 1
|
4月前
|
监控 IDE Java
函数计算产品使用问题之如何不使用FC的IDE进行开发,并将开发好的应用部署到FC上
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
IDE Linux 开发工具
GoLand IDE 2023 快捷键大全:提高开发效率的必备操作
GoLand IDE 2023 快捷键大全:提高开发效率的必备操作
245 0
下一篇
无影云桌面