我知道可以扩展标准文件的上下文菜单,但有没有办法将项目添加到系统范围的文本框上下文菜单中?
这样,新项目会显示在用户可以在Windows中的任何位置输入的每个文本框中吗?
例如,允许添加此类功能,例如根据拼写检查器查找所选文本。
答案 0 :(得分:3)
使用C#技术上是不可能的。
让我们想象下一个情况。假设您已经成功编写了托管扩展,并“扩展”了系统中的任何文本框上下文菜单。当然,您应该处理已添加的每个新菜单项。为了实现这一点,您应该将托管代码注入到具有文本框的每个进程并替换其WindProc
。好的,假设系统中存在托管的应用程序,该版本的.net版本与您用于扩展的版本不同。因此,在这种情况下,在扩展注入期间会出现严重错误,因为每个进程只能加载一个.net版本。所以没有办法编写健壮的托管低级钩子或shell扩展。来自here:
不支持全局挂钩 .NET Framework
除了 WH_KEYBOARD_LL低级钩子和 WH_MOUSE_LL低级钩子,你不能 实现全局钩子 Microsoft .NET Framework。安装一个 全局钩子,钩子必须有本机 DLL导出将自己注入另一个 需要有效的流程, 调用的一致功能。这个 行为需要DLL导出。该 .NET Framework不支持DLL 出口。托管代码没有概念 一个函数的一致值 指针因为这些功能 指针是构建的代理 动态。调用低级挂钩过程 在安装钩子的线程上。 低级挂钩不需要这样 钩子程序在一个实现 DLL。
您还可以查看this文章,了解不应编写托管shell扩展的原因。
答案 1 :(得分:2)
从您尝试使用的文本框继承并在那里添加默认值。使用您的类而不是文本框类。
答案 2 :(得分:1)
然后在您单击的窗口/控件是文本框时弹出上下文菜单。
这可能(也可能会)干扰已存在的上下文菜单,因为您将隐藏它们或与它们发生冲突。
(虽然可怕的计划......)
答案 3 :(得分:0)
使用表单和上下文菜单调用Bind方法。
void Bind(Control c, ContextMenu menu)
{
foreach (Control subcontrol in c.Controls)
Bind(subcontrol);
TextBox textBox = c as TextBox;
if (textBox != null)
{
textBox.ContextMenu = menu;
}
}
如果添加动态文本框,请将其置于Bind方法的前缀:
c.ControlAdded += (s, e) => Bind(e.Control, menu);
只要将控件添加到表单或其他控件,就会调用Bind方法。