WPF与Win32通信

         之前有写到通过WPF来调用Win32框架,通过继承hwndHost类,实现WPF中加载Win32框架,同时,实现WPF对Win32的消息处理。但今天被老大问到,如何在WPF下响应win32的消息。

         比如在win32中使用sendMessage()向WPF主框架MainWindow发送一个消息,WPF框架如何能够捕获到这个消息了?

         之前按照老大的思想,尝试在hwndHost的消息过程WndProc中捕获该消息。结果调试发现,该过程函数中捕获的全是该win32控件的消息。也就是说投递给WPF的消息是没有办法在这里获取到的。既然是给WPF主界面的消息,自然要到该框架界面下去解决。

         如之前文章中描述的,WPF是以数据驱动的。WPF也有消息循环,只不过是它自己在维护着消息循环,用户不会接触到。那么如何得到消息了,这时候很自然想到了HOOK。捕获WPF进程的所有消息。对消息进行过滤。

         这时候,其实该想到WPF与Win32交互的另外一个类HwndSource。既然是win32与WPF通信,那么肯定是要跟这个类脱不了关系。通过查看该类,发现该类中提供了AddHook的方法。简直是crazy呀!这么给力!

         这时候就好办了,在WPF启动时注册一个钩子,监听消息事件,添加一个消息过程处理所有的窗口消息。在win32的dll中添加一个sendMessage(hWPFWndHWND,0x1234)。然后在消息过程中接受该消息就ok了。

         程序清单如下:

public void OnLoaded(object sender, RoutedEventArgs args)
{
(PresentationSource.FromVisual(this) as System.Windows.Interop.HwndSource).AddHook(new System.Windows.Interop.HwndSourceHook(WndProc)); 
}
IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == 0x1234)
{
System.Console.WriteLine("test");
}
return hwnd;
} 
     好了,这时候我们可以在WndProc中处理所有的由Win32端传来的消息了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值