最顶层的透明可点击形式,可点击通过控件C#

时间:2016-01-10 08:50:39

标签: c# winforms transparent

我在透明表格上使用GDI绘制了一些矩形。

表单是全屏的,始终位于顶部。 此外,它可以通过使用此方法进行点击: Topmost form, clicking "through" possible?

但是,绘制的矩形不能像我的表单一样点击,每次点击它们时我的应用程序都会失去焦点。此外,当我将鼠标悬停在它们上面时,我可以看到我的应用程序光标(窗体下的窗口是游戏,因此它有一个自定义光标)。

你能告诉我怎样才能让所有控件都无法调焦和点击?是否有可能或者我必须使用DirectX绘图之类的东西?

我搜索了整个网络和堆栈溢出,使用了各种解决方案但没有任何效果。

感谢。

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你想要完成的任务,但是如果你想制作一个可以接收鼠标点击的控件,但是没有“偷”焦点,那么这很有可能:

public class Box : Control
{
    public Box()
    {
        // Prevent mouse clicks from 'stealing' focus:
        TabStop = false;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        DrawText(e.Graphics);
    }

    // Display control text so we know what the button does:
    private void DrawText(Graphics graphics)
    {
        using (var brush = new SolidBrush(this.ForeColor))
        {
            graphics.DrawString(
                this.Text, this.Font, brush,
                new PointF()
                {
                    X = ((float)this.Width / 2f),
                    Y = (((float)this.Height / 2f) - (this.Font.GetHeight(graphics) / 2f))
                },
                new StringFormat()
                {
                    Alignment = StringAlignment.Center
                });
        }
    }
}


这个简单的控件将显示为一个仍然能够接收鼠标点击和点击事件的矩形,但不会从表单上的其他控件(也不是表单本身)中窃取焦点。


将表单上的透明度键设置为其背景颜色将使表单的其余部分不可见,以便只显示矩形“按钮”。这也可以与Opacity属性结合使用,使显示的内容为半透明,但不透明度 零的表单不会与鼠标交互(通过Windows设计)。

简单地将表单的TopMost属性设置为true可能不足以使窗口保持在所有其他窗口之上。您可能需要在首次创建表单时从表单中进行以下API调用(例如,放置在构造函数中,OnLoad事件,等。):

SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW));


可以找到有关此功能的MSDN文档here

要进行此调用,您需要将以下Windows API声明添加到表单类:

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

并添加以下常量:

private const int SWP_NOMOVE     = 0x0002;
private const int SWP_NOSIZE     = 0x0001;
private const int SWP_SHOWWINDOW = 0x0040;

private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);


我希望这有帮助!