Windows 窗体:阻止 ActiveX 获取鼠标事件

本文关键字:获取 鼠标 事件 ActiveX 阻止 窗体 Windows | 更新日期: 2023-09-27 18:32:36

>上下文

在 Win7 的 C# Windows 窗体应用程序中,我们托管一个 ActiveX 控件。 目前为止,一切都好。

需要:阻止 ActiveX 接收鼠标事件

实际上,ActiveX的功能太多了。 关闭我们不需要的功能不是很可定制。

如果我们只是阻止它接收鼠标事件,那就太好了。

理想的情况是将事件视为 ActiveX 不存在,即鼠标单击直接进入底层(或包含(控件。

但是,如果我们只是阻止 ActiveX 获取事件,那对我们来说是可以的。

询问前搜索

对前面问题的一些回答提到了protected override void WndProc(ref Message m),例如 c# - 将鼠标事件传递到父控件 - 堆栈溢出

其他提及实现IMessageFilters,例如:

  • WinForms - C# 应用程序范围的鼠标左键单击事件 - 堆栈溢出
  • winforms - 在 C# 中处理面板内任意位置的单击事件 - 堆栈溢出
  • WinForms - C# 应用程序范围的鼠标左键单击事件 - 堆栈溢出
  • 从 C# WInForm 上的每个组件捕获鼠标事件 - 堆栈溢出

实验:ActiveX 仍获取事件

我已经相当广泛地尝试了override WndProcIMessageFilter的方式,过滤(选择加入和选择退出(许多事件。在某些情况下,我可以阻止事件到达本机 C# 控件,但 ActiveX 仍然获得了它的份额。

过滤过多,阻止控件和 ActiveX 绘制,甚至阻止应用程序正确绘制或导致退出时崩溃。 这可以通过仔细选择选择加入或选择退出选项来避免。

还有别的办法吗?

C#/.NET 是否有另一种方法可以承载 ActiveX 控件,同时阻止它获取鼠标事件? 也许在应用程序开始时间?

Windows 窗体:阻止 ActiveX 获取鼠标事件

我刚刚遇到了同样的问题(使用不同的 ActiveX(。

@GunnarRoth的答案和页面使用窗口句柄禁用使用 c# - 堆栈溢出的鼠标单击意味着窗口句柄的平台特定魔术,最好尽可能避免这种情况。

一个提示仍然是它的名字中有Enabled

ActiveX 宿主对象是一个 Windows 窗体控件。我只是设置了Enabled=false效果正是我想要的:ActiveX 看不到鼠标单击或键盘事件,但它仍然显示正常。

什至不知道这是否会回答我最初的 ActiveX 控件问题,但这次确实如此! :-(

创建后,尝试在 ActiveX 控件的最上层 hwnd 上执行 EnableWindow(hand,FALSE(。请参阅使用窗口句柄禁用使用 c# 的鼠标单击如何在 C# 中执行此操作。