快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡萄app下载:完全用VB6.0自身功能实现对Windows消息的拦截…



众所周知,VB 的功能没有 VC++、Delphi 这样的全功能开拓平台强大年夜,但她也足以完成我们绝大年夜部分的事情,只要你开动脑子,敢想敢干,我们可以让 VB 发挥最大年夜的效能,做出许多令人赞叹的软澳门新葡萄app下载件。开拓高难度软件,并不光是 VC++ 和 Delphi 的专利!

以前普遍觉得 VB 无法自定义拦截 澳门新葡萄app下载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 窗体自己的默认窗口函数。' 窗口函数澳门新葡萄app下载是干什么的?它便是认真处置惩罚 Windows 发送给它的消息,并加以过滤,筛选出它感兴趣' 的消息,映射成为事故供我们应用。VB 中每个窗口都有一个默认的窗口函数,我们是看不到的。' 有很多消息都被 VB 的默认窗口函数过滤掉落了。懂得 C/C++/Delphi 法度榜样设计的同澳门新葡萄app下载伙应该知道这些。

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 是经由过程窗口函数的返回值进行判断处置惩罚的

WindowProc = HTCAPTION

Exit Function

Else

' 其他的我们不管,照样规规矩矩的该怎么样就怎么样

WindowProc = HTCLIENT

Exit Function

End If

End Select

' 这里又是关键,由于其他我们不关心的消息我们自己不处置惩罚,以是必须由 VB 的默认处置惩罚函数处置惩罚

' lpPrevWndProc 着实便是一个函数指针,它指向 VB 默认窗口函数

WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)

End Function

' ===================================

' 这是窗体的代码

VERSION 5.00

Begin VB.Form Form1

BorderStyle=0'None

ClientHeight=3195

ClientLeft=0

ClientTop=0

ClientWidth=4680

LinkTopic="Form1"

MaxButton=0'False

MinButton=0'False

ScaleHeight=3195

ScaleWidth=4680

ShowInTaskbar=0'False

StartUpPosition =3'窗口缺省

Begin VB.CommandButton Command1

Caption="Command1"

Height=375

Left=2160

TabIndex=0

Top=720

Width=1575

End

End

Attribute VB_Name = "Form1"

Attribute VB_GlobalNameSpace = False

Attribute VB_Creatable = False

Attribute VB_PredeclaredId = True

Attribute VB_Exposed = False

Private Sub Command1_Click()

Unload Me' 按下这个按钮就退出了

End Sub

Private Sub Form_Load()

gHW = Me.hwnd' 保存窗体的句柄

' 下面是关键,完成两个事情:1、将我们自己的全局函数调换为新的窗体回调函数

' 2、保存原本的 VB 默认窗户口函数地址

lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)

End Sub

着实,统统就这么简单。有了这种法子,Windows 中必要回调函数的 API 函数我们都可以调用了,有很多的功能我们都可以用 VB 来实现了。留意,我们自定义的回调函数只能是模块中定义的全局函数!不能在窗体中定义。

写澳门新葡萄app下载出来只是想抛砖引玉,着实有很多功能不必要到处去找控件的。我现在在钻研用 VB 6 + DirectX 7/8 写游戏。游戏速率当然弗成能达到 C++ 的程度,然则足够敷衍一些中小型的游戏题材了,比如 RPG 的。这又有很多值得写出来的了。虽然不是什么新鲜的话题,然则此中仍不乏许多的技术和编程思惟。盼望对此有钻研的同伙能够多多出来交流辅导一二。

您可能还会对下面的文章感兴趣: