无感知WPF窗口透明加穿透

  1. 在窗口的XAML文件中添加以下属性:
ShowInTaskbar="False"

WindowStyle="None"
AllowsTransparency="True"
Background="Transparent"

window.IsHitTestVisible = false; // 设置为 false,允许鼠标事件穿透 true是正常不穿

这将使窗口不显示在任务栏上,并且不会出现在Alt+Tab切换列表中。

  1. 在窗口的代码中,覆盖OnSourceInitialized方法并使用Win32 API来将窗口从Alt+Tab列表中删除:
复制代码
protected override void OnSourceInitialized(EventArgs e)
{
  base.OnSourceInitialized(e);

  // Get this window's handle
  IntPtr hWnd = new WindowInteropHelper(this).Handle;

  // Get the extended window style
  int exStyle = (int)GetWindowLong(hWnd, GWL_EXSTYLE);

  // Set the WS_EX_TOOLWINDOW style
  exStyle |= WS_EX_TOOLWINDOW;
  SetWindowLong(hWnd, GWL_EXSTYLE, (IntPtr)exStyle);
}

// Win32 API declarations
private const int GWL_EXSTYLE = -20;
private const int WS_EX_TOOLWINDOW = 0x80;

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32.dll")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
复制代码

 

一、IsHitTestVisble介绍
UIElement.IsHitTestVisble属性:获取或设置一个值,该值声明此元素是否可以作为其呈现内容的某部分的命中测试结果返回。这是一个依赖属性。
IsHitTestVisble属性值默认为true
通过设置IsHitTestVisble属性值为false,可以使界面元素不响应鼠标,鼠标事件也不会被触发
通过设置IsHitTestVisble属性值为false,可以禁止所有的鼠标交互,包括控件的点击、通过鼠标点击给控件设置输入焦点等等,都是不起作用的
通过设置IsHitTestVisble属性值为false,虽然鼠标被禁止了,但是通过tab键设置焦点,再使用空格键或者Enter键触发,是正常响应的
如果一个容器设置IsHitTestVisble属性值为false,那么这个容器内所有的子控件都不响应鼠标,即时是子空间设置IsHitTestVisble为true也没用
二、IsHitTestVisble的使用
设置IsHitTestVisble=false,checkbox不再能被命中,且点击它相当于点击它下面的那一层控件,即button,如以下代码,点击checkbox1,能看到✔的有无变化,且触发checkbox1的点击事件,但是点击checkbox2时,✔无变化,且不触发checkbox2的点击事件,反而触发底下一层控件button的点击事件;但是要注意的是,如果不是使用鼠标点击,而是使用tab键切换焦点,使用空格键或enter确认点击,这时候就无区别了。

posted @   stweily  阅读(864)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示