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

    技术2022-05-11  148

            从网上看了一篇《分享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 IfEnd Sub

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

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


    最新回复(0)