获取Windows 外壳信息通知(VB源程序)

        从网上看了一篇《分享windows的秘密-外壳通知消息》的文章,感觉很不错,可是它是delphi的程序,和VB相差很大,API在VB中没有对应的声明,并且一些结构体在VB中没有现成的定义,所以很是研究了一番,优盘的插入、拔出,光盘的插入、取出都有了相应的通知,效果不错。

      可以接收的消息如下:

  SHCNE_ASSOCCHANGED  一个文件关联被改变了
  SHCNE_ATTRIBUTES   
一个项目或文件夹的属性被改变了
  SHCNE_CREATE       
文件夹的外壳成员被创建了
  SHCNE_DELETE        
非文件夹的外壳成员被删除了
  SHCNE_DRIVEADD     
添加了一个驱动器
  SHCNE_DRIVEADDGUI  
通过外壳添加的驱动器
  SHCNE_DRIVEREMOVED  
一个驱动器被删除了
  SHCNE_EXTENDED_EVENT  
未被使用
  SHCNE_FREESPACE    
驱动器的自由空间数有了变化
  SHCNE_MEDIAINSERTED  
存储介质被插入到驱动器中
  SHCNE_MEDIAREMOVED  
存储介质从驱动器中被删除
  SHCNE_MKDIR        
一个目录被创建
  SHCNE_NETSHARE     
本地的目录被共享
  SHCNE_NETUNSHARE   
本地目录被取消共享
  SHCNE_RENAMEFOLDER  
文件夹名称被改变
  SHCNE_RENAMEITEM   
非文件的外壳对象的名称被改变
  SHCNE_RMDIR        
一个文件夹被删除
  SHCNE_SERVERDISCONNECT  
计算机被服务器断开
  SHCNE_UPDATEDIR    
一个文件夹中的内容被改变
  SHCNE_UPDATEIMAGE  
系统图像列表中的一个图像被改变
  SHCNE_UPDATEITEM    
一个非文件夹外壳对象的名称被改变

运行后的截图:

  

关键源码:

'*************************************************************************
'**函 数 名:WindowProc
'**输    入:ByVal hwnd(Long)   -
'**        :ByVal uMsg(Long)   -
'**        :ByVal wParam(Long) -
'**        :ByVal lParam(Long) -
'**输    出:(Long) -
'**功能描述:子类函数
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005年12月23日
'**修 改 人:
'**日    期:
'**版    本:V1.0
'*************************************************************************
Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    '-------------------------------
    Dim i As Long
    If uMsg = WM_YFSYSMSG Then
        For i = 0 To 20
            If (lParam And lngFlag(i)) > 0 Then
                frmSysmsg.lstMsg.AddItem Format(Now, "HH:MM:SS") & " " & strFlag(i)
            End If
        Next
        Exit Function
    End If
   
    '-------------------------------
    WindowProc = CallWindowProc(lngPreWinProc, hwnd, uMsg, wParam, lParam)
End Function

'*************************************************************************
'**函 数 名:ISubProc
'**输    入:hwnd(Long) - 窗口句柄
'**输    出:无
'**功能描述:
'**全局变量:
'**调用模块:安装子类
'**作    者:叶帆
'**日    期:2005-12-23 11:41:37
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Public Sub ISubProc(hwnd As Long)
    '记录原本的Window Procedure的位址
    lngPreWinProc = GetWindowLong(hwnd, GWL_WNDPROC)
    Call SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

'*************************************************************************
'**函 数 名:UnISubProc
'**输    入:hwnd(Long) - 窗口句柄
'**输    出:无
'**功能描述:卸载子类
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-12-23 11:43:53
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Public Sub UnISubProc(hwnd As Long)
    '取消Message的截取,而使之又只送往原来的Window Procedure
    Call SetWindowLong(hwnd, GWL_WNDPROC, lngPreWinProc)
End Sub

'*************************************************************************
'**函 数 名:SysMsgRegister
'**输    入:无
'**输    出:无
'**功能描述:消息注册
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-12-23 13:18:02
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Public Sub SysMsgRegister(hwnd As Long)
    Dim nr As NotifyRegister

    lngFlag = Array(SHCNE_ASSOCCHANGED, _
              SHCNE_ATTRIBUTES, _
              SHCNE_CREATE, _
              SHCNE_DELETE, _
              SHCNE_DRIVEADD, _
              SHCNE_DRIVEADDGUI, _
              SHCNE_DRIVEREMOVED, _
              SHCNE_EXTENDED_EVENT, _
              SHCNE_FREESPACE, _
              SHCNE_MEDIAINSERTED, _
              SHCNE_MEDIAREMOVED, _
              SHCNE_MKDIR, _
              SHCNE_NETSHARE, _
              SHCNE_NETUNSHARE, _
              SHCNE_RENAMEFOLDER, _
              SHCNE_RENAMEITEM, _
              SHCNE_RMDIR, _
              SHCNE_SERVERDISCONNECT, _
              SHCNE_UPDATEDIR, _
              SHCNE_UPDATEIMAGE, _
              SHCNE_UPDATEITEM)

    strFlag = Array("文件关联被改变", _
              "文件夹属性被改变", _
              "文件夹外壳成员被创建", _
              "非文件夹外壳成员被删除", _
              "添加了一个驱动器", _
              "通过外壳添加的驱动器", _
              "一个驱动器被删除了", _
              "未使用", _
              "驱动器自由空间发生变化", _
              "存储介质插入驱动器", _
              "存储介质被移除", _
              "一个目录被创建", _
              "本地目录被共享", _
              "本地目录被取消共享", _
              "文件夹名称被改变", _
              "非文件的外壳对象名称被改变", _
              "一个文件夹被删除", _
              "计算机被服务器断开", _
              "一个文件夹的内容被改变", _
              "系统图像列表中的一个图像被改变", _
              "一个非文件夹外壳对象的名称被改变")

    lngHandle = SHChangeNotifyRegister(hwnd, SHCNF_ACCEPT_INTERRUPTS Or SHCNF_ACCEPT_NON_INTERRUPTS, SHCNE_ALLEVENTS, WM_YFSYSMSG, 1, nr)
    If lngHandle > 0 Then
        frmSysmsg.picFlag.BackColor = RGB(0, 200, 0)
    Else
        frmSysmsg.picFlag.BackColor = RGB(255, 0, 0)
    End If
End Sub

'*************************************************************************
'**函 数 名:UnSysMsgRegister
'**输    入:无
'**输    出:无
'**功能描述:取消注册
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-12-23 13:19:06
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Public Sub UnSysMsgRegister()
    If lngHandle > 0 Then
        SHChangeNotifyDeregister lngHandle
    End If
End Sub

在Windows XP / VB 6.0环境下测试成功。
源代码下载地址:http://www.sky-walker.com.cn/YeFan/SourceCode/yfsysmsg.rar

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
前言: 最近学Windows shell外壳,偶然发现了SHChangeNotifyRegister这个神奇的函数,于是便用它写了个例程。 本帖不少思想来自帖子:未公开Windows API SHChangeNotifyRegister实现文件监控 基本介绍: 在Windows实现文件监控有三种方法,第一种是“虚拟文件系统驱动”方法,如windows 下的filemon,网上有很多关于他的分析。第二种方法是“HOOK API”方法,钩子技术。第三种方法是“消息机制”,从windows的文件通知消息获取系统的文件操作。但是这是文件操作完成以后,才通知的。所以只能进行监视监视,不能进行完全的控制。而消息机制当中,也有三种方法,(1)通过使用“未公开API SHChangeNotifyRegister 实现”;(2)通过 FindFirstChangeNotification 实现;(3)通过 ReadDirectoryChangesW 实现。第(2)(3)种方法只能针对一个在指定目录或子目录下发生的更改符合过滤条件时,进行监视。 而现在,易语言 中大部分消息机制监视文件使用FindFirstChangeNotification或ReadDirectoryChangesW + 线程实现的(例如:文件监控精灵 - 监控目录文件新建删除重命名修改 ),该方法效率较低,而且如果很多文件在短时间内发生变更,则有可能会丢失部分通知,且监视的文件信息有限,所以,我写了一份使用SHChangeNotifyRegister来监视文件的例程。 特性: 代码几乎是全注释,清晰明了: 程序很多命令和常量是翻译自MSDN,规范程度高: 监视多种消息(比如USB接口信息),很多问题一个命令即可解决:
PDF分割VB源程序是一种基于VB语言开发的功能程序,主要用于将PDF文件进行分割拆分的操作。PDF文件是一种常见的电子文档格式,但有时候我们只需要其中的部分内容,而不想查看整个文件。这时候就需要使用PDF分割VB源程序来将PDF文件拆分成多个小的部分。 PDF分割VB源程序的功能主要包括选择待分割的PDF文件、指定切割的位置和方式,并将切割后的文件保存到指定位置。用户可以根据自己的需求选择要分割的PDF文件,并可以设置分割的位置和方式。常见的分割方式包括按页面进行分割、按章节进行分割等。用户可以根据具体情况选择合适的分割方式。 PDF分割VB源程序的使用方法比较简单,用户只需双击运行程序,然后选择待分割的PDF文件,再设置分割的位置和方式,最后点击“分割”按钮即可开始分割。程序会自动将切割后的文件保存到指定的位置,用户可以根据自己的需要去查看和使用。 PDF分割VB源程序的使用场景比较广泛。例如,当我们需要从一本PDF电子书中提取某些页码的内容时,可以使用PDF分割VB源程序将需要的页码分割出来;当我们需要将一份大型报告分拆为多个小的部分时,也可以使用该程序进行分割;此外,还可以将多个PDF文件合并成一个文件,通过选择不同的分割位置和方式,可以实现多种功能。 总之,PDF分割VB源程序是一款功能强大、使用简单的工具,可以帮助用户轻松实现PDF文件的分割操作,提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值