文本编辑框的右键菜单不可修改?

2023-11-09

  最近写了个小工具,用来处理特定的文字编辑任务。 编辑后的内容通过剪贴板复制到其他的程序中。

  全选 ->  复制  ->  切换到其他程序  ->  全选  -> 粘帖。
  这本是个极简单的操作过程,不过操作的次数多了,还是觉得不胜其烦,就想把这个操作在精简一下。于是就想了个主意:在系统的Edit control的右键菜单中追加一项菜单,直接完成进程间通讯的功能, 这样子就能向任意文本窗口发送内容了。


  想到就做,于是翻了翻资料,把一些subclassing,superclassing的东西重新捡起来看了一下,拦截了Edit的窗口过程,在菜单弹出的通知WM_INITMENUPOPUP中修改了一下菜单。跑起来一看,没反应。

 
  第一次运行嘛,这很正常,于是加了些诊断调试的语句。发现确实是成功加载了的。而且修改其他的地方都有效,比如把所有输入的文字都+1: a变成b,b变成c......。运行后新打开一个记事本,都和预期一样。就是拦截菜单消息的地方没反应。

  这就奇怪了,难道消息不对? 不应该啊,MSDN上说的清清楚楚的菜单弹出的通知消息。而且在测试程序里,在对话框上弹出个菜单是完全能收到通知的。于是就用Spy++验证一下。不验证不知道,一验证吓一跳,在记事本里弹出右键菜单,根本没有任何菜单通知消息!

  这可不妙,没有菜单通知消息,就没办法在菜单弹出前获得机会修改他了。通常窗口弹出菜单都有通知消息,难不成Edit control特殊?例外? 于是上网搜了搜,发现果真有人碰到同样的问题。

  而答案呢,普遍的说法是Edit的右键菜单是无法修改的,只能替换。而且msdn论坛上的微软专家也是这么说的。

  这种结果真是让人扫兴,而且解释的太牵强,于是就像继续找找原因,看看有没有可以变通的地方。结果有位强人提到了MN_GETHMENU 消息。这个消息以前是不公开的,2000以后的msdn中才开始公开。这个消息可以获得窗口的菜单句柄,对于一些针对菜单处理的程序可能有用。对于本例是 没什么帮助的,不过这位强人贴出了一份windows源码中使用MN_GETHMENU的函数。
这倒给了我一点思路,源码泄漏那阵子我也一时兴起收藏了一份,却没怎么真正看过,这回正好可以拿来看看为什么Edit不支持菜单通知消息。

  一番搜索之后,找到了Edit的右键菜单处理源码(private/ntos/w32/ntuser/client/editec.c),发现:果真他是 不支持通知消息的,注释中就有Note that this is NOT subclassing friendly, like most of our functions,for speed and convenience.

  接着往下看,就发现了为什么不支持了,他在TrackPopupMenuEx的时候加入了 TPM_NONOTIFY风格,指定不发送任何通知消息,而是通过返回值的方式立即处理菜单结果。
  这种处理方式本来无可非议,也似乎符合c的风格,简单方便,有时候偷懒我也这么用来着。问题是有段说明为什么加上 TPM_NONOTIFY风格的注释让我郁闷着了:

We need to use TPM_NONOTIFY because VBRUN100 and VBRUN200 GP-fault on unexpected menu messages.

  又一个古老的妥协造成的bug遗留到了今天?? 而且,居然是Windows系统级的 Edit 向 应用级的 VB 妥协???? 大家今天受的这些困惑全来自于恐龙时代的VBRUN100, VBRUN200.


 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文本编辑框的右键菜单不可修改? 的相关文章

随机推荐

  • Python二级考试常见题型及解析(附刷题软件)

    导语 Python二级考试是计算机等级考试中非常重要的一项考试 需要熟练掌握Python的基础知识和常见的编程技巧 本文将为大家介绍Python二级考试常见的题型及解析 并提供多个实例代码进行演示 帮助大家更好地理解和掌握考试内容 一 选择
  • 三因子两水平doe_DOE试验设计案例

    DOE试验设计 一种安排实验和分析实验数据的数理统计方法 试验设计主要对试验进行合理安排 以较小的试验规模 试验次数 较短的试验周期和较低的试验成本 获得理想的试验结果以及得出科学的结论 从本质上讲 DOE 是这样一门科学 研究如何以最有效
  • 软件工程-12章

    一 判断题 程序设计语言是值编程是表现出来的特点 习惯 逻辑思维等 F 进行程序设计语言的选择是 首先考虑的是应用领域 T 好程序的一个重要标准是源程序代码的逻辑简明清晰 易读易懂 T 软件测试的目的是尽可能多地发现软件中存在的错误 将它作
  • 关于辽大信息学院选导师的一点儿心得

    首先 看到这个博文的时候 你可能已经上岸了 欢迎进入一所211综合院校 信息学院成立源远流长 涉及科类比较多 从电工电子到软件 以及生物学 学院的哲理楼也是孕育了一大批辽大优秀的学子 其他的不扯了 谈选导师的事情 首先 学院任何一位老师都有
  • 解压报错 你需要从上一压缩卷启动解压命令以便解压 解决方案及WinRAR怎么分卷压缩详解

    一 解决方案 1 问题描述 解压的时候报错 提示 你需要从上一压缩卷启动解压命令以便解压 2 解决 会出现这个问题 是因为你正在解压的文件为分卷压缩生成的压缩包 首先你要确保自己有完整的压缩包 可能对方将压缩包分为5个 那么你就需要拿到5份
  • Tensorflow2.0训练损失值降低,但测试正确率基本不变的情况

    Tensorflow2 0训练损失值降低 但测试正确率基本不变的情况 问题描述 解决方法 修改参数 检查模型 loss计算方法 数据标签 权重初始值 问题描述 对于一个架构 在识别mnist手写数字集精度较高的情况下 更换其他数据集 却无法
  • 大数据集群可视化管理界面

    hadoop hadoop http master 50070 dfshealth html tab overview hdfs http master 50070 explorer html yarn http master 8088 c
  • a deep leaning

    1 设计了新的搜索空间 即NASNet search space 并在实验中搜索得到最优的网络结构NASNet 2 提出新的正则化技术 ScheduledDropPath 是DropPath方法的改进版 可以大大提高了模型的泛化能力 Dro
  • 大学计算机基础 - 第十一章习题

    1 选择题 1 多媒体计算机中的媒体信息是指 D 文字 音频 音频 图形 动画 视频 视频 音频 A B c D 全部 2 多媒体技术的主要特性有 C 多样性 集成性 交互性 实时性 A 仅 B c D 全部 多媒体技术具有以下基本特征 1
  • 【Linux】基础IO篇

    文章目录 C文件接口 系统调用文件接口 文件描述符 是什么 分配规则 内核角度理解 从task struct的角度理解文件描述符在内核当中是什么 理解文件描述符和文件流指针的区别 重定向 符号 接口 内核角度理解重定向 重定向的代码验证 动
  • Android获取IP地址

    主要获取IP地址代码 Get Ip address 自动获取IP地址 throws SocketException public static String getIpAddress String ipType String hostIp
  • 在 Windows 上远程对 Linux 进行抓包

    文章目录 名词解释 事先准备 下载安装 Wireshark 下载运行 libpcap 设置 libpcap 环境变量 在 Wireshark 中远程连接 libpcap 笔者的运行环境 成功 本地客户端 Windows Windows 10
  • Php工具箱配置环境+DW

    Php工具箱 Wamp框架 一配置apache Web服务器软件 web php 脚本语言 mysql 1 下载phps工具箱 网址 http phpstudy php cn 安装 不装到c盘 PHP自动生成 2 Vc库安装 32位vc9和
  • 通过REST API搜获jira issue踩过的坑

    用命令行的方式使用jira的REST API需要特定权限 可以跟管理员申请权限 命令备忘 curl u username X GET H Content Type application json https jira xx com res
  • Cannot download sources Sources not found for 问题解决方案

    idea下载文件源码时报Cannot download sources Sources not found for org apache tomcat embed tomcat embed core 8 5 32 错误 解决方案 在mave
  • linux top交叉编译_ARM Linux 交叉编译 工具链 制作攻略

    ARM Linux 交叉编译 工具链 制作攻略 2007 06 25 20 04 0 制作之前确保你的机子上有如下几个工具 bison flex build essential build essential 主要是用于提供GCC GLIB
  • 利用jawin完成调用window中dll的调用

    最近由于项目的特殊需求 我们必须在程序调用window的dll 开始我们用jni 后来由于调用的dll太多 而且很烦琐 所以 我们决定用开源的jawin调用 jawin 可以对dll中的方法进行调用 也可以调用com中的方法 内部还提供了一
  • vue 全局指令实现防止按钮重复点击 防抖

    vue 全局指令实现防止按钮重复点击 防抖 指令代码 通过为按钮设置disabled属性在3秒内阻止重复点击 设置定时器在3秒后移除disabled属性 export const preventClick inserted el bindi
  • B站 马士兵Python 入门基础版 - 课程笔记

    视频传送门 https www bilibili com video BV1wD4y1o7AS 记得三连 文章目录 print的规则 数字类型 类型转换 Python中的运算符 链式赋值 参数赋值 位运算符 运算符的优先级 程序的组织结构
  • 文本编辑框的右键菜单不可修改?

    最近写了个小工具 用来处理特定的文字编辑任务 编辑后的内容通过剪贴板复制到其他的程序中 全选 gt 复制 gt 切换到其他程序 gt 全选 gt 粘帖 这本是个极简单的操作过程 不过操作的次数多了 还是觉得不胜其烦 就想把这个操作在精简一下