窗口消息欺骗请教?
这是我在网上下的程序: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 是通过窗口函数的返回值进行判断处理的
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 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按住客户区拖动窗口,但是我想我把 WindowProc = HTCAPTION改成 WindowProc=HTMAXBUTTON 然后点客户区让windows以为点的是最大化按钮,但是程序不能最大化。
更多 0
[此贴子已经被作者于2015-10-28 21:35编辑过]