Cool Cool の 橙 2024-06-09 18:06 采纳率: 0%
浏览 20

关于#c##的问题:c# 如何让窗口背景透明且鼠标不会穿透该窗口

c# 如何让窗口背景透明
且鼠标不会穿透该窗口
######################
c# 如何让窗口背景透明
且鼠标不会穿透该窗口

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-09 18:06
    关注

    引自免费微信小程序:皆我百晓生

    要实现C#窗口背景透明并且鼠标不穿透该窗口,可以通过设置窗口的FormBorderStyle、调整FormOpacity以及使用WM_NCPAINT消息来绘制非客户区来达到目的。下面是一个详细的步骤及代码示例:

    1. 设置窗口样式:在窗体的构造函数中,通过SetStyle方法启用ControlStyles.AllPaintingInWmPaintControlStyles.UserPaint等样式。

    2. 调整窗口透明度:将Opacity属性设置为小于1的值(例如0.5)可以使窗口背景透明。

    3. 处理鼠标穿透问题:通过重写WndProc方法并处理WM_NCPAINT消息,可以自定义非客户区的绘制,确保鼠标事件被正确捕获。

    以下是具体的C#代码实现:

    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    public partial class TransparentWindow : Form
    {
        public TransparentWindow()
        {
            InitializeComponent();
            
            // 设置窗口样式
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint |
                          ControlStyles.DoubleBuffer, true);
            
            // 设置窗口透明度
            this.Opacity = 0.5;
            
            // 设置窗口边框样式为无边框
            this.FormBorderStyle = FormBorderStyle.None;
            
            // 设置窗口背景色为透明
            this.TransparencyKey = this.BackColor;
        }
        
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x85) // WM_NCPAINT
            {
                // 绘制非客户区,防止鼠标穿透
                IntPtr dc = Win32.GetWindowDC(m.HWnd);
                Win32.DrawEdge(dc, ref Win32.RECT.FromRectangle(this.ClientRectangle), 
                               Win32.EDGE.SUNKEN, Win32.BF.DIAGONAL);
                Win32.ReleaseDC(m.HWnd, dc);
            }
            base.WndProc(ref m);
        }
    }
    
    // 用于Win32 API调用的类
    public static class Win32
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
            
            public static RECT FromRectangle(Rectangle rect)
            {
                return new RECT { Left = rect.Left, Top = rect.Top, Right = rect.Right, Bottom = rect.Bottom };
            }
        }
        
        public const int EDGE_SUNKEN = 0x0001;
        public const int BF_DIAGONAL = 0x0008;
        
        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr hWnd);
        
        [DllImport("user32.dll")]
        public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
        
        [DllImport("gdi32.dll")]
        public static extern bool DrawEdge(IntPtr hdc, ref RECT lprc, int edge, int flags);
    }
    

    这段代码创建了一个透明背景的窗口,并通过处理WM_NCPAINT消息来确保鼠标事件不会穿透窗口。注意,Win32类包含了一些必要的Win32 API调用,用于绘制非客户区,从而解决鼠标穿透问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月9日

悬赏问题

  • ¥15 问题遇到的现象和发生背景 360导航页面千次ip是20元,但是我们是刷量的 超过100ip就不算量了,假量超过100就不算了 这是什么逻辑呢 有没有人能懂的 1000元红包感谢费
  • ¥30 计算机硬件实验报告寻代
  • ¥15 51单片机写代码,要求是图片上的要求,请大家积极参与,设计一个时钟,时间从12:00开始计时,液晶屏第一行显示time,第二行显示时间
  • ¥15 用C语言判断命题逻辑关系
  • ¥15 原子操作+O3编译,程序挂住
  • ¥15 使用STM32F103C6微控制器设计两个从0到F计数的一位数计数器(数字),同时,有一个控制按钮,可以选择哪个计数器工作:需要两个七段显示器和一个按钮。
  • ¥15 在yolo1到yolo11网络模型中,具体有哪些模型可以用作图像分类?
  • ¥15 AD9910输出波形向上偏移,波谷不为0V
  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘