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

WPF与Win32互操作的更多相关文章

  1. WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...

  2. WPF实现毛玻璃效果

    1和2需要Microsoft.WindowsAPICodePack.Shell.dll 和引用using System.Windows.Interop,并只能在有DwmApi.dll 版本的Windo ...

  3. WPF 4.5 is here : check out the new features !

    So what's New in WPF Version 4.5 Developer Preview ? Here is a list of the new features and their re ...

  4. 【转】WPF的知识

    [-] 闲话WPF之二XAML概述 闲话WPF之五XAML中的类型转换 闲话WPF之十六WPF中的资源 2 闲话WPF之十九WPF中的传递事件 1 闲话WPF之二十WPF中的传递事件 2 闲话WPF之 ...

  5. WPF中,如何将Vista Aero效果扩展到整个窗口

    原文:WPF中,如何将Vista Aero效果扩展到整个窗口   WPF中,如何将Vista Aero效果扩展到整个窗口                                         ...

  6. VSTO之WPF和Winform弹窗

    写插件弹窗是肯定要有的,有弹窗才有展示功能的页面啊! 记录一下前段时间遇到的一些弹窗方面的坑,一个个踩过来也是收获颇丰啊! WPF弹窗 最简单的弹窗方式,new一个窗体,然后调用Show方法. Win ...

  7. WPF 半透明 模糊效果 Aero效果(1)

    先看看效果图 目前网上找到了2种实现方式,一种是 .NET Framework4.5及以后有自带的 WindowChrome 效果,一种是 WindowsAPI  dwmapi.dll  ,但这两种在 ...

  8. WPF 通过进程实现异常隔离的客户端

    当 WPF 客户端需要实现插件系统的时候,一般可以基于容器或者进程来实现.如果需要对外部插件实现异常隔离,那么只能使用子进程来加载插件,这样插件如果抛出异常,也不会影响到主进程.WPF 元素无法跨进程 ...

  9. WinUI 3 踩坑记:前言

    WinUI 3 (Windows App SDK 于 2021 年 11 月发布了第一个正式版 v1.0.0 [1],最新版本是 v1.1.5 [2].我的基于 WinUI 3 的个人项目 寻空 从年 ...

随机推荐

  1. requireJS教程

    目录[-] 使用 RequireJS 优化 Web 应用前端 AMD 简介 传统 JavaScript 代码的问题 AMD 的引入 清单 1. AMD 规范 RequireJS 简介 实战 Requi ...

  2. CSS3 转换2D transform

    Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.下面我们一 ...

  3. C# Excel数据导入到数据库

    http://www.jb51.net/article/44743.htm 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码: 复制代码 代码如下: using System ...

  4. openldap 编译报错MozNSS not found

    openldap 编译报错 1)报错 MozNSS not found - please specify the location to the NSPR and NSS header files i ...

  5. TP框架如何开启log日志

    1. 日志的处理工作是由系统自动进行的,在开启日志记录的情况下,会记录下允许的日志级别的所有日志信息. 其中,为了性能考虑,SQL日志级别必须在调试模式开启下有效,否则就不会记录. 系统的日志记录由核 ...

  6. ts中interface与class的区别

    interface -- 接口只声明成员方法,不做实现. class -- 类声明并实现方法. 那么接口有什么用呢?设想如下需求: 要实现一个print函数,它将传入的对象打印出来.在实际实现上,它将 ...

  7. icon图标和文字整体居中在button按钮

    icon图标和文字整体居中在button按钮 icon图标和文字整体居中 一般我们常做的button按钮是文字居中 现在这个需要icon图标和文字一起居中在背景色 <a href="# ...

  8. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...

  9. centos6.5 redis搭建

    redis安装1.wget http://download.redis.io/redis-stable.tar.gz2.tar -zxvf redis-stable.tar.gz3.cd redis- ...

  10. python3之模块

    1.python3模块 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用 python 标准库的方法. 模块让你能够有逻辑地 ...