119 votes

Comment gérer WndProc messages dans WPF?

Trouver WPF une courbe d'apprentissage abrupte.

Dans le bon vieux Windows Forms, je venais de remplacer WndProc, et de commencer à traiter les messages comme ils sont venus.

Quelqu'un peut-il me montrer un exemple de la façon de réaliser la même chose en WPF?

146voto

Robert MacLean Points 18288

Vous pouvez le faire via l' System.Windows.Interop d'espace de noms qui contient une classe nommée HwndSource.

Exemple d'utilisation de cette

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;
        }
    }
}

Complètement tirées de l'excellent blog post: l'Aide personnalisée WndProc dans des applications WPF par Steve Rands (remarque, le lien n'est plus valide)

Ce site est bas, mais maintenant vous pouvez le voir à partir de la Wayback moteur: http://web.archive.org/web/20091019124817/http://www.steverands.com/2009/03/19/custom-wndproc-wpf-apps/

68voto

Noldorin Points 67794

En fait, comme je le comprends, c'est tout à fait possible dans WPF utilisant HwndSource et HwndSourceHook. Voir ce fil sur MSDN comme un exemple. (Le code affiché fonctionne très bien - la question est à propos de quelque chose de légèrement spécialisés.)

Maintenant, je ne suis pas tout à fait sûr pourquoi vous voulez gérer les messages de la Messagerie dans une application WPF (sauf si c'est la forme la plus évidente de l'interopérabilité pour travailler avec une autre application WinForms). La conception de l'idéologie et de la nature de l'API est très différente dans WPF de WinForms, donc, je vous suggère juste de vous familiariser avec WPF plus pour voir exactement pourquoi il n'y a pas d'équivalent de WndProc.

17voto

softwerx Points 81
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;
}

-1voto

Logan Capaldo Points 22145

Il y a des façons de gérer les messages avec un WndProc en WPF (par exemple à l'aide d'un HwndSource, etc.), mais en général, ces techniques sont réservées pour l'interopérabilité avec les messages qui ne peuvent pas être directement traitées par WPF. La plupart des contrôles WPF ne sont même pas windows dans Win32 (et, par extension, Windows.Les formes) de sens, de sorte qu'ils ne ont pas WndProcs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X