博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF与Win32互操作
阅读量:6305 次
发布时间:2019-06-22

本文共 1785 字,大约阅读时间需要 5 分钟。

一、WPF如何使用HWND

        当您创建WPF Window时,WPF会创建顶级HWND,并使用HwndSource将Window及其WPF内容放入HWND中。应用程序中其余的WPF内容共享此单个HWND。不过,菜单、组合框下拉列表和其他弹出窗口例外。 这些元素创建它们自己的顶级窗口,这正是 WPF 菜单能跳出包含它的窗口 HWND 之外的原因。

二、HwndSource类

        一个HwndSource实现Win32窗口可以包含WPF内容。在窗口中的WPF内容是可安排的,可测量的,和可渲染的;是可交互式输入的。因为HwndSource是专被设计来与Win32进行交互的,这个类展示了底层的Win32的特点。您可以使用这个类执行以下操作:

  • 指定窗口样式、窗口类样式和扩展窗口样式。
  • 在窗口程序的钩子中添加处理函数。
  • 提供窗口句柄(HWND)。
  • 销毁窗口。

         HwndSource类被设计来用于处理一般的互操作,并不是被设计成一个包装管理HWND的角色。一般来说,它不提供用于管理窗口或检查属性状态的托管方法。相反,该HwndSource类可以通过Handle属性访问Win32窗口句柄(HWND),可以通过PInvoke Win32 API技术操作窗口。

1 创建
        HwndSource只能在构造时被指定。创建一个HwndSource,首先要创建一个HwndSourceParameters结构并用所需的参数填充它。这些参数包括以下内容:

  • 类、窗口和扩展的窗口样式。您必须在窗口被创建前使用PInvoke去改变样式。并非所有样式都可以在创建窗口后更改。更改窗口样式之前请参考win32文档。
  • 窗口的初始位置。
  • 窗口的初始大小,包括是否指定尺寸或以WPF内容大小的确定窗口的大小。
  • 父窗口。
  • HwndSourceHook包括窗口的处理函数链。如果在构建时指定钩子,它将接收窗口的所有消息。你可以使用AddHook后创建窗口添加一个钩子。
  • 透明度设置。

2 对象生存周期

        HwndSource是正规的公共语言运行库(CLR)对象,其生命周期是由垃圾收集器管理。因为HwndSource代表非托管资源,所以HwndSource实现IDisposable接口。如果从所有者线程调用,同步调用处理立即破坏win32窗口。如果从另一个线程调用,win32窗口将异步销毁。在互操作的代码中显式调用Dispose可能对某些互操作场景是必要的。
3 窗口处理函数
        HwndSource类实现了它自己的窗口处理函数。此窗口处理函数用于处理重要的窗口消息,如与布局、呈现和输入相关的消息。不过,您也可以在钩子上添加自己的处理函数。你可以在构造时,通过设置HwndSourceParameters.HwndSourceHook属性,在钩子中指定自己的处理函数,或者你也可以使用AddHook和RemoveHook在窗口创建之后添加和删除钩子中的处理函数。

三、HwndSource类

        该例子中在钩子中扩展处理函数。

// 在Window类中protected overried void OnSourceInitialized(EventArgs e){    base.OnSourceInitialized(e);    // 获取窗体句柄    IntPtr hwnd = new WindowInteropHelper(this).Handle;    // 获取HwndSource对象    HwndSource hwndSource = HwndSource.FromHwnd(hwnd);    // 向钩子中添加处理程序    if(hwndSource != null)        hwndSource.AddHook(WndProc);}private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wideParam, IntPtr longParam, ref bool handled){    swicth(msg)    {        // 对特定消息进行处理    }    return IntPtr.Zero;}

转载于:https://www.cnblogs.com/SyMind/p/8370519.html

你可能感兴趣的文章
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
ERP环境检测工具设计与实现 Environment Detection
查看>>
不要在构造中做太多事情,不然有时候会出现有意思的代码~
查看>>
IIS 发布网站遇到的问题
查看>>
NuGet学习笔记(2)——使用图形化界面打包自己的类库
查看>>
xcode中没有autoSizing的设置
查看>>
字符编码
查看>>
企业应用:应用层查询接口设计
查看>>
浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
查看>>
nfd指令的详细说明
查看>>
安装VisualSvn Server时遇到的问题
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
人脸识别 开放书籍 下载地址
查看>>
Notepad++配置Python开发环境
查看>>
用户组概念 和 挂载 概念
查看>>
如何快速获取ADO连接字符串
查看>>
AspNetPager控件的最基本用法
查看>>
sessionKey
查看>>