C# 分层窗口、UpdateLayeredWindow、alpha混合和鼠标事件

C# 分层窗口、UpdateLayeredWindow、alpha混合和鼠标事件,c#,.net,winforms,alphablending,layered-windows,C#,.net,Winforms,Alphablending,Layered Windows,在Windows窗体和C#中,我使用了一个具有WS_EX#u分层样式的窗体,并调用UpdateLayeredWindow将背景设置为透明/alpha混合的图像: NativeMethods.BLENDFUNCTION blend = new NativeMethods.BLENDFUNCTION(); blend.BlendOp = NativeMethods.AC_SRC_OVER; blend.BlendFlags = 0; blend.SourceConstantAlpha = 255;

在Windows窗体和C#中,我使用了一个具有WS_EX#u分层样式的窗体,并调用UpdateLayeredWindow将背景设置为透明/alpha混合的图像:

NativeMethods.BLENDFUNCTION blend = new NativeMethods.BLENDFUNCTION();
blend.BlendOp = NativeMethods.AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = NativeMethods.AC_SRC_ALPHA;

NativeMethods.UpdateLayeredWindow(form.Handle, screenDc, ref topPos, ref size, 
    memDc, ref pointSource, 0, ref blend, NativeMethods.ULW_ALPHA);
在图像透明的窗体区域上,窗体不接收鼠标事件。他们走到窗体下面的窗口

是否有可以设置的窗口样式或选项,使窗体能够在其整个表面上接收鼠标事件(鼠标移动、鼠标下移等)?

命中测试 分层窗口的命中测试基于窗口的形状和透明度。这意味着窗口中有颜色键或alpha值为零的区域将允许鼠标消息通过。 如果分层窗口具有WS_EX_透明扩展窗口样式,则将忽略分层窗口的形状,并将鼠标事件传递到分层窗口下的其他窗口

我会尝试从

命中测试 分层窗口的命中测试基于窗口的形状和透明度。这意味着窗口中有颜色键或alpha值为零的区域将允许鼠标消息通过。 如果分层窗口具有WS_EX_透明扩展窗口样式,则将忽略分层窗口的形状,并将鼠标事件传递到分层窗口下的其他窗口


我会尝试设置WS_EX_透明样式

我一开始没有设置WS_EX_透明样式。不管怎么说,我试着把它取下来,但它不起作用。透明区域上的鼠标事件仍然会通过。(为了检查,我还尝试设置它,设置后,所有鼠标事件都会通过,即使在非透明区域也是如此。)@Jamrelian你可以作弊并将透明区域设置为alpha值1(255)。我想知道这是否基本上是清晰的,但不是完全清楚的。幸运的是,我没有使用设置为背景的alpha混合控制图像,用户选择了它。这意味着我应该以编程方式检查并更改任何加载图像中每个像素的alpha值。听起来好像有很多性能问题…@Jamlelian为什么首先要对窗口进行分层,听起来好像它做的正是您不想要的事情?它是一种透明的闪屏窗口,这就是为什么它需要分层并使用alpha混合,但用户可以选择其他图像的原因.我一开始没有设置WS_EX_透明样式。不管怎么说,我试着把它取下来,但它不起作用。透明区域上的鼠标事件仍然会通过。(为了检查,我还尝试设置它,设置后,所有鼠标事件都会通过,即使在非透明区域也是如此。)@Jamrelian你可以作弊并将透明区域设置为alpha值1(255)。我想知道这是否基本上是清晰的,但不是完全清楚的。幸运的是,我没有使用设置为背景的alpha混合控制图像,用户选择了它。这意味着我应该以编程方式检查并更改任何加载图像中每个像素的alpha值。听起来好像有很多性能问题…@jamlelian为什么首先要对窗口进行分层,听起来好像它做了你不想要的事情?它是一种透明的闪屏窗口,这就是为什么它需要分层并使用alpha混合,但用户可以选择其他图像。