1、WPF如何使用HWND异步
当您建立WPF Window时,WPF会建立顶级HWND,并使用HwndSource将Window及其WPF内容放入HWND中。应用程序中其他的WPF内容共享此单个HWND。不过,菜单、组合框下拉列表和其余弹出窗口例外。 这些元素建立它们本身的顶级窗口,这正是 WPF 菜单能跳出包含它的窗口 HWND 以外的缘由。ide
2、HwndSource类函数
一个HwndSource实现Win32窗口能够包含WPF内容。在窗口中的WPF内容是可安排的,可测量的,和可渲染的;是可交互式输入的。由于HwndSource是专被设计来与Win32进行交互的,这个类展现了底层的Win32的特色。您可使用这个类执行如下操做:布局
HwndSource类被设计来用于处理通常的互操做,并非被设计成一个包装管理HWND的角色。通常来讲,它不提供用于管理窗口或检查属性状态的托管方法。相反,该HwndSource类能够经过Handle属性访问Win32窗口句柄(HWND),能够经过PInvoke Win32 API技术操做窗口。
1 建立
HwndSource只能在构造时被指定。建立一个HwndSource,首先要建立一个HwndSourceParameters结构并用所需的参数填充它。这些参数包括如下内容:this
2 对象生存周期
HwndSource是正规的公共语言运行库(CLR)对象,其生命周期是由垃圾收集器管理。由于HwndSource表明非托管资源,因此HwndSource实现IDisposable接口。若是从全部者线程调用,同步调用处理当即破坏win32窗口。若是从另外一个线程调用,win32窗口将异步销毁。在互操做的代码中显式调用Dispose可能对某些互操做场景是必要的。
3 窗口处理函数
HwndSource类实现了它本身的窗口处理函数。此窗口处理函数用于处理重要的窗口消息,如与布局、呈现和输入相关的消息。不过,您也能够在钩子上添加本身的处理函数。你能够在构造时,经过设置HwndSourceParameters.HwndSourceHook属性,在钩子中指定本身的处理函数,或者你也可使用AddHook和RemoveHook在窗口建立以后添加和删除钩子中的处理函数。spa
3、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; }