C# 标题栏不能使用Form.TransparencyKey=白色单击

C# 标题栏不能使用Form.TransparencyKey=白色单击,c#,windows,winforms,C#,Windows,Winforms,如果我使用WinForm模板创建一个C#(.NET 3.5)应用程序,并将Form.TransparencyKey属性设置为白色,则在运行应用程序时,标题栏和“关闭”、“最小化”、“最大化”按钮不起作用,单击它们会导致窗口失去焦点,就像在窗口外单击一样。当鼠标悬停在“关闭”等上方时,没有动画。 此操作将一直持续,直到窗口最小化(窗口上的按钮不起作用,因此必须使用winkey+m或通过任务栏完成),然后恢复。在此之后,窗口的行为似乎正常 这种行为背后的机制是什么 环境:Windows Vista(

如果我使用WinForm模板创建一个C#(.NET 3.5)应用程序,并将Form.TransparencyKey属性设置为白色,则在运行应用程序时,标题栏和“关闭”、“最小化”、“最大化”按钮不起作用,单击它们会导致窗口失去焦点,就像在窗口外单击一样。当鼠标悬停在“关闭”等上方时,没有动画。
此操作将一直持续,直到窗口最小化(窗口上的按钮不起作用,因此必须使用winkey+m或通过任务栏完成),然后恢复。在此之后,窗口的行为似乎正常

这种行为背后的机制是什么


环境:Windows Vista(Aero)和VS2008。

窗口中与透明键颜色匹配的任何部分对用户的眼睛都是透明的。对于鼠标,如果你点击窗口的透明部分,你将点击你下面的任何窗口

这使得使用Color.White作为颜色键是一个不好的选择,用户的主题颜色很有可能使标题栏的部分也变成白色。就像“关闭”按钮中的X

非常重要的一点是,您选择的颜色不会出现在窗口的其他任何位置,这样您就不会意外获得透明度。这种颜色的标准选择是颜色。紫红色。漂亮的颜色通常会在用户的视网膜上烧出一个针孔,没有人会自愿在他们的UI设计中使用


还有一个令人痛苦的细节:这种透明性是通过使用分层窗口创建的,在启用Aero的现代windows版本上的实现方式有所不同。对于Aero,它不再由视频适配器实现,而是由DWM在软件中实现。它有一个bug,它不能正确处理某些颜色键值的鼠标透明度。这个bug没有很好的特征化,但我知道它对颜色不起作用。例如红色。因此,选择正确的关键点颜色很重要。除非您想利用这个bug,否则一些程序员仍然希望窗口的透明部分使用鼠标事件。风险很高,但该错误已经存在多年,因此可能不会再得到修复。

1)表单有两个属性,分别称为最小化框和最大化框,请将这两个属性都设置为true


2) 否则将ControlBox属性设置为true

还不能评论答案,所以“答案”只是对汉斯·帕桑答案的(详细)评论。更具体地说,该部分:

它有一个错误,它不能正确处理鼠标的透明度 对于某些类型的颜色关键值此错误不正常 特征化,但我知道它不适用于颜色。例如红色。 因此,选择正确的关键点颜色很重要。除非你想 该缺陷的优点是,一些程序员仍然希望鼠标事件用于 窗户的透明部分

现在,我描述了这个bug的特征。因为我说的是一个bug,所以我觉得有必要提及以下信息自2016年6月2日起对.Net Framework 4.5有效

这个错误实际上是标准的,而不是例外,因为它出现在255/256(99.6%)的颜色中,并且只有1/256(0.4%)的颜色,它的行为与文档中的方式相同

区分这两种情况的条件其实很简单。如果颜色的红色分量与颜色的蓝色分量相同(color.Red==color.Blue),则透明键的行为将与记录的一样:

执行的任何鼠标操作,如单击鼠标 在表格的透明区域将被转移到 透明区域下方的窗口

因此,大多数灰色、绿色和紫色(包括颜色。汉斯回答中提到的紫红色=255、0、255

任何其他颜色都会显示该错误,所有鼠标事件都会发生在透明控件上。换句话说,如果你想利用这个bug,只需确保选择一种红色组件与蓝色组件不同的颜色(color.Red!=color.Blue

因为我可能是第一个记录这个bug的人,所以我不能引用任何参考资料,但是所有16777216个RGB组合都经过了编程测试,结果表明,这种相关性在100%的情况下是有效的


希望了解错误背后的规则可以帮助用户明智地选择颜色,而不是随机尝试大量颜色,直到达到预期效果。

我现在更了解透明度,并且在使用Windows经典主题时,它会按照预期工作。使用Aero,它的行为就好像整个窗口的玻璃边框都是白色的(因此是透明的),但只适用于鼠标。我不会将Hans的帖子编辑成粗体部分,所以让我引用这句话来强调他的观点:还有一个令人痛苦的细节:…软件…有缺陷,它不能正确处理某些颜色键值的鼠标透明度。color.Red例如,曾经在那里,被咬过,现在我知道了。。