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

屏蔽文本框的右键菜单-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下通过。

Netflix基于AWS的大数据平台Hadoop架构解析 微软开始提供Windows Embedded测试版系统 Aaron Swartz自杀原因存疑 引发互联网连锁反应 重金吸引开发者 BlackBerry10应用36小时增1.5万 把数据中心搬入“空间站” Dell和Intel对OpenStack新兴公司Mirantis投资 快讯:马云自5月10日起不再担任CEO职务 Web工程师必备的43款可视化工具 中国电信天翼开放平台2012年度数据:API调用量破亿 iOS走向开放:UC浏览器iPhone版实现云下载 让Dreamweaver支持cshtml (MVC Razor环境) iOS付费榜首:日历应用Fantastical开发者专访 玩转AdMob移动广告:捕鱼达人的猎财之道 12306抢票插件拖垮GitHub 展望2013 jQuery核心团队成员谈其发展路线 Facebook社交视觉搜索分析:引入“竞价排名”? 移动广告现状5大问题解析 Google将于月底举行Google Glass开发者大赛 分享29个超赞的响应式Web设计 Facebook图谱搜索和谷歌搜索有何不同? Facebook向美国iPhone用户提供免费电话 VMware CTO Steve Herrod离职 加盟风险投资公司 维基百科基金会推出众包旅游项目Wikivoyage 最舒适程序员:工作外包给中国 自己却偷懒 Evernote正在与苹果联合开发硬件记忆工具,未来两年公司上市 Fusion-io发布ioScale 全闪存数据中心时代到来? Agent Dash游戏设计之美:如何用2D打造3D体验? 开源项目文档应规避的13处“硬伤” 李开复:Graph Search将可与谷歌搜索媲美 月成本3500美元 如何在AWS上实现BBVA信用卡低延时分析 外媒眼中的国内互联网巨头:服务器集群庞大但缺乏创新 如何刷新文件内容的缓冲? 昨天一夜星际~~~后 一个捉摸的问题,、高分请解决! 在WEBLOGIC5.1上发布EJB1.1的一个小问题 请教,如何用jbuilder 写midas的服务器, 我们公司一个程序员的头式太难看了,我每次见他就恨不得拿剃头的推子给他剃光光! 寻最好的ftp软件 autoCAD的问题 找本站里面《程序员测试软件》的注册码 刚毕业的不能报? .lib 文件到底是怎么回事?如何查看它的内容? 请问,下面的警告提示什么意思(关于sybase) 那位可以给我描述一下“代表”? 请问有WINsock编程高手么,帮我看一下下面的程序 紧急招聘PB程序员(成都) 关于产品序列号的问题……想了很久了。 这里有几个问题,能者请进! 请教VC项目开发经验 如何让下载的程序变成免费的? 请问有Pdf到Text的转化的源代码么? 能否让下载的程序变成免费的? 请问怎样才能自动复制文本框中的文本到剪贴板? 是否可用简体中文的VB开发翻体中文的应用程序? 使用JavaMail转发邮件 在servlet中是不是不可以引用其它的类中的函数.(这个类不是派生于HttpServlet) 为什么买书配送的光盘文件在BCB工程中打开后不让修改(打开前已转换为存档文件了)? 请教使用OPEN CLIENT 的一个小问题 索求算法 请问能否将下载的程序变成免费的? 现在学习C#不晚吧,:P 关于VB中控制运行实例的问题 请教关于DBGRid的问题。 请问在Java下如何实现文件压缩?有没有现成的接口或者压缩算法代码?多谢 这里下载C#电子书《C#教程》(中文 希望出版社) 我如何才能删除ORACLE中建立的用户??总是提示用户不存在或SQL第归错误等等!! CSDN灌水乐园的惊世大骗局!!CSDN灌水乐园的惊世大骗局!!CSDN灌水乐园的惊世大骗局!! 如何用简体中文VB开发翻体中文软件? 高分请教!!!! 一定加分!!!1111111 在打印或打印预览前如何获取报表页数 求助.希望有人帮忙!! 我用ACTIVE REPORT出了问题....相教 请问如何获得硬盘的序列号? 请问各位,有什么好的方法来为用户分配权限,要多少分就给多少? 我有一个www.cnjava.com,有没有人愿意要这个域名? 请问Delphi中关于fropro数据库的软删除问题!急用!谢谢! 当两个表用主键关联时,删除主表的一条记录,关联表对应的记录能不能自动删除(不用代码)? 大家来谈谈各自在制作网页时的css于inc的运用吧 小弟对Java及C#的一点看法-请大家指正! 高手请进,帮我看看这是什么意思?感谢非常 基于组件的三层应用程序怎么打包?200分相赠!!! 如何执行带OUT参数的ORACLE的存储过程 修一条路,第一天修了全长的3分之1,第二天修了全长的4分之1,两天共修了84米,这条路全长多少米? 某工人三天做完一批零件,第一天做了84个,第二天做了余下的2/7,第三天和前两天做总数一样多,这批零件有几算式 工程队用了2天修了一条路,第一天完成全程的百分之50还多72米,第二天修的相当于第一天修的5分之3,这条路全长多少? 修一条路,第一天修了全长的8分之3,第二天修了全长的4分之1,两天共修了1500米,这条路长多少米? 小王三天做完一批零件,第一天做了总数的1/4,第二天比第一天多做了5个,第三天做了25个这批零件有多少个 工程队用两天时间修完一条路,第一天完成全程50%多72米,第二天修的是第一天修的3/5,这条路长多少米?不要方程 筑路队修一条路,第一天修了全长的1/20,第二天比第一天多修了o.5千米,两天共修了4千米.这条路 王师傅用3天共加工零件1200个,他第一天加工了总数的3分之1,第二天加工了余下的8分之3,第3天加工多少个 工程队修一条路每天修72米,28天可以修完,如每天修96米,多少天能修完?以---为等量关系,设X天修完,方程是: 筑路队修一条路 第一天修了全长的1/20,第二天比第一天多修了0.5千米,两天共修了4千米.这条路全 某工人1月份生产某零件1200个 修路队用两天时间完成一条公路,第一天修了全程的50%还多72米,第二天修的相当于第一天修的1/3这条公路长多少米(方程) 修路,第一天修了这条路的3/8,第二天修的路程比第一天少了总路长的1/16,两天一共修了这条路的几分之几? 某车间原计划加工1200个零件,实际第一天完成了原计划的3/8 ,第二天完成了原计划的5/12,第三天加工的是前两天的和,实际超过原计划的几分之几? 工程队修一条路,第一天修了全长的5分之2,第二天修了全长的百分之25,还剩154米没修,这条路全长多少米? 修路队修一条公路,第一天修了这路的1/4,第二天修了余下的2/3,两天共修了1200米,这条路全长多少米?的解方程的详细过程 王师傅要加工一批零件,第一天完成计划的58 ,第二天完成计划的712 ,实际完成的超过原计划的几分之几?怎怎么做 工程队修一条路,第一天修5分之1,第二天修4分之1,第二天比第一天少修25米这条路有多少米?工程队修一条路,第一天修总路程的5分之1,第二天修总路程的4分之1,第二天比第一天少修630米这条路 修一条路,第一天修了全长的5分之1,第二天比第一天多修15米,这时修好的和未修的比是1:3,这条路有多长?啊 修一条公路,第一天修了全长的1/4,第二天比第一天多修20米 还剩100米 两天共修了全长的几分之几 红旗车间三天生产了一批零件,第一天生产了总数的 ,第二天比第一天多生产20个,第三天生产了55个.这批零 修一条路,第一天修了全长的3分之1,第二天修了全场的4分之1,第一天比第二天多修200米.这条路长多少?谁第一个回答就是最佳答案.要有算式和过程! 修一条1200米的路,第一天修了全长的3分之1,第2天修了4分之1两天共修了几分之几,两天修了多少米 红旗车间三天生产了一批零件,第一天生产了总数的七分之二,第二天比第一天多生产了20个,第三天生产了55个这批零件宫有多少个? 一条路,第一天修了全长的4分子1,第二天修了全长的5分之1,(),这条路长多少米?(1)500除以4分之1 条件:()(2)400除以5分之1 条件:()(3)1100除以(1-4分之1-5分之一)条件:()(4)900除以 李师傅三天完成一批零件的加工任务.第一天加工的零件数与总零件数的比是2:9,第二天加工了180个零件,前李师傅三天完成一批零件的加工任务。第一天加工的零件数与总零件数的比是2:第 李师傅计划三天内运完一批货物,第一天运了42吨,占这批货物的五分之二,第二天与第三天的运货量之比是4:3.李师傅第二天运货多少吨. 有一条路第一天修5/1第二天修4/1还剩33米问这条路原来多长 李师傅3天完成一批零件的任务.第一天加工的零件数与总零件数的比是2:9,第二天加工了180个零件,前两天加工的零件数正好占总零件数的2—.李师傅第一天加工了多少个零件?3 搬运工计划三天内运完一批货物,第一天运了42吨,占这批货物的5分之2,第二天与第三天的运量比是4比3,第二天运多少吨 修一条路,第一天修这条路的2分之1还多2千米,第二天修余下的3分之1少1千米还剩20千米,求这条路的长度! 李师傅三天完成一批零件的加工任务,第一天加工的零件数与未加工零件数的比2:7,第二天加工180个零件,前两天加工的零件数正好占零件总数3分之2,李师傅第一天加工了多少个零件?容易看懂~ 青年运输队计划3天运完一批货物.第一天运480吨,占这批货物的40%.第二天运的和第三天运的比是3比5.问:第三天的货物有多少吨? 修一条路,第一天修了五分之一,第二天修了150米,两天共修了七分之二,这条路有多长?谁知道? 小李四天做完一批零件,第一天和第二天共做了54个,第二天,第三天,第四天共做90个,已知第二天做的个数占这批零件的五分之一,这批零件有多少个? 某建筑队计划3天修完一条公路,第一天修了全长的五分之二,第二天修的是第一天的百分之八十,第二天比第一天少修120米问这条路长多少米?第三天修了多少米?怎么列式谢谢 一条路全长1200米,第一天修了全长的五分之一,第二天修了全长的四分之一.一条路全长1200米,第一天修了全长的五分之一,第二天修了全长的四分之一,两天一共修了多少米?第二天比第一天多修 小李四天做完一批零件,第一天和第二天共做了54个,第二,第三和第四天共做了90个,已知第二天做的个数占这批零件的5分之1,这批零件一共有多少个? 修路队计划修一条长1500m的公路,第一天修了全长的五分之二,第二天修了全长三分之一,还剩下多少米 修一条路,第一天修了全长的1/2,第二天修的是第一天的2/3,还剩几分之几没修?大哥大姐, 小李四天做完一批零件,第一天和第二天共做了54个,第二天、第三和第四工共做了90个,已知第二天做的个数占这批零件的5分之一,这批零件共有多少个? 市公路管理计划修一条全长200千米的公路,第一天计划修全长的五分之二,余下的第二修完,第二天计划修多少千 修路工人修一条路,第一天修了这条路的4分之1,第二天修了余下的3分之1,工人两天共修了这条路的几分之几? 张师傅四天做完一批零件,第一天和第二天共做了54个,第二、第三、第四天共做了90个,已知第二天做的占这批零件的五分之一.这批零件共有多少个? 王师傅计划3天内运完一批货物,第一天运了42吨,占这批货物的2/5,第二天与第三天的重量比是4:3第二天运货多少吨(要有详细的算式) 一个修路队修一条路,第一天修了25米,第二修了全长的62.5%少4米,两天修了全长的80%.这条路全长多少米? 王师傅3小时制作了48个机器零件,照这样计算,制作80个零件,需要多少小时? 码头上有一批货物,计划三天运完.第一天运走了全部的五分之三,第二天运走了五分之三吨,第三天还要运四分之三吨.第二天和第三天共运了多少吨?第二和第三天共运的是这批货物的几分之几? 修路队修一条路,第一天修了480米,比第二天多修了20%,第二天修多少米?两天一共修了多少米? 王师傅4小时制作了96个机器零件,照这样计算,制作72个零件需要多少小时?(用方程解) 王师傅计划3天内运完一批货,第一天运了42吨,占这批货的5分之2,第二天与第三天运的重量比是4:3,第二天运多少吨?(上下接着的)急, 修路工人要修一条路,第一天修了520米,相当于第二天修路米数的80%两天一共修了多少米?请说明为什么谢谢. 两台机器生产同一种零件,第一台3分之一小时生产20个零件,第二台每小时生产80个零件.两台机器同时生产70两台机器同时生产70个零件需要几小时. 某工人计划在3天内加工完一批零件,第一天加工480个,占这批零件的40%,第二天与第三天加工零件数的比是2: 工人师傅修一条路,已修的是未修的路的80%,已修的路与未修路的比是()要说理由啊 某车间计划加工一批零件,第一天加工了计划总数的1/4,第二天比第一天多加工1/3,第三天比第一天少加工1/3某车间计划加工一批零件,第一天加工了计划总数的1/4,第二天比第一天多加工1/3, 某工厂计划在3天内加工完一批零件,第2天加工了480个,占这批零件的五分之二,第二天与第三天加工的个数比是3比5,第二天加工了几个? 某修路队修一条路,第一天修了全长的1/20,第二天比第一天多修1/5千米,两天共修2.7千米,这条路全长多少千米? 工人师傅加工一批零件用了3天,第一天加工的零件时零件总数的5分之2,第二天加工的零件时零件总数的7分之2第3天加工的零件时零件总数的几分之几? 某工程队修一条路,第一天修了全长的5/27;第二天修了某工程队修一条路,第一天修了全长的5/27,第二天修了余下的3/11,第三天修了第二天余下的5/6,第四天修了8千米,正好修完.求这条路全长多
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn