当前位置:  开发笔记 > 编程语言 > 正文

如何在WPF中处理WndProc消息?

如何解决《如何在WPF中处理WndProc消息?》经验,为你挑选了3个好方法。

寻找WPF陡峭的学习曲线.

在好的Windows窗体中,我只是覆盖WndProc,并在它们进入时开始处理消息.

有人能告诉我如何在WPF中实现同样的事情吗?



1> Robert MacLe..:

您可以通过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;
        }
    }
}

完全取自优秀博客文章:在Steve Rands的WPF应用程序中使用自定义WndProc


@ Mo0gles - 仔细想想你的问题,你会得到答案.

2> Noldorin..:

实际上,据我所知,这样的事情确实可以在WPF中使用HwndSourceHwndSourceHook.请参阅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;
}

现在,我不太清楚你为什么要在WPF应用程序中处理Windows Messaging消息(除非它是使用另一个WinForms应用程序的最明显的互操作形式).在WPF和WinForms中,API的设计思想和性质是非常不同的,所以我建议你更熟悉WPF,以确切了解为什么没有WndProc的等价物.


好吧,USB Device(dis)连接事件似乎正在通过这个消息循环,所以知道如何从WPF连接并不是一件坏事
@Noldorin:你能不能提供一些参考资料(文章/书籍),可以帮助我理解"设计思想和API的性质在WPF中与WinForms非常不同,...为什么没有WndProc的等价物"?
事实上,许多(大多数?)WPF应用程序都在标准桌面Windows上运行.WPF架构选择不公开Win32的所有底层功能是故意微软的,但仍然讨厌处理.我正在构建一个仅针对桌面Windows的WPF应用程序,但是与@flq提到的USB设备集成,接收设备通知的唯一方法是访问消息循环.有时打破抽象是不可避免的.
例如,“ WM_MOUSEWHEEL”,可靠地捕获那些消息的唯一方法是在WPF窗口中添加“ WndProc”。这对我有用,而官方的“ MouseWheelEventHandler”根本无法按预期工作。我无法正确地排列正确的WPF速球,无法通过`MouseWheelEventHandler`获得可靠的行为,因此需要直接访问`WndProc`。

3> softwerx..:
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;
}

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有