创建TopMost非透明的点击后可切换窗口

时间:2019-08-31 13:53:07

标签: c# wpf

我正在创建一个wpf应用程序,需要创建一个窗口,当某个变量为true或调用了函数时,您可以单击该窗口(可以选择哪个窗口)。但是,该窗口仍必须可见,并且也是TopMost。

我在互联网上查找并发现了一些具有类似问题的线程,但是这些线程要么很旧,要么对于Winforms而不是wpf。我确实尝试过它们,但是它们似乎对我没有用。

目前,我正在PluginHostView.xaml.cs中尝试此操作:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace ModOS_wpf.Views
{
    /// <summary>
    /// Interaction logic for PluginHostWindow.xaml
    /// </summary>
    public partial class PluginHostView : Window
    {
        public PluginHostView()
        {
            InitializeComponent();
            Topmost = true;
        }

        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);

        [DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
        public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);

        protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);
            int wl = GetWindowLong(new WindowInteropHelper(this).Handle, GWL.ExStyle);
            wl = wl | 0x80000 | 0x20;
            SetWindowLong(new WindowInteropHelper(this).Handle, GWL.ExStyle, wl);
            SetLayeredWindowAttributes(new WindowInteropHelper(this).Handle, 0, 128, LWA.Alpha);
        }

        public enum GWL
        {
            ExStyle = -20
        }

        public enum WS_EX
        {
            Transparent = 0x20,
            Layered = 0x80000
        }

        public enum LWA
        {
            ColorKey = 0x1,
            Alpha = 0x2
        }
    }
}

但是,这似乎根本没有改变窗口。这种方法似乎是最流行的方法,并且似乎对大多数人都有效。另外,如果可行,也不允许切换点击行为。

我希望它能起作用,但是它什么也没做。

如果您想完全改变我的做事方式,请继续

编辑: 由于目前尚不清楚期望的最终结果是什么,因此希望可以更清楚地说明这一点:

该窗口是最顶部的(在所有其他窗口的顶部,我现在已经如何执行此部分(只需在构造函数中设置TopMost = true)),就象通常那样可见,但是它不会与我的鼠标和鼠标交互所有鼠标事件都会直接通过其背后的程序。就像从来没有过(不知道该怎么做)

1 个答案:

答案 0 :(得分:0)

无论是否要单击,都尝试将窗口上的IsHitTestVisible属性设置为False或True。