c# 如何让窗口背景透明
且鼠标不会穿透该窗口
######################
c# 如何让窗口背景透明
且鼠标不会穿透该窗口
关于#c##的问题:c# 如何让窗口背景透明且鼠标不会穿透该窗口
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
要实现C#窗口背景透明并且鼠标不穿透该窗口,可以通过设置窗口的
FormBorderStyle
、调整Form
的Opacity
以及使用WM_NCPAINT
消息来绘制非客户区来达到目的。下面是一个详细的步骤及代码示例:-
设置窗口样式:在窗体的构造函数中,通过
SetStyle
方法启用ControlStyles.AllPaintingInWmPaint
和ControlStyles.UserPaint
等样式。 -
调整窗口透明度:将
Opacity
属性设置为小于1的值(例如0.5)可以使窗口背景透明。 -
处理鼠标穿透问题:通过重写
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调用,用于绘制非客户区,从而解决鼠标穿透问题。解决 无用评论 打赏 举报 编辑记录-
悬赏问题
- ¥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服务器安装硬盘后 看不到硬盘