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

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); ,鼠标穿透样式就没了.

    已采纳该答案
    1 打赏 评论

相关推荐 更多相似问题