| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 791 人关注过本帖, 1 人收藏
标题:窗口消息欺骗请教?
只看楼主 加入收藏
ldljpjw
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-10-28
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:4 
窗口消息欺骗请教?
这是我在网上下的程序:
      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编辑过]

搜索更多相关主题的帖子: 网上 
2015-10-28 21:33
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:15 
最大化,你收到这个消息后,直接最大化窗体,然后不把这个消息转给默认处理函数就是了。窗体拖动需要系统处理,只能修改消息,最大化自己就可以,就可以不这样处理。

授人于鱼,不如授人于渔
早已停用QQ了
2015-10-28 23:14
yuk_yu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:334
专家分:134
注 册:2009-3-16
收藏
得分:5 
谢谢分享!
2015-10-29 09:01
ldljpjw
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-10-28
收藏
得分:0 
回复 楼主 ldljpjw
谢谢  ,我知道您的意思,只是我没能明白为什么可以欺骗系统拖动,却不能最大化
WindowProc = HTCAPTION改成  WindowProc=HTMAXBUTTON 点客户区不能最大化
但是WindowProc = HTCAPTION,可以拖动窗体
2015-10-29 09:36
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
这个不清楚。
我感觉在于 系统消息参数问题。

最大化按钮,它的消息中,应该有一个按钮的HWND,
窗体检查消息后,发现消息中的HWND,不是自己,然后查表,发现是自己的内部按钮,
就把这个消息再转发给 这个按钮。
然后这个按钮(类)再调用自身的消息处理函数,运行自己的动作。

而拖动,窗体检查消息后,发现消息中的HWND,就是自己,那么就自己处理了。

这是我自己的理解,也不知道对不对。

因为窗体会收到不是属于自己窗体的消息来,你可以在你的代码里,把每个消息都debug 打印出来,就可以看到很多消息。但很多消息我们的程序都不理会,忽略掉,因为不是属于自己的。


授人于鱼,不如授人于渔
早已停用QQ了
2015-10-29 11:26
快速回复:窗口消息欺骗请教?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038744 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved