c# - 如果将窗体大小调整为以前的透明区域,则不再检测窗体上的鼠标事件

标签 c# winforms mouseevent transparent

这似乎是一个错误,如果您将表单大小更改为以前的透明区域,则将不再检测到鼠标事件。

如何重现它:

  • 创建一个新的 Windows 窗体项目
  • 将 Form1 TransparencyKey 设置为洋红色
  • 向 Form1 添加面板并将其配置为:
    • 停靠填充
    • 背景颜色为洋红色

运行,现在尝试更改窗体大小,如果减小它(足够新边框将放置在当前透明区域上方),鼠标将不再“检测”该侧的窗口边框。如果您最小化/恢复窗口,它将再次工作。我该如何解决这个问题?我尝试在表单布局/调整大小事件上刷新,但没有成功。

最佳答案

只是为了确认一下,是的,这是 Windows 8.1 上当前 Aero 实现中的一个错误。可能是之前。已经存在很长一段时间了,这似乎是一个相当结构性的问题。它是与具有透明度键设置的分层窗口相关的一组错误的一部分,并且使鼠标对此类窗口透明,它也无法在某些颜色选择下正常工作 key 。在这种特定情况下,它也不恰本地使框架对点击透明。

很难给出具体建议,这确实需要调用 Microsoft 支持才能取得进展。从技术上讲,您可以利用另一个错误,当您选择“红色”作为透明键时,窗口对于鼠标单击永远不会透明:

    public Form1() {
        InitializeComponent();
        this.TransparencyKey = panel1.BackColor = Color.Red;
    }

解决了您正在处理的错误,但当然完全禁用了鼠标透明度。您几乎肯定不会喜欢的解决方法是:

    protected override void OnResizeEnd(EventArgs e) {
        base.OnResizeEnd(e);
        this.RecreateHandle();
    }

太引人注目了。程序员开始利用这些错误,有时他们故意想要这种缺乏透明度的情况。让你想知道微软如何在不破坏某些程序的情况下解决这个问题。不太漂亮。

关于c# - 如果将窗体大小调整为以前的透明区域,则不再检测窗体上的鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27400556/

相关文章:

c# - 在 C# 中使用 vb.net 类

c# - 删除实体时出现错误 : The relationship could not be changed because one or more of the foreign-key properties is non-nullable

c# - 如何在 C# 中将 NotifyIcon 行为设置为 AlwaysShow?

c# - 有什么方法可以检测用户控件外的鼠标点击吗?

c# - 领域驱动设计和聚合

c# - 验证上传的文件是图像

c# - 取消从应用程序调用网络服务

c# - Winforms 数据绑定(bind)最佳实践

Java检测OSX上按住ctrl单击释放了哪个mouseButton

javascript - jQuery 单击处理程序仅触发一次