h3110w0r1d 2019-07-08 00:07 采纳率: 75%
浏览 672
已采纳

WPF 实现鼠标穿透后如何取消穿透

小白一枚。。最近在做一个音乐播放器,做了个桌面歌词,需要鼠标穿透,通过网上找的代码已经实现,但是在不重新绘制窗口的情况下如何取消穿透??下面是代码

在窗口创建完时执行下面这个代码实现穿透

SourceInitialized += delegate
{
    IntPtr hwnd = new WindowInteropHelper(this).Handle;
    uint extendedStyle = GetWindowLong(hwnd, GwlExstyle);
    SetWindowLong(hwnd, GwlExstyle, extendedStyle | WsExTransparent);
};

private const int WsExTransparent = 0x20;
private const int GwlExstyle = (-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);

怎么取消穿透呢

  • 写回答

1条回答 默认 最新

  • h3110w0r1d 2019-07-08 12:24
    关注

    突然看到代码中的dwNewLong(难道还有OldLong?)结合查的资料,我这个小白终于明白了。这个鼠标穿透功能是个拓展样式,SetWindowLong函数是设置窗口样式的。
    上面问题中的代码搞复杂了,这两行代码就足够了

    IntPtr hwnd = new WindowInteropHelper(this).Handle;
    SetWindowLong(hwnd, (-20), 0x20);
    

    hwnd是获取的窗口句柄,常量-20指的是拓展风格,0x20是鼠标穿透样式

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

    在设置完穿透之后,那个拓展样式的值就变了,所以在设置之前,用GetWindowLong函数把拓展样式的值取出来( long OldLong = GetWindowLong(hwnd,(-20)); )就叫它OldLong吧...到时候把OldLong还原回去SetWindowLong(hwnd,(-20),OldLong); ,鼠标穿透样式就没了.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 MATLAB APP 制作出现问题
  • ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
  • ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)
  • ¥15 DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI[/untitled30_war_e
  • ¥15 使用deepspeed训练,发现想要训练的参数没有梯度
  • ¥15 寻找一块做为智能割草机的驱动板(标签-stm32|关键词-m3)
  • ¥15 信息管理系统的查找和排序
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),怎么用读取的电磁传感器信号表示小车所在的位置
  • ¥15 如何解决y_true和y_predict数据类型不匹配的问题(相关搜索:机器学习)
  • ¥15 PB中矩阵文本型数据的总计问题。