Winapi d从使用中删除。 如果此解决方案适合您,则只需编写一个程序,通过调用OpenClipboard(NULL)打开剪贴板即可。为了释放剪贴板调用CloseClipboard()

Winapi d从使用中删除。 如果此解决方案适合您,则只需编写一个程序,通过调用OpenClipboard(NULL)打开剪贴板即可。为了释放剪贴板调用CloseClipboard(),winapi,contextmenu,clipboard,editcontrol,Winapi,Contextmenu,Clipboard,Editcontrol,一种方法(类似于hypmir的想法,但不太具有侵入性)是在剪贴板更新时使用“TecMan删除的数据”覆盖它。您可以作为已注册的剪贴板查看器执行此操作。 打开剪贴板,清除所有格式,添加带有通知的CF_文本,然后关闭通知。 我会使用一个短暂的延迟(可能是一个计时器回调),以便在系统上任何其他注册的剪贴板查看器处理完第一次更新后进行更新。 您的里程可能会有所不同。 像这样滥用剪贴板从来不是一个好主意 我在vbforums.com上找到了一个关于如何获得编辑控件上下文菜单句柄的有趣想法: 它演示了如何

一种方法(类似于hypmir的想法,但不太具有侵入性)是在剪贴板更新时使用“TecMan删除的数据”覆盖它。您可以作为已注册的剪贴板查看器执行此操作。
打开剪贴板,清除所有格式,添加带有通知的CF_文本,然后关闭通知。 我会使用一个短暂的延迟(可能是一个计时器回调),以便在系统上任何其他注册的剪贴板查看器处理完第一次更新后进行更新。 您的里程可能会有所不同。
像这样滥用剪贴板从来不是一个好主意

我在vbforums.com上找到了一个关于如何获得编辑控件上下文菜单句柄的有趣想法:

它演示了如何将自定义上下文菜单项添加到标准操作系统上下文菜单中。我认为,这个想法也可以用来修改菜单。理论上,我需要枚举菜单项并禁用与复制/粘贴命令相关的项。问题是如何知道菜单项是否与复制/粘贴相关?获取菜单项文本不是一个好主意;)


该代码的另一个问题是,它基于一些没有文档记录的Windows功能。我已经检查了解决方案,它在Windows 10中仍然有效,但谁知道编辑控制上下文菜单在操作系统的未来更新中可能会如何更改…

@DavidHeffernan,这是一些最终用户的要求;)。在一般情况下,我们还需要将自定义项添加到默认操作系统上下文菜单中。奇怪的用户!用你自己的菜单替换整个菜单可能是最容易的。@DavidHeffernan,你想让我自己实现所有这些特定的命令,比如“从右到左的阅读顺序”吗?我怀疑你的用户想要这些,对吧?闻起来像是一种误导性的尝试,试图阻止用户粘贴密码。小心意外的后果。很多应用程序都在剪贴板上按文档的方式工作。因此,长时间锁定剪贴板将导致冲突、崩溃等。。你甚至不期望的应用程序,如远程桌面,可能会出现问题。请通过vbforums.com链接查看我的答案。也许,您知道一种更好的和/或有文档记录的方法来检索编辑控件上下文菜单的句柄?@TecMan:获取窗口弹出菜单的一种有文档记录的方法是
MN_GETMENU
消息。诀窍是获得弹出菜单的
HWND
,这样您就可以获得它的
humenu
。钩住是唯一的方法。但是,您提供的VBForums链接中提供的详细信息有点错误。我已经用正确的详细信息更新了我的答案。@RemyLebeau:您的解决方案对我不起作用,因为调用
defsublassproc
/
CallWindowProc
会打开上下文菜单,但脚本也会停止,直到下一次单击为止。因此,只有在关闭菜单后,才会调用对其进行操作。我做错什么了吗?@Salvador:我不能在没有看到你的实际代码的情况下回答这个问题。但正如我在回答中所说的,我测试了我描述的两种钩子方法,它们对我来说都很好。该技术确定弹出菜单的
HWND
,并在显示菜单之前将延迟窗口消息发回应用程序。然后,菜单的模态消息循环将该消息发送到应用程序,然后消息处理程序可以从
HWND
中检索
humenu
,并在菜单处于活动状态时操纵菜单。我添加了屏幕截图来证明这一点。@amaninlove我不知道它的菜单ID是什么。但是,您可以使用
GetMenuItemCount()
GetMenuItemInfo()
枚举菜单项,直到找到您感兴趣的项,然后您就可以根据需要使用它的ID(和索引)对其进行操作。尽管VBForum的讨论确实讨论了获取标准编辑控件的
HMENU
的技术,有些细节是错误的。我已经用正确的细节更新了我的答案。