网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月13日漏签0天
vb吧 关注:156,092贴子:1,166,232
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 15回复贴,共2页
  • ,跳到 页  
<<返回vb吧
>0< 加载中...

VB子类化时容易忽略的重要的消息:WM_NCDESTROY

  • 只看楼主
  • 收藏

  • 回复
  • cnstarwork
  • 基本语句
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
'*************************************************************************
'**说      明:丹心软件在线设计 版权所有2007 - 2008(C)
'**创 建 人:丹心
'**日      期:2007-09-16 22:26:36
'**修 改 人:
'**日      期:
'**描      述:安全的子类化卸载例子
'**版      本:V1.0.0
'**博客地址:http://hi.baidu.com/starwork/
'**QQ    号码:121877114
'**E - mail:cnstarwork@126.com
'*************************************************************************

'      VB子类化的方式很容易造成VB IDE的崩溃。不要在调试模式中途暂停或终于应用程序,
'因为这样可能不能恢复源窗口过程函数,造成无法处理正常的消息,变得异常或IDE崩溃,
'因此切记调试前一定存盘
'      那如何处理子类化在VB IDE环境的中断呢?因为我们卸载一个窗口对象,系统会发送
'WM_NCDESTROY (在按下VB IDE的停止按钮也会产生该消息) 消息给对象,因此我们可以通过检测这个消息来自动恢复对象的源窗口过程。
'下面的是例子是一个简单的安全的子类化卸载例子


'主窗体FORM1的代码

Option Explicit

Private Sub Form_Load()
      If SubClass(hWnd) Then
          If IsIDE Then
              MsgBox "本窗口为子类化窗体.不要用VB的结束按钮或" & vbCrLf & _
                      "结束菜单命令\或关闭VB来关闭它,只能通过它自" & vbCrLf & _
                      "己的系统菜单关闭它." & vbCrLf & vbCrLf
          End If
      End If
End Sub
  
Private Function IsIDE() As Boolean
On Error GoTo Out
     Debug.Print 1 / 0
     IsIDE = False
     Exit Function
Out:
      IsIDE = True
End Function
  
Private Sub Form_Unload(Cancel As Integer)
      Call UnSubClass(hWnd)
End Sub




'模块代码:


Option Explicit

Private Const GWL_WNDPROC = (-4)
Private Const WM_NCDESTROY = &H82 ' 组件被销毁时的消息,在按下VB IDE的停止按钮也会产生
Private Const OLDWNDPROC = "OldWndProc"
  
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 SetWindowLong Lib "user32" Alias "SetWindowLongA" (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 uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
'子类化开始
Public Function SubClass(hWnd As Long) As Boolean
      Dim lpfnOld       As Long
      Dim fSuccess       As Boolean
      
      If (GetProp(hWnd, OLDWNDPROC) = 0) Then
          lpfnOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
          If lpfnOld Then
              fSuccess = SetProp(hWnd, OLDWNDPROC, lpfnOld)
          End If
      End If
      
      If fSuccess Then
          SubClass = True
      Else
          If lpfnOld Then Call UnSubClass(hWnd)
      End If
      
End Function

'卸载子类化
Public Function UnSubClass(hWnd As Long) As Boolean
      Dim lpfnOld       As Long
      lpfnOld = GetProp(hWnd, OLDWNDPROC)
      If lpfnOld Then
          If RemoveProp(hWnd, OLDWNDPROC) Then
              UnSubClass = SetWindowLong(hWnd, GWL_WNDPROC, lpfnOld)
          End If
      End If
End Function
  
Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Select Case uMsg
          Case WM_NCDESTROY ' 如果收到组件被销毁的消息,恢复源窗口过程处理函数
              Call UnSubClass(hWnd)
              MsgBox "卸载子类化    &H" & Hex(hWnd), vbCritical, "警告"
      End Select
      
      WndProc = CallWindowProc(GetProp(hWnd, OLDWNDPROC), hWnd, uMsg, wParam, lParam)
End Function



  • cnstarwork
  • 基本语句
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ding


2025-08-13 09:23:42
广告
不感兴趣
开通SVIP免广告
  • yigan1
  • 啥也不懂
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶一顶。有用


  • cnstarwork
  • 基本语句
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
A,没人欣赏


  • Ultraman_King
  • 递归爆栈
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个东西已经出现过了,LZ不是首创


  • 58.218.11.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
吧主好^-^
=.-


  • 119.96.89.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
很好啊


  • lionking1990
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这种子类化方法不是很好
我指的不是楼主的方法,而是重新指定winproc过程的方法
这种一但有错误,VB就挂掉了
虽然有人说先生成EXE,这样就能找到错误,但还是很不好
有一种subclass方式,是汇编方法,可以有两种模式的截消息(消息发生前和发生后)
这个代码我发过,只不过发在另一个代码中


2025-08-13 09:17:42
广告
不感兴趣
开通SVIP免广告
  • xyl3389
  • 啥也不懂
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼上深奥.子类化跟asm有什么关系?


  • swx1995
  • API
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用汇编来达到安全子类化……所谓安全子类化就是单步调试下也不会崩溃。
因为汇编是无敌的~


  • 狂族魔帝
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
学习了顶一个
请问楼上有具体的实现吗?我搜了一下好像没有


  • 狂族魔帝
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
哦,找到了
http://www.yulv.net/jiajia/article/147.htm


  • lionking1990
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我发过,你搜搜吧,要不你到我的E盘里面看看,那个"自绘ToolTip"里面就有了


  • 狂族魔帝
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
额,这个下载连接失效了


2025-08-13 09:11:42
广告
不感兴趣
开通SVIP免广告
  • 狂族魔帝
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
哦,谢谢


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 15回复贴,共2页
  • ,跳到 页  
<<返回vb吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示