将上下文菜单项添加到操作系统范围的所有文本框中

时间:2011-02-15 00:55:08

标签: c# windows operating-system contextmenu

我知道可以扩展标准文件的上下文菜单,但有没有办法将项目添加到系统范围的文本框上下文菜单中?

这样,新项目会显示在用户可以在Windows中的任何位置输入的每个文本框中吗?

例如,允许添加此类功能,例如根据拼写检查器查找所选文本。

4 个答案:

答案 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)

您必须add a Mouse Hook

然后在您单击的窗口/控件是文本框时弹出上下文菜单。

这可能(也可能会)干扰已存在的上下文菜单,因为您将隐藏它们或与它们发生冲突。

(虽然可怕的计划......)

答案 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方法。