最顶层的形式,点击"通过"可能吗?

Pet*_*etr 10 c# winforms

感谢您之前的答案,这些答案使我能够完成在鼠标坐标中显示大红十字的基本工具,以便更加明显.红十字是透明形式的透明背景图像.问题是你不能点击,因为它的最顶层和窗体的中心实际上是鼠标xy.有没有什么方法可以使这个可用,以便交叉仍然显示在光标上但"可点击"通过?

Joe*_*oey 10

您可以使用SetWindowLong设置WS_EX_TRANSPARENT窗口样式:

如果分层窗口具有WS_EX_TRANSPARENT扩展窗口样式,则将忽略分层窗口的形状,并将鼠标事件传递到分层窗口下的其他窗口.

CodeProject有这篇文章详细介绍了这项技术.虽然它在VB.NET中,但转换为C#应该很容易.

我过去使用过以下代码:

public enum GWL
{
    ExStyle = -20
}

public enum WS_EX
{
    Transparent = 0x20,
    Layered = 0x80000
}

public enum LWA
{
    ColorKey = 0x1,
    Alpha = 0x2
}

[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);

[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    int wl = GetWindowLong(this.Handle, GWL.ExStyle);
    wl = wl | 0x80000 | 0x20;
    SetWindowLong(this.Handle, GWL.ExStyle, wl);
    SetLayeredWindowAttributes(this.Handle, 0, 128, LWA.Alpha);
}
Run Code Online (Sandbox Code Playgroud)

但它也是从其他地方复制的.这里重要的是这个OnShown方法.虽然我不得不承认这一行

wl = wl | 0x80000 | 0x20;
Run Code Online (Sandbox Code Playgroud)

有点神秘,设置WS_EX_LAYERED和WS_EX_TRANSPARENT扩展样式.

你也可以设置它

wl = wl | WS_EX.Layered | WS_EX.Transparent;
Run Code Online (Sandbox Code Playgroud)