带有WindowStyle = None的不可调整大小的有边界的WPF窗口

时间:2010-05-31 11:40:54

标签: c# wpf window border aero-glass

基本上,我需要一个如下图所示的窗口:http://screenshots.thex9.net/2010-05-31_2132.png

(不可调整大小,但保留玻璃边框)

我已经设法使用Windows Forms,但我需要使用WPF。为了使它在Windows窗体中工作,我使用了以下代码:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x84 /* WM_NCHITTEST */)
        {
            m.Result = (IntPtr)1;
            return;
        }
        base.WndProc(ref m);
    }

这正是我想要的,但我找不到WPF等价物。我最接近使用WPF导致Window忽略任何鼠标输入。

非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:2)

一个非常简单的解决方案是将每个窗口的最小和最大大小设置为彼此相等,并设置为窗口构造函数中的修订号。就像这样:

public MainWindow()
{
    InitializeComponent();

    this.MinWidth = this.MaxWidth = 300;
    this.MinHeight = this.MaxHeight = 300;
}
这样用户就无法改变窗口的宽度和高度。您还必须设置“WindowStyle = None”属性以获取玻璃边框。

答案 1 :(得分:1)

您需要为消息循环添加一个钩子:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var interopHelper = new WindowInteropHelper(this);
    var hwndSource = HwndSource.FromHwnd(interopHelper.Handle);
    hwndSource.AddHook(WndProcHook);
}

private IntPtr WndProcHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == 0x84 /* WM_NCHITTEST */)
    {
         handled = true;
         return (IntPtr)1;
    }
}