当前位置: 网学 > 编程文档 > VB > 正文

完全用VB6.0自身功能实现对Windows消息的拦截

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/17
下载{$ArticleTitle}原创论文样式

众所周知,VB 的功能没有 VC++、Delphi 这样的全功能开发平台强大,但她也足以完成我们绝大部分的工作,只要你开动脑筋,敢想敢干,我们可以让 VB 发挥最大的效能,做出许多令人惊叹的软件。开发高难度软件,并不只是 VC++ 和 Delphi 的专利!

过去普遍认为 VB 无法自定义拦截 Windows 的消息,只能靠 VB 本身提供的几个有限的事件来编程,这有很大的局限性。缺少消息捕获,同时又被认为不支持回调函数机制(主要是因为 VB 没有指针,更谈不上函数指针),这造成了 VB 编程的很大局限性。事实上,VB 可以采用别的办法变相地实现这一机制。从 VB 5.0 开始就提供了 AddressOf 操作符,利用这个操作符可以获取 VB 自定义函数的地址。有了函数地址就可以采用回调函数的机制了。当然,VB 仍然无法实现 VB 函数之间的地址传递,她只支持 VB 函数到 DLL 的函数抵制传递。但是,这已经足够了。下面这个程序,就是采用了这一方法,程序中只有一个主窗体,通过设置属性,使得主窗体没有边框,没有标题栏,不能改变大小,不能通过标题栏托动。但是通过拦截 Windows 消息可以使得鼠标处在窗体中的任意位置都可以托动它,就像按住标题栏托动一样。这个程序没有用到任何附加的控件,全部采用 VB 代码完成。注意,请增加一个公共模块,以便声明一些函数和常数。以下代码在 VB 6.0 中通过。

'' ===================================
'' 这是公共模块的代码
Attribute VB_Name = "Module1"
Option Explicit

Public Const WM_NCHITTEST = &H84
Public Const VK_LBUTTON = &H1
Public Const HTCAPTION = 2
Public Const HTCLIENT = 1


Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public 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 Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Const GWL_WNDPROC = -4
Global lpPrevWndProc As Long
Global gHW As Long

'' 这里是关键,我自定义了一个窗口函数(回调函数),以替代 VB 窗体自己的默认窗口函数。'' 窗口函数是干什么的?它就是负责处理 Windows 发送给它的消息,并加以过滤,筛选出它感兴趣'' 的消息,映射成为事件供我们使用。VB 中每个窗口都有一个默认的窗口函数,我们是看不到的。'' 有很多消息都被 VB 的默认窗口函数过滤掉了。了解 C/C++/Delphi 程序设计的朋友应该知道这些。

Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  '' 我们也进行消息过滤,不过我们指拦截我们感兴趣的消息
  '' 其他消息我们懒得处理,交给 VB 默认的窗口函数去处理吧。
  Select Case uMsg
    Case WM_NCHITTEST  '' 拦截 WM_NCHITTEST 消息
      If GetAsyncKeyState(VK_LBUTTON) < 0 Then  '' 是否有鼠标左键在窗体客户区按下?
        '' 如果是,函数返回值被设置为 HTCAPTION,欺骗 Windows,让它以为鼠标是按在标题栏
        '' Windows 是通过窗口函数的返回值进行判断处理的
        
  • 下一篇资讯: 用VB实现队列播放MP3
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号