说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

屏蔽文本框的右键菜单-VB资料

HTML文档下载 WORD文档下载 PDF文档下载
屏蔽文本框的右键菜单-VB资料

屏蔽文本框默认的右键菜单——浅谈如何控制Windows消息

屏蔽文本框的右键菜单,曾经看到一个程序是这样做的:

Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.Enabled = False
Text1.Enabled = True
PopupMenu yourmenu
End Sub

这当然是个简单的实现方法,但作为一个以api为主题的网站,我在此想介绍一种用api函数来实现的方法,并想谈的深入一些。
首先,谈谈消息和窗口函数。在Windows里,消息有两方面的用途:首先,它们由Windows传给窗口函数,指出发生了一个特定的事件。比如用户单击了鼠标,或者按下了键盘上的某个键。消息也可由Windows用于通告发生了一个内部事件,比如输入焦点的变更。另外,可将消息作为Windows的一种命令使用。这种命令用于通知一个窗口执行特定的任务。其次,通常可将消息传给一个控件或窗口,请求它执行特定的操作。而每个窗口都有一个窗口函数,它的作用是对消息进行处理。该函数就象一个特殊的VB程序,其中包含了对事件进行处理的代码。
对于右击文本框,首先是产生一条 WM_CONTEXTMENU 消息,该消息被文本框的窗口函数接收,就会弹出默认的菜单。所以,我的思路是:接收所有的文本框消息,如果消息为 WM_CONTEXTMENU ,那么弹出自定义菜单,否则,把消息传递给默认的窗口函数由它处理。
如何接收消息?一个方法是,用 AddressOf 关键字,它可以把一个自定义模块的地址变为窗口函数的地址。这样,窗口函数就成了你的自定义模块了。而消息仍然传递到原先窗口函数的地址(这时,这个地址指向的窗口函数已经是你的自定义模块)

现在就看看是如何实现的吧。首先建议你看看VB联机手册关于 AddressOf 的帮助。程序需要一个窗体、窗体中有一个文本框,以及一个标准模块。

标准模块的代码:

Option Explicit

Public OldWindowProc As Long
' 保存默认的窗口函数的地址
Public Const WM_CONTEXTMENU = &H7B
' 当右击文本框时,产生这条消息

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex 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
Private 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 Function SubClass1_WndMessage(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long
If Msg <> WM_CONTEXTMENU Then
SubClass1_WndMessage = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
' 如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
Exit Function
End If
SubClass1_WndMessage = True
End Function

窗体的代码:

Option Explicit

Private Const GWL_WNDPROC = (-4)

Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Exit Sub
OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
' 取得窗口函数的地址
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
' 用SubClass1_WndMessage代替窗口函数处理消息
End Sub

Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Exit Sub
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWindowProc)
' 恢复窗口的默认函数
PopupMenu usermenu
' 弹出自定义菜单
End Sub

运行这个程序,右键菜单已被自定义菜单取代,不会出现两个菜单的情况。关于这个程序,你可以在例程中下载它,实现的功能比这里的要完整。最后要说明的是,尽量不要使用 AddressOf 来改变一个窗口的默认窗口函数,它可能引起不可预料的后果。在VB的联机手册里也是这样建议的,我在编这个程序时,死过几次机,其中一次,搞的我的Windows的“开始”菜单没有反应。

在Windows 98 + VB5.0下通过。

数据浏览部件的应用及编程-Delphi资料 数据文件路径的管理-Delphi资料 随意控制DBGrid每一行的颜色-Delphi资料 通过DELPHI实现JAVA调用ORACLE数据库数据 通过编写代码来设置数据库的别名-Delphi资料 为Delphi数据表格增加彩色 为Delphi提供Pack和Undelete功能 为Delphi中数据库报表加网格 为数据库报表加网格-Delphi资料 为数据库建立索引-Delphi资料 掀开SQL Server 7.0的面纱-Delphi资料 限制数据库记录数-Delphi资料 向数据库发送密码-Delphi资料 一个关于字符串的小问题-Delphi资料 用 QuickReport for Delphi 制作报表 用Delphi 开发数据库程序经验三则 用Delphi 实 现 不 同 数 据 库 系 统 之 间 的 数 据 转 移 用DELPHI本身的控件输出TABLE表数据 用Delphi编程访问SQLServer数据库 用delphi编写医院的复杂报表 用Delphi程序维护Paradox 数据表的索引 用Delphi的InterBase数据库开发C&amp;S应用程序 用Delphi进行数据库之间转换 用Delphi开发“瘦”单机数据库应用系统 用Delphi如何实现VFP中的Cache特性 用Delphi设计数据库应用的几点体会 在我们日常工作中,常会碰到这样一个难题:一大堆-Delphi资料 用DELPHI制作应用软件 用Dephi 程 序 维 护Paradox 数 据 表 的 索 引-Delphi资料 用Dephi程序维护Paradox数据表的索引-Delphi资料 用InstallShield制作数据库应用系统的安装程序-Delphi资料 急,数据库表的问题!!! 为什么在Run ActivX程序时出现问题? DLL窗体关闭问题 setfont设置Dialog字体无效,搞不明白,大侠指点 为什么我的Web应用程序项目启动不了,总是出现错误!!! 100分求教jtable问题??? 菜鸟送分问题,请哪位大侠讲讲Inte1.ResponseCode和Inte1.ResponseInfo 声音变了!怎么办啊??? 100分 请问怎么做“索引”? make求救 用ant编译pet store 时,出现问题,提示信息见内文?请帮忙。。。高分酬谢。 三个三角了 开心ing 散分 tmd,上了vsnet2003贼船了。原来vc6的都不好用了 找在linux下免费gui?? 打开窗口获取原窗口信息的问题 Cbuilder安装问题,急! HelloWorld大全[接龙] 我要写一个程序在前台不需要运行后台运行可以:就像平时邮件服务品一样在前台不需要运行,而后台是提供服务的,要怎样来实现 临时表问题 多媒体教学系统开发 jbuilder中关于类的import问题? 有关远程控制的,例如抓屏,限制功能键,限制alt+f4,等等,请去http://hedaofeng.jahee.com 如何取得IE地址栏的输入信息? 急求一段ASP与SQLserver2000处理代码! 怎么创建win32 static library并输出函数?谢谢 !!!!求排列组合的简洁算法(80分) 我要对Spreadsheet的数据进行排序,用javascript怎么写 WIN32异常求救????!!!!!! 一个有深度的问题(对信号量操作不熟者请勿进) 知道为什么会出现iocopyout_chksum吗? 谁能给我《中文ACCESS开发指导手册》?? 从网上下的读不了 请问一个小问题 关于用Preferences存取注册表的问题 参数类型的问题 谁知道用什麽软件可以播放扩展名为1MP3的文件?(100分) 请问把一个二进制文件转换成文本文件,再把文本文件转换成二进制文件,该怎么做?求源代码?或有该代码的网址链接,多谢!不胜感激! main()函数里的两个参数argc、argv是什么意思?请赐教! 用HTTP上传文件,那位做过实际的应用的,帮忙... 大家上微软新闻组吧,感觉比这里快。 用jfreechart画出的图形,里边的汉字不太清楚,有没有解决的办法,要是图形小一点,模糊不清,难看死了,请问有没有解决办法?? 在vc.net中为什么新建的一个dialog,上面有双重的图象啊? asp&oracle问题 .net2003中vb升级向导有没有接口可以被其他程序调用? 以二进制方式打开文件,用ftell计算文件大小,为什么有时对有时不对? CHtmlEditView中如何实现表格的单元格大小调整? 城市夜归人 请问把一个二进制文件转换成文本文件,再把文本文件转换成二进制文件,该怎么做?求源代码?或有该代码的网址链接,多谢!不胜感激! 如何在一个网页中使用多种样式表显示多种效果? 直接用http调用代理怎么进行权限设置 CHtmlEditView中如何实现表格的单元格大小调整? 各位老大。。。如何用asp加密解密中文字符串,小生有礼了! We arrived at Disneyland last Sunday,_____,we couldn"t get in.A and B are C however D so 请说出原 我们是昨天到达巴黎的.英语__ __ __that we arrived in paris “大丈夫应立大志,像博介子、张骞那样为国立功,怎么老是埋头于笔砚之间呢?这句话是谁说的包含了那一成语 中国的文字是从何而来的?为什么还有汉字? 国内的“保护伞”一词从何而来? "仰天大笑出门去,我辈岂是蓬蒿人"是李白在什么情况下写的?是被贬时还是被封时? 孔子的话被后代曲解的都有哪些?经典的有哪些? 演奏的反义词 英语中的问句主语是什么 当英语问句主语是these或those怎么回答 综合填空in the home a dad is very important 南非20名白人右翼分子因叛国罪获刑 张德江会见印尼人民协商会议主席西达尔德专家:欧元区最大问题在于违反不援助日本海上自卫队一军官因非法使用兴奋剂委内瑞拉总统称查韦斯音容出现在委地铁美国最新隐身驱逐舰下水 明年秋季开始消息人士称叙化武生产设备销毁工作如期纽约提高香烟禁售最低年龄 未满21不研究证明蝙蝠系非典传播源 病毒可由动小狗被饿三周吃伞充饥 其主人不愿救治男子扮高富帅专门诈骗按摩女 谎称投资我的微信朋友圈被屏蔽了,所以……8块钱一瓶的“老干妈”每天卖出130德赫亚现身马德里街头引转会猜想10-12诡异的抛单这些微信内含秘籍官方:泰特与特雷梅尔告别斯旺西楼继伟:中国政府需要做一些精准调控,奥邦纳:尤文会付出150%努力最帅不过好设计中信银行内部报告揭秘:未来银行的组织萨尼奥尔:拜仁需要格列兹曼龙凤逆界笛奏龙吟水我的女神师傅琴音震世御魂引天星斗士剑铭圣空九流十家掌管阳间我是人王圣域世界大荒魔神莱阳市博物馆旅游万春园旅游西洋楼遗址旅游湖南省立第一师范学校旧址旅游深圳湾口岸旅游中山步行街旅游娘娘山旅游坡峰岭旅游风景区旅游龙脊峡漂流旅游龙脊梯田田头寨旅游圣三一堂旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘