首页 > 其他分享 >Simple WPF: WPF 透明窗体和鼠标事件穿透

Simple WPF: WPF 透明窗体和鼠标事件穿透

时间:2024-07-19 17:42:42浏览次数:18  
标签:style Simple window WS EX 窗体 WPF

Simple WPF: WPF 透明窗体和鼠标事件穿透

  合集 - Simple WPF(9)   1.Simple WPF:WPF 透明窗体和鼠标事件穿透07-01 2.Simple WPF:WPF 自定义按钮外形07-073.Simple WPF:WPF 实现按钮的长按,短按功能07-084.Simple WPF:WPF自定义一个可以定义步长的SpinBox07-095.Simple WPF:C# 使用基本的async/await实现异步07-096.Simple WPF:C# Task异步任务的取消初探07-097.Simple WPF:WPF实现一个MINIO等S3兼容对象存储上传文件的小工具07-108.Simple WPF:S3实现MINIO大文件上传并显示上传进度07-119.Simple WPF:WPF使用Windows API发送Toast通知07-15 收起  

最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。
创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!

一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。

这个方法不一定是制作WPF透明窗体最合适的方法,请各路大大不要喷。
完整代码地址:Github

一、 去除标题栏#

去除标题栏的方式非常简单,就是设置WindowStyleNone

<Window x:Class="NonFrameWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:NonFrameWindow"
        mc:Ignorable="d"
        WindowStyle ="None" ResizeMode="CanMinimize"
        Title="MainWindow" Height="450" Width="800">

image

二、 设置窗体模板显示透明背景和内容#

使用WindowChrome类自定义窗体样式,设置 GlassFrameThickness 为-1表示遮挡住整个原生窗口。设置Window模板增加透明的边框背景,嵌套一个圆角边框并配置阴影属性,在边框中展示其他内容控件

    <WindowChrome.WindowChrome>
        <WindowChrome GlassFrameThickness="-1"/>
    </WindowChrome.WindowChrome>
    <Window.Template>
        <ControlTemplate TargetType="Window">
            <Border Padding="64" Background="Transparent">
                <Border CornerRadius="16" Background="#10FF1010">
                    <Border.Effect>
                        <DropShadowEffect BlurRadius="64" />
                    </Border.Effect>
                    <ContentPresenter ClipToBounds="True" />
                </Border>
            </Border>
        </ControlTemplate>
    </Window.Template>

image

三、设置窗口属性使得鼠标事件穿透到下层窗体#

引入user32.dll的函数,进行设置

private const int WS_EX_TRANSPARENT = 0x20;

private const int GWL_EXSTYLE = -20;

[DllImport("user32", EntryPoint = "SetWindowLong")]
private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);

[DllImport("user32", EntryPoint = "GetWindowLong")]
private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);

在Window初始化时,通过调用Windows APISetWindowLong设置窗口属性可以被穿透

<Window x:Class="MouseTransparentWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MouseTransparentWindow"
        mc:Ignorable="d"
        WindowStyle="None" ResizeMode="CanMinimize" AllowsTransparency="True"
        Title="MainWindow" Height="450" Width="800" SourceInitialized="Window_SourceInitialized">

在Xaml代码中还修改Window的xaml标签的属性,增加允许穿透和资源初始化事件处理函数

演示效果#

image
鼠标无法穿透

image

SetWindowLong接受的GWL_EXSTYLE属性

Constant valueDescription
WS_EX_ACCEPTFILES
0x00000010L
The window accepts drag-drop files.
WS_EX_APPWINDOW
0x00040000L
Forces a top-level window onto the taskbar when the window is visible.
WS_EX_CLIENTEDGE
0x00000200L
The window has a border with a sunken edge.
WS_EX_COMPOSITED
0x02000000L
Paints all descendants of a window in bottom-to-top painting order using double-buffering. Bottom-to-top painting order allows a descendent window to have translucency (alpha) and transparency (color-key) effects, but only if the descendent window also has the WS_EX_TRANSPARENT bit set. Double-buffering allows the window and its descendents to be painted without flicker. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
Windows 2000: This style is not supported.
WS_EX_CONTEXTHELP
0x00000400L
The title bar of the window includes a question mark. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
WS_EX_CONTROLPARENT
0x00010000L
The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
WS_EX_DLGMODALFRAME
0x00000001L
The window has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
WS_EX_LAYERED
0x00080000
The window is a layered window. This style cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
Windows 8: The WS_EX_LAYERED style is supported for top-level windows and child windows. Previous Windows versions support WS_EX_LAYERED only for top-level windows.
WS_EX_LAYOUTRTL
0x00400000L
If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the horizontal origin of the window is on the right edge. Increasing horizontal values advance to the left.
WS_EX_LEFT
0x00000000L
The window has generic left-aligned properties. This is the default.
WS_EX_LEFTSCROLLBAR
0x00004000L
If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
WS_EX_LTRREADING
0x00000000L
The window text is displayed using left-to-right reading-order properties. This is the default.
WS_EX_MDICHILD
0x00000040L
The window is a MDI child window.
WS_EX_NOACTIVATE
0x08000000L
A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
The window should not be activated through programmatic access or via keyboard navigation by accessible technology, such as Narrator.
To activate the window, use the SetActiveWindow or SetForegroundWindow function.
The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
WS_EX_NOINHERITLAYOUT
0x00100000L
The window does not pass its window layout to its child windows.
WS_EX_NOPARENTNOTIFY
0x00000004L
The child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
WS_EX_NOREDIRECTIONBITMAP
0x00200000L
The window does not render to a redirection surface. This is for windows that do not have visible content or that use mechanisms other than surfaces to provide their visual.
WS_EX_OVERLAPPEDWINDOW
(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
The window is an overlapped window.
WS_EX_PALETTEWINDOW
(WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
The window is palette window, which is a modeless dialog box that presents an array of commands.
WS_EX_RIGHT
0x00001000L
The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
WS_EX_RIGHTSCROLLBAR
0x00000000L
The vertical scroll bar (if present) is to the right of the client area. This is the default.
WS_EX_RTLREADING
0x00002000L
If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
WS_EX_STATICEDGE
0x00020000L
The window has a three-dimensional border style intended to be used for items that do not accept user input.
WS_EX_TOOLWINDOW
0x00000080L
The window is intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
WS_EX_TOPMOST
0x00000008L
The window should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
WS_EX_TRANSPARENT
0x00000020L
The window should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
To achieve transparency without these restrictions, use the SetWindowRgn function.
WS_EX_WINDOWEDGE
0x00000100L
The window has a border with a raised edge.
WS_EX_TRANSPARENT
0x00000020L
The window should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
To achieve transparency without these restrictions, use the SetWindowRgn function.
----- -----

参考链接#

https://blog.walterlv.com/post/wpf-transparent-window-without-allows-transparency.html

https://www.cnblogs.com/dino623/p/problems_of_WindowChrome.html#idx_7

https://www.yuantk.com/weblog/a9ca4f90-56fc-4c8f-bc93-15d63fda4f57.html

https://blog.51cto.com/u_5496753/5263789

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlonga

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowlonga

https://learn.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles

https://learn.microsoft.com/en-us/dotnet/api/system.windows.shell.windowchrome?view=windowsdesktop-7.0

作者:Mr.Chip

出处:https://www.cnblogs.com/mrchip/p/18278976

版权:本作品采用「知识共享署名 4.0 国际许可协议」许可协议进行许可。

标签:style,Simple,window,WS,EX,窗体,WPF
From: https://www.cnblogs.com/sexintercourse/p/18312008

相关文章

  • WPF The calling thread cannot access this object because a different thread owns
      publicintImgIdx{get{returnimgIdx;}set{if(value!=imgIdx){imgIdx=value;if(imgIdx<0){imgIdx=imgsCount-1;......
  • WPF ListBox's ItemsSource depend on another's ListBoxItem and fully implemented
    //xaml<Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><ListBoxGrid.Column="0"ItemsSource=&......
  • WPF/C#:实现导航功能
    前言在WPF中使用导航功能可以使用Frame控件,这是比较基础的一种方法。前几天分享了wpfui中NavigationView的基本用法,但是如果真正在项目中使用起来,基础的用法是无法满足的。今天通过wpfui中的mvvm例子来说明在wpfui中如何通过依赖注入与MVVM模式使用导航功能。实践起来,我个人觉得......
  • Wpf和Winform使用devpress控件库导出Excel并调整报表样式
    Wpf和Winform使用devpress控件库导出Excel并调整报表样式背景客户需求经常需要出各种报表,部分客户对报表的样式有要求。包括颜色、字体、分页等等。代码使用Datagridview导出excel调整样式DevExpress.XtraGrid.Views.Grid.GridViewgdv#regionGridView属性设置//行号所......
  • c#中的From窗体
    WindowsForms(简称WinForms)是.NETFramework中用于构建Windows桌面应用程序的一个组件。Form类是WinForms中最基本的窗口类型,提供了一个容器,可以容纳控件(如按钮、文本框、标签等)。以下是Form的一些关键特性和用途:创建窗口:Form是创建应用程序窗口的基础。布局管理:可......
  • 关于WPF私有属性默认值,导致绑定异常问题
    报错信息:System.Windows.Markup.XamlParseException:““设置属性“System.Windows.FrameworkElement.Style”时引发了异常。”,行号为“292”,行位置为“68”。”InvalidOperationException:“[Unknown]”属性未指向路径“Fill.(0)[1].(1)”中的DependencyObject。 为排查这......
  • WPF 透明窗口可以调整尺寸(通过拖拽窗口边缘)
    通过这篇文章,我们可以实现:让WPF的透明窗口可以通过拖拽窗口的边缘,自由的调整尺寸。我们可以通过拖拽窗口的上方,来移动窗口。我们可以禁止窗口拖到屏幕边缘时自动最大化。还可以等比例的改变窗口的大小。还可以等比例的改变窗口中控件的大小参考文章AllowsTransp......
  • DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • MarkText A simple and elegant markdown editor, available for Linux, macOS and Wi
    1、这个工具挺不错的,先上一张图,来自github页面截图:2、这个工具是开源的项目,开源地址:https://github.com/marktext官网地址:www.marktext.cc/三个平台都有:可以直接点上面的按钮,找到自己所用电脑的平台,就可以下载。也可以转到Githubreleasepage下载。3、安装:点击【安......
  • WPF read data from mysql and display via ADO.NET
    //xaml<Windowx:Class="WpfApp216.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......