Окно WPF и WndProc

Нижеприведенный фрагмент кода взят из «WPF 4 Unleashed». он демонстрирует, как в Windows 7 можно создать эффект Aero Glass с помощью WIN32 API. В этой демонстрации процедура событий WndProc используется по отношению к экземпляру Window. Я заметил, что в этой подпрограмме нет вызова оконной процедуры по умолчанию, как будто нет других событий, которые должны обрабатываться этим окном WPF.

Что побудило меня опубликовать этот вопрос, который является более общим вопросом о WPF, так это то, обрабатываются ли события, которые обычно обрабатываются окном WPF (и я уверен, что их много), обрабатываются какой-либо другой процедурой. Другими словами, отличается ли окно WPF от WinForms --- получает ли оно сообщения от операционной системы (щелчки мыши, движения мыши) другими способами?

 [StructLayout(LayoutKind.Sequential)]
    public struct MARGINS
    {
        public MARGINS(Thickness t)
        {
            Left = (int)t.Left;
            Right = (int)t.Right;
            Top = (int)t.Top;
            Bottom = (int)t.Bottom;
        }
        public int Left;
        public int Right;
        public int Top;
        public int Bottom;
    }

    public class GlassHelper
    {
            [DllImport("dwmapi.dll", PreserveSig=false)]
            static extern void DwmExtendFrameIntoClientArea( IntPtr hWnd, ref MARGINS pMarInset);
            [DllImport("dwmapi.dll", PreserveSig=false)]
            static extern bool DwmIsCompositionEnabled();

            public static bool ExtendGlassFrame(Window window, Thickness margin)
            {
                   if (!DwmIsCompositionEnabled())
                        return false;
                   IntPtr hwnd = new WindowInteropHelper(window).Handle;
                   if (hwnd == IntPtr.Zero)
                       throw new InvalidOperationException(
                   "The Window must be shown before extending glass.");
                    // Set the background to transparent from both the WPF and Win32 perspectives
                   window.Background = Brushes.Transparent;
                   HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor =Colors.Transparent;
                   MARGINS margins = new MARGINS(margin);
                   DwmExtendFrameIntoClientArea(hwnd, ref margins);
                   return true;
            }
    }

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        // This can’t be done any earlier than the SourceInitialized event:
        GlassHelper.ExtendGlassFrame(this, new Thickness(-1));
        // Attach a window procedure in order to detect later enabling of desktop
        // composition
        IntPtr hwnd = new WindowInteropHelper(this).Handle;
        HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == WM_DWMCOMPOSITIONCHANGED)
        {
            // Reenable glass:
            GlassHelper.ExtendGlassFrame(this, new Thickness(-1));
            handled = true;
        }
        return IntPtr.Zero;
    }

    private const int WM_DWMCOMPOSITIONCHANGED = 0x031E;

person WITL    schedule 17.04.2014    source источник


Ответы (2)


Окно WPF такое же, как окно WinForms с точки зрения использования WndProc. У меня не было проблем с размещением фрагмента кода в моем приложении WPF. На самом деле, я не нашел никакого кода, связанного с WndProc, который до сих пор не работал в WPF.

person mikiqex    schedule 18.04.2014

Окна WPF аналогичны окнам Windows Forms и классическим окнам Windows в том, что они все имеют Цикл сообщений для получения сообщений и WindowProc (фактическое имя может быть любым, которое программист решит сделать) для их обработки. Все окна можно разделить на подклассы (как в Об оконных процедурах), по крайней мере, на уровне ниже WPF. Я не знаю, являются ли WndProc для Windows Forms или WPF подклассом соответствующих окон, но они могут быть.

person user34660    schedule 12.02.2018