Как обработать сообщения WndProc в WPF?

В Windows Forms я просто переопределил бы WndProc, и начните обрабатывать сообщения, когда они вошли.

Кто-то может показать мне пример того, как достигнуть того же самого в WPF?

106
задан ASh 24 October 2019 в 12:16
поделиться

6 ответов

На самом деле, насколько я понимаю, что такая вещь действительно возможна в WPF использование HwndSource и HwndSourceHook. См. этот поток на MSDN как пример. (Соответствующие нормы включали ниже)

// 'this' is a Window
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(new HwndSourceHook(WndProc));

private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    //  do stuff

    return IntPtr.Zero;
}

Теперь, я не совсем уверен, почему Вы хотели бы обработать сообщения Windows Messaging в приложении WPF (если это не самая очевидная форма interop для работы с другим приложением WinForms). Идеология дизайна и природа API очень отличаются в WPF от WinForms, таким образом, я предложил бы, чтобы Вы просто ознакомились с WPF больше для наблюдения точно почему нет никакого эквивалента WndProc.

58
ответ дан heltonbiker 24 November 2019 в 03:50
поделиться

Существуют способы обработать сообщения с WndProc в WPF (например, использование HwndSource, и т.д.), но обычно те методы резервируются для interop с сообщениями, которые не могут непосредственно быть обработаны через WPF. Большинство средств управления WPF не является даже окнами в Win32 (и дополнительным Windows. Формы) смысл, таким образом, у них не будет WndProcs.

0
ответ дан Logan Capaldo 24 November 2019 в 03:50
поделиться

WPF не воздействует на wndprocs

типа WinForms, можно разместить HWndHost в соответствующем элементе WPF, тогда переопределяют wndproc Hwndhost, но AFAIK, это так близко, как Вы собираетесь добраться.

http://msdn.microsoft.com/en-us/library/ms742522.aspx

http://blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx

-4
ответ дан user72491 24 November 2019 в 03:50
поделиться

Короткий ответ - Вы, не может. WndProc работает путем передачи сообщений HWND на уровне Win32. Окна WPF не имеют никакого HWND и следовательно не могут участвовать в сообщениях WndProc. Основной цикл сообщения WPF действительно находится сверху WndProc, но он абстрагирует их далеко от базовой логики WPF.

можно использовать HWndHost и достигнуть WndProc для него. Однако это почти наверняка не, что Вы хотите сделать. В большинстве целей WPF не воздействует на HWND и WndProc. Ваше решение почти наверняка полагается на внесение изменения в WPF не в WndProc.

-11
ответ дан JaredPar 24 November 2019 в 03:50
поделиться
HwndSource src = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
src.AddHook(new HwndSourceHook(WndProc));


.......


public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{

  if(msg == THEMESSAGEIMLOOKINGFOR)
    {
      //Do something here
    }

  return IntPtr.Zero;
}
15
ответ дан 24 November 2019 в 03:50
поделиться

Вы можете сделать это через пространство имен System.Windows.Interop , которое содержит класс с именем HwndSource .

Пример использования этого

using System;
using System.Windows;
using System.Windows.Interop;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
            source.AddHook(WndProc);
        }

        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            // Handle messages...

            return IntPtr.Zero;
        }
    }
}

Полностью взят из отличного сообщения в блоге: Использование пользовательского WndProc в приложениях WPF, автор Стив Рэндс

131
ответ дан 24 November 2019 в 03:50
поделиться