<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>林德熙</title>
    <description>微软最具价值专家和 .NET 基金会成员</description>
    <link>https://blog.lindexi.com/</link>
    <atom:link href="https://blog.lindexi.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sat, 29 Aug 2026 07:06:43 +0000</pubDate>
    <lastBuildDate>Sat, 29 Aug 2026 07:06:43 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>博客导航</title>
        <description>&lt;p&gt;本文记录我写的博客和我收集的博客&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2022/6/28 19:49:23 --&gt;
&lt;!-- 置顶 --&gt;

&lt;div id=&quot;toc&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;技术交流群&quot;&gt;技术交流群&lt;/h2&gt;

&lt;p&gt;这是我创建技术交流群，都不是开发新手友好，都是某项技术领域的群&lt;/p&gt;

&lt;h3 id=&quot;dotnet-职业技术学院&quot;&gt;dotnet 职业技术学院&lt;/h3&gt;

&lt;p&gt;Skype 群： &lt;a href=&quot;https://join.skype.com/TiYcws3RHXOO&quot;&gt;https://join.skype.com/TiYcws3RHXOO&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;电报群： &lt;a href=&quot;https://t.me/dotnet_campus&quot;&gt;https://t.me/dotnet_campus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这是公开可加入的群&lt;/p&gt;

&lt;h3 id=&quot;cpf-xamarin-maui-uno-国产-uos-开发&quot;&gt;CPF xamarin MAUI UNO 国产 UOS 开发&lt;/h3&gt;

&lt;p&gt;群: 810052083&lt;/p&gt;

&lt;p&gt;交流国产系统开发相关，以及 MAUI 和 Avalonia 和 UNO 和 xamarin 和 Mono 在这些神奇的系统上运行的问题，以及这些神奇的系统的系统环境问题&lt;/p&gt;

&lt;p&gt;也可以聊聊 GTK 和 X11 系列的问题&lt;/p&gt;

&lt;h3 id=&quot;microsoftmauigraphics&quot;&gt;Microsoft.Maui.Graphics&lt;/h3&gt;

&lt;p&gt;群：623209342&lt;/p&gt;

&lt;p&gt;交流使用 MAUI 的 Graphics 进行渲染的技术，包括自绘平台以及图形绘制相关技术&lt;/p&gt;

&lt;h3 id=&quot;wpf-sharpdx-vortice&quot;&gt;WPF SharpDx Vortice&lt;/h3&gt;

&lt;p&gt;群：622808968&lt;/p&gt;

&lt;p&gt;交流使用 SharpDx 或 Vortice 调用 DirectX 底层的技术群，包括 D2D 和图形绘制相关技术&lt;/p&gt;

&lt;h3 id=&quot;dotnet-uno&quot;&gt;dotnet UNO&lt;/h3&gt;

&lt;p&gt;群：724181515&lt;/p&gt;

&lt;p&gt;专门用来交流 &lt;a href=&quot;https://github.com/unoplatform/uno&quot;&gt;UnoPlatform/Uno&lt;/a&gt; 开发技术的群&lt;/p&gt;

&lt;h3 id=&quot;skiasharp&quot;&gt;SkiaSharp&lt;/h3&gt;

&lt;p&gt;群: 788018852&lt;/p&gt;

&lt;p&gt;交流 SkiaSharp 相关技术&lt;/p&gt;

&lt;h3 id=&quot;opentk&quot;&gt;OpenTK&lt;/h3&gt;

&lt;p&gt;群：789025426&lt;/p&gt;

&lt;p&gt;交流使用 OpenTK 调用渲染层的群&lt;/p&gt;

&lt;h3 id=&quot;openxml-office-开发&quot;&gt;OpenXML Office 开发&lt;/h3&gt;

&lt;p&gt;群：688921958&lt;/p&gt;

&lt;p&gt;交流 Office 开发和 OpenXML 相关技术的群，此群非新手群&lt;/p&gt;

&lt;h3 id=&quot;windows-定制&quot;&gt;Windows 定制&lt;/h3&gt;

&lt;p&gt;群：729474199&lt;/p&gt;

&lt;p&gt;聊 OEM 定制开发，以及各种奇奇怪怪的 Win32 API 的使用方法。非 Windows 使用方法群，非编程新手友好群&lt;/p&gt;

&lt;p&gt;也可以吐槽微软的系统的各种问题&lt;/p&gt;

&lt;h3 id=&quot;roslyn&quot;&gt;Roslyn&lt;/h3&gt;

&lt;p&gt;群：629370288&lt;/p&gt;

&lt;p&gt;聊聊 Roslyn 和编译定制，预编译，定制构建过程的群&lt;/p&gt;

&lt;h3 id=&quot;semantickernel&quot;&gt;SemanticKernel&lt;/h3&gt;

&lt;p&gt;群: 623349574&lt;/p&gt;

&lt;p&gt;聊聊 AI 应用&lt;/p&gt;

&lt;h3 id=&quot;uwp-wpf-开发交流群&quot;&gt;UWP WPF 开发交流群&lt;/h3&gt;

&lt;p&gt;群：XXXXXXXXXX&lt;/p&gt;

&lt;p&gt;本群非新手群，仅提供邀请加入。纯技术群&lt;/p&gt;

&lt;h2 id=&quot;其他博客发布平台&quot;&gt;其他博客发布平台&lt;/h2&gt;

&lt;p&gt;以下平台都是我的博客发布平台&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;主站 ：&lt;a href=&quot;https://blog.lindexi.com/&quot;&gt;https://blog.lindexi.com/&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;使用 GitHub Page 搭建的博客&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;博客园： &lt;a href=&quot;https://www.cnblogs.com/lindexi&quot;&gt;https://www.cnblogs.com/lindexi&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;作为主站的备份&lt;/li&gt;
      &lt;li&gt;靠自动同步更新&lt;/li&gt;
      &lt;li&gt;图片有些是 http 的，可能会看不到图片&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;皮卡帮忙搭建的博客（国内）：&lt;a href=&quot;https://lindexi-blog.jgrass.cc/&quot;&gt;https://lindexi-blog.jgrass.cc/&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;作为主站的同步&lt;/li&gt;
      &lt;li&gt;速度嘎嘎快&lt;/li&gt;
      &lt;li&gt;不定时同步&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;皮卡帮忙搭建的博客（国外）：&lt;a href=&quot;https://lindexi-blog.vercel.app/&quot;&gt;https://lindexi-blog.vercel.app/&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;作为主站的同步&lt;/li&gt;
      &lt;li&gt;不定时同步&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;GitBook ： &lt;a href=&quot;https://uwp.gitbook.io/&quot;&gt;https://uwp.gitbook.io/&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;作为主站的备份&lt;/li&gt;
      &lt;li&gt;靠自动同步更新&lt;/li&gt;
      &lt;li&gt;国内访问速度较差&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;腾讯云：&lt;a href=&quot;https://cloud.tencent.com/developer/column/71201&quot;&gt;https://cloud.tencent.com/developer/column/71201&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;靠自动同步更新&lt;/li&gt;
      &lt;li&gt;同步过来的图片自动转 https 链接，有些图片会丢&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;CSDN ：&lt;a href=&quot;https://blog.csdn.net/lindexi_gd/&quot;&gt;https://blog.csdn.net/lindexi_gd/&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;不推荐，大量博客都需要 vip 才能看，博客也很久同步不上去了&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;51CTO：&lt;a href=&quot;https://blog.51cto.com/u_11283245&quot;&gt;https://blog.51cto.com/u_11283245&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;靠自动同步更新&lt;/li&gt;
      &lt;li&gt;作为备份的备份&lt;/li&gt;
      &lt;li&gt;基本没维护&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;medium：&lt;a href=&quot;https://medium.com/@lindexi_gd&quot;&gt;https://medium.com/@lindexi_gd&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;基本只发英文博客&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;!-- 可在 CayqeargugarYulijohem 更新博客导航到博客园 --&gt;

&lt;h2 id=&quot;语言&quot;&gt;语言&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E9%AB%98%E7%BA%A7%E9%9D%A2%E8%AF%95%E9%A2%98.html&quot;&gt;C# 高级面试题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%BE%88%E5%B0%91%E4%BA%BA%E7%9F%A5%E9%81%93%E7%9A%84%E7%A7%91%E6%8A%80.html&quot;&gt;C# 很少人知道的科技&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%B8%83%E5%B0%94%E5%8F%AF%E4%BB%A5%E6%98%AF-true-%E6%88%96-false-%E5%A4%96%E7%9A%84%E5%80%BC.html&quot;&gt;dotnet C# 布尔可以是 true 或 false 外的值&lt;/a&gt;
&lt;!-- [dotnet C# 布尔可以是 true 或 false 外的值 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18930537 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%9F%BA%E7%A1%80-%E4%B8%BA%E4%BB%80%E4%B9%88-GetHashCode-%E6%8E%A8%E8%8D%90%E5%8F%AA%E5%8F%96%E5%8F%AA%E8%AF%BB%E5%B1%9E%E6%80%A7%E6%88%96%E5%AD%97%E6%AE%B5%E5%81%9A%E5%93%88%E5%B8%8C%E5%80%BC.html&quot;&gt;dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%88%86%E4%BA%AB%E5%9F%BA%E7%A1%80-for-%E5%BE%AA%E7%8E%AF%E7%9A%84%E5%86%99%E6%B3%95.html&quot;&gt;dotnet C# 分享基础 for 循环的写法&lt;/a&gt;
&lt;!-- [dotnet C# 分享基础 for 循环的写法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18351898 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A6%82%E4%BD%95%E5%9C%A8%E9%A1%B6%E7%BA%A7%E8%AF%AD%E5%8F%A5%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7.html&quot;&gt;dotnet C# 如何在顶级语句定义属性&lt;/a&gt;
&lt;!-- [dotnet C# 如何在顶级语句定义属性 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18387839 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E4%BD%BF%E7%94%A8-using-%E5%85%B3%E9%94%AE%E5%AD%97%E9%97%B4%E6%8E%A5%E5%AE%9E%E7%8E%B0%E5%8F%AA%E8%AF%BB%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;C# 使用 using 关键字间接实现只读局部变量的方法&lt;/a&gt;
&lt;!-- [C# 使用 using 关键字间接实现只读局部变量的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19146902 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E9%87%8C%E9%9D%A2%E5%BE%88%E5%B0%91%E4%BA%BA%E7%9F%A5%E9%81%93%E4%BD%86%E5%BE%88%E5%A5%BD%E7%94%A8%E7%9A%84-Tuple-%E8%BD%AC%E6%8D%A2.html&quot;&gt;C# 里面很少人知道但很好用的 Tuple 转换&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-await-%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95.html&quot;&gt;C＃ await 高级用法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%A6%96%E5%AD%97%E7%AC%A6%E5%A4%A7%E5%86%99.html&quot;&gt;C＃ 字符串首字符大写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A4%9A%E6%AC%A1%E5%AF%B9%E4%B8%80%E4%B8%AA%E5%AF%B9%E8%B1%A1%E8%B0%83%E7%94%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88.html&quot;&gt;dotnet C# 多次对一个对象调用构造函数会发生什么&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%8F%AA%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E4%B8%8D%E8%B0%83%E7%94%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet C# 只创建对象不调用构造函数方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%B8%BB%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%B8%A6%E6%9D%A5%E7%9A%84%E8%99%9A%E5%B1%9E%E6%80%A7%E4%BC%98%E5%8A%BF.html&quot;&gt;dotnet C# 主构造函数带来的虚属性优势&lt;/a&gt;
&lt;!-- [dotnet C# 主构造函数带来的虚属性优势 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19300095 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A6%82%E6%9E%9C%E5%9C%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8-%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0%E6%98%AF%E5%90%A6%E4%BC%9A%E6%89%A7%E8%A1%8C.html&quot;&gt;dotnet C# 如果在构造函数抛出异常 析构函数是否会执行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%9C%A8-finally-%E6%8A%9B%E5%BC%82%E5%B8%B8%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88.html&quot;&gt;dotnet C# 在 finally 抛异常会发生什么&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A6%82%E6%9E%9C%E5%9C%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8-%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E6%8B%BF%E5%88%B0%E5%AF%B9%E8%B1%A1%E8%B5%8B%E5%80%BC%E7%9A%84%E5%8F%98%E9%87%8F.html&quot;&gt;dotnet C# 如果在构造函数抛出异常 是否可以拿到对象赋值的变量&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%BA%E4%BD%95-C-%E7%9A%84%E6%8C%87%E9%92%88%E4%B8%8D%E6%98%AF%E5%8F%AF%E7%A9%BA%E7%B1%BB%E5%9E%8B.html&quot;&gt;为何 C# 的指针不是可空类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E5%9C%A8%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84-double-%E7%9A%84-NAN-%E5%92%8C%E6%AD%A3%E8%B4%9F%E6%97%A0%E7%A9%B7%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%98%AF%E5%A6%82%E4%BD%95%E5%AD%98.html&quot;&gt;C# dotnet 在内存中的 double 的 NAN 和正负无穷二进制是如何存&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E8%AD%A6%E6%83%95%E7%BB%93%E6%9E%84%E4%BD%93%E5%8A%A0%E7%AD%89%E4%BA%8B%E4%BB%B6.html&quot;&gt;dotnet C# 警惕结构体加等事件&lt;/a&gt;
&lt;!-- [dotnet C# 警惕结构体加等事件 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19240284 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-await-%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95.html&quot;&gt;C＃ await 高级用法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%B1%80%E9%83%A8%E5%87%BD%E6%95%B0%E4%B8%8E%E4%BA%8B%E4%BB%B6.html&quot;&gt;C＃ 局部函数与事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-6.0-%E5%AD%97%E7%AC%A6%E4%B8%B2-String-Interpolation.html&quot;&gt;C＃ 6.0 字符串 String Interpolation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-7.0.html&quot;&gt;C# 7.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-7.0-%E4%BD%BF%E7%94%A8%E4%B8%8B%E5%88%92%E7%BA%BF%E5%BF%BD%E7%95%A5%E4%BD%BF%E7%94%A8%E7%9A%84%E5%8F%98%E9%87%8F.html&quot;&gt;C# 7.0 使用下划线忽略使用的变量&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D-C-8.0-%E8%AF%AD%E6%B3%95%E7%BC%96%E8%AF%91%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 修复 C# 8.0 语法编译失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%9C%A8-8.0-%E5%AF%B9%E6%AF%94-string-%E5%92%8C-string_-%E7%9A%84%E7%B1%BB%E5%9E%8B.html&quot;&gt;C# 在 8.0 对比 string 和 string? 的类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-const-%E5%92%8C-readonly-%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB.html&quot;&gt;C# const 和 readonly 有什么区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%BC%BA%E8%BD%AC%E7%A9%BA%E4%BC%9A%E4%B8%8D%E4%BC%9A%E5%87%BA%E7%8E%B0%E5%BC%82%E5%B8%B8.html&quot;&gt;C# 强转空会不会出现异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E8%AD%A6%E6%83%95%E5%8F%AF%E7%A9%BA%E7%BB%93%E6%9E%84%E4%BD%93%E7%9A%84%E6%96%B9%E6%B3%95%E5%86%85%E9%83%A8%E8%B5%8B%E5%80%BC%E6%97%A0%E6%95%88.html&quot;&gt;dotnet C# 警惕可空结构体的方法内部赋值无效&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-using-%E5%85%B3%E9%94%AE%E5%AD%97%E9%87%8A%E6%94%BE-IDisposable-%E7%9A%84%E7%BB%93%E6%9E%84%E4%BD%93%E6%98%AF%E5%90%A6%E4%BC%9A%E8%A3%85%E7%AE%B1.html&quot;&gt;dotnet C# 使用 using 关键字释放 IDisposable 的结构体是否会装箱&lt;/a&gt;
&lt;!-- [dotnet C# 使用 using 关键字释放 IDisposable 的结构体是否会装箱 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18253603 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E7%BB%99%E7%BB%93%E6%9E%84%E4%BD%93%E5%AD%97%E6%AE%B5%E8%B5%8B%E5%80%BC%E9%9D%9E%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8.html&quot;&gt;dotnet C# 给结构体字段赋值非线程安全&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E7%BB%93%E6%9E%84%E4%BD%93%E5%87%BA%E6%96%B9%E6%B3%95%E5%BC%B9%E6%A0%88%E4%B9%8B%E5%90%8E%E7%9A%84%E8%A1%8C%E4%B8%BA.html&quot;&gt;dotnet C# 结构体出方法弹栈之后的行为&lt;/a&gt;
&lt;!-- [dotnet C# 结构体出方法弹栈之后的行为 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18377329 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-LatestCSharpFeatures-%E5%BA%93%E8%AE%A9%E6%97%A7%E7%89%88%E6%9C%AC-dotnet-%E6%A1%86%E6%9E%B6%E9%A1%B9%E7%9B%AE%E4%BD%BF%E7%94%A8%E6%96%B0-C-%E8%AF%AD%E6%B3%95.html&quot;&gt;使用 LatestCSharpFeatures 库让旧版本 dotnet 框架项目使用新 C# 语法&lt;/a&gt;
&lt;!-- [使用 LatestCSharpFeatures 库让旧版本 dotnet 框架项目使用新 C# 语法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18606279 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;dotnet&quot;&gt;dotnet&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%80%83%E5%8F%A4-dotnet-%E7%9A%84%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%AC.html&quot;&gt;考古 dotnet 的不同版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%BF%90%E8%A1%8C%E6%97%B6%E8%8E%B7%E5%8F%96%E6%9F%90%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%AF%B9%E8%B1%A1%E5%8D%A0%E7%94%A8%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F.html&quot;&gt;dotnet 运行时获取某类型的对象占用内存大小&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-8.0-%E6%96%87%E4%BB%B6%E9%95%BF%E5%BA%A6-Bytes-%E5%AD%97%E8%8A%82%E8%BD%AC-KB-%E7%AD%89%E5%8D%95%E4%BD%8D%E5%AD%97%E7%AC%A6%E4%B8%B2.html&quot;&gt;C# 8.0 文件长度 Bytes 字节转 KB 等单位字符串&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9%E5%BA%94%E7%94%A8%E5%9C%A8%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8%E6%98%BE%E7%A4%BA%E7%9A%84%E8%BF%9B%E7%A8%8B%E5%90%8D-AssemblyTitle-%E7%9A%84%E5%80%BC.html&quot;&gt;dotnet 如何更改应用在任务管理器显示的进程名 AssemblyTitle 的值&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B0%86%E6%8E%A7%E5%88%B6%E5%8F%B0-Console.WriteLine-%E5%86%85%E5%AE%B9%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 将控制台 Console.WriteLine 内容输出到文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-FileAccess-%E4%B8%8E-OpenOrCreate-%E5%AF%B9%E6%96%87%E4%BB%B6%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;dotnet 使用 FileAccess 与 OpenOrCreate 对文件访问权限的影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%AF%BB%E5%86%99-Sqlite-%E6%8F%90%E7%A4%BA-no-such-table-%E6%89%BE%E4%B8%8D%E5%88%B0%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 控制台读写 Sqlite 提示 no such table 找不到文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E7%BC%96%E5%86%99-curl-%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D%E5%92%8C%E5%AF%86%E7%A0%81%E9%80%BB%E8%BE%91.html&quot;&gt;C# dotnet 编写 curl 的用户名和密码逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BB%A3%E7%A0%81%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E6%97%A5%E5%BF%97.html&quot;&gt;dotnet C# 代码获取系统日志&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-TypeNameFormatter-%E5%BA%93%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%BE%93%E5%87%BA%E5%8F%8D%E5%B0%84%E6%B3%9B%E5%9E%8B%E7%B1%BB%E5%9E%8B.html&quot;&gt;dotnet 使用 TypeNameFormatter 库格式化输出反射泛型类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%BF%BD%E7%95%A5%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html&quot;&gt;dotnet 忽略输出文件夹的正则表达式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E8%B0%83%E7%94%A8%E5%A7%94%E6%89%98%E7%9A%84-GetInvocationList-%E7%9A%84%E5%AF%B9%E8%B1%A1%E5%88%86%E9%85%8D.html&quot;&gt;dotnet C# 调用委托的 GetInvocationList 的对象分配&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-FormatterServices-%E7%9A%84-GetUninitializedObject-%E6%96%B9%E6%B3%95%E5%9C%A8%E4%B8%A2%E5%A4%B1-DLL-%E6%83%85%E5%86%B5%E4%B8%8B%E8%83%BD%E5%90%A6%E6%89%A7%E8%A1%8C.html&quot;&gt;dotnet 使用 FormatterServices 的 GetUninitializedObject 方法在丢失 DLL 情况下能否执行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%85%A8%E5%B1%80-Windows-%E9%BC%A0%E6%A0%87%E9%92%A9%E5%AD%90.html&quot;&gt;dotnet C# 全局 Windows 鼠标钩子&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%8F%8D%E5%B0%84%E6%89%AB%E6%8F%8F%E7%A8%8B%E5%BA%8F%E9%9B%86%E6%89%80%E6%9C%89%E7%B1%BB%E5%9E%8B%E4%BC%9A%E4%B8%8D%E4%BC%9A%E8%A7%A6%E5%8F%91%E7%B1%BB%E5%9E%8B%E9%9D%99%E6%80%81%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.html&quot;&gt;dotnet C# 反射扫描程序集所有类型会不会触发类型静态构造函数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%86%99%E4%B8%80%E4%B8%AA24%E7%82%B9%E8%AE%A1%E7%AE%97%E7%A8%8B%E5%BA%8F.html&quot;&gt;C# 写一个24点计算程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%8F%8D%E5%B0%84%E5%88%A4%E6%96%AD%E5%B1%9E%E6%80%A7%E6%98%AF%E6%8A%BD%E8%B1%A1%E7%BB%A7%E6%89%BF.html&quot;&gt;C# 反射判断属性是抽象继承&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E7%BA%AF%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%85%A8%E5%B1%8F%E7%AA%97%E5%8F%A3.html&quot;&gt;C# 纯控制台创建一个全屏窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8%E9%98%BF%E9%87%8C%E5%87%BD%E6%95%B0%E8%AE%A1%E7%AE%97%E6%9C%8D%E5%8A%A1.html&quot;&gt;dotnet C# 使用阿里函数计算服务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%9B%BE%E7%89%87%E7%AD%89%E6%AF%94%E9%99%90%E5%88%B6%E6%9C%80%E5%A4%A7%E5%92%8C%E6%9C%80%E5%B0%8F%E5%A4%A7%E5%B0%8F%E7%BC%A9%E6%94%BE%E7%AE%97%E6%B3%95.html&quot;&gt;dotnet C# 图片等比限制最大和最小大小缩放算法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-ConfigureAwait.Fody-%E5%BA%93%E8%AE%BE%E7%BD%AE%E9%BB%98%E8%AE%A4%E7%9A%84-await-%E5%90%8C%E6%AD%A5%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE.html&quot;&gt;dotnet 使用 ConfigureAwait.Fody 库设置默认的 await 同步上下文切换配置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-Community-Toolkit-3.0-%E6%96%B0%E5%8A%9F%E8%83%BD.html&quot;&gt;Windows Community Toolkit 3.0 新功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%BA%E5%A4%A7%E5%9E%8B%E5%BA%94%E7%94%A8%E6%8E%A5%E5%85%A5-ApplicationStartupManager-%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 为大型应用接入 ApplicationStartupManager 启动流程框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E8%8E%B7%E5%8F%96-PC-%E5%BA%8F%E5%88%97%E5%8F%B7.html&quot;&gt;C# 获取 PC 序列号&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%A4%A7%E7%AB%AF%E5%B0%8F%E7%AB%AF%E8%BD%AC%E6%8D%A2.html&quot;&gt;C# 大端小端转换&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-MemoryFailPoint-%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E6%9C%89%E8%B6%B3%E5%A4%9F%E7%9A%84%E5%86%85%E5%AD%98%E8%B5%84%E6%BA%90%E6%9D%A5%E6%89%A7%E8%A1%8C%E6%93%8D%E4%BD%9C.html&quot;&gt;dotnet C# 如何使用 MemoryFailPoint 检查是否有足够的内存资源来执行操作&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E8%AE%BE%E5%A4%87%E5%8F%AF%E7%A7%BB%E5%8A%A8%E7%A3%81%E7%9B%98.html&quot;&gt;dotnet C# 获取当前设备可移动磁盘&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%86%99%E4%B8%80%E4%B8%AA%E6%94%AF%E6%8C%81%E5%B1%82%E5%B1%82%E7%BB%A7%E6%89%BF%E5%B1%9E%E6%80%A7%E7%9A%84%E5%AF%B9%E8%B1%A1.html&quot;&gt;dotnet 写一个支持层层继承属性的对象&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%A9-dotnet-%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BE%93%E5%87%BA%E4%BD%9C%E4%B8%BA%E8%8B%B1%E6%96%87%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;让 dotnet 命令行输出作为英文的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/.NET-%E5%AE%98%E6%96%B9%E5%9B%BE%E6%A0%87.html&quot;&gt;.NET 官方图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/MSIL-%E9%9D%99%E6%80%81%E7%B1%BB%E5%9C%A8-IL-%E5%AE%9A%E4%B9%89%E4%B8%8A%E5%92%8C%E9%9D%9E%E9%9D%99%E6%80%81%E7%B1%BB%E7%9A%84%E5%B7%AE%E5%88%AB.html&quot;&gt;MSIL 静态类在 IL 定义上和非静态类的差别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%AE%80%E5%8D%95%E5%86%99%E4%B8%80%E4%B8%AA-pdb-%E7%AC%A6%E5%8F%B7%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD%E5%99%A8.html&quot;&gt;dotnet 简单写一个 pdb 符号文件下载器&lt;/a&gt;
&lt;!-- [dotnet 简单写一个 pdb 符号文件下载器 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18571309 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;代码优化&quot;&gt;代码优化&lt;/h3&gt;

&lt;p&gt;教你如何编写好的代码，如何对代码进行优化，这是入门级的博客&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BB%A3%E7%A0%81%E4%BC%98%E5%8C%96-%E8%81%8A%E8%81%8A%E9%80%BB%E8%BE%91%E5%9C%88%E5%A4%8D%E6%9D%82%E5%BA%A6.html&quot;&gt;dotnet 代码优化 聊聊逻辑圈复杂度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;团队协作下，要求代码质量，离不开代码审查，以下是一些代码审查套路&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%80%E4%BA%9B%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5%E5%A5%97%E8%B7%AF.html&quot;&gt;dotnet 一些代码审查套路&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;基础库&quot;&gt;基础库&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8%E5%AE%8C%E5%85%A8%E5%AF%B9%E8%B1%A1%E5%BC%95%E7%94%A8%E7%9B%B8%E7%AD%89%E5%88%A4%E6%96%AD.html&quot;&gt;dotnet 使用完全对象引用相等判断&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E6%8F%90%E7%A4%BA%E6%89%BE%E4%B8%8D%E5%88%B0-CompositionContainer-%E7%B1%BB%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html&quot;&gt;C# dotnet 提示找不到 CompositionContainer 类的解决方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%BD%BF%E7%94%A8-TaskCompletionSource-%E5%AE%9E%E7%8E%B0%E6%9A%82%E5%81%9C%E5%8A%9F%E8%83%BD.html&quot;&gt;C# dotnet 使用 TaskCompletionSource 实现暂停功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%9F%BA%E7%A1%80%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%A4%84%E7%90%86-%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%95%B0%E7%BB%84%E4%B8%8E%E7%BB%93%E6%9E%84%E4%BD%93%E7%9A%84%E4%BA%92%E8%BD%AC.html&quot;&gt;dotnet C# 基础二进制处理 二进制数组与结构体的互转&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%B5%AE%E7%82%B9%E6%95%B0-double-%E7%9A%84-IsFinite-IsNormal-IsRealNumber-%E5%88%86%E4%B8%8D%E6%B8%85%E6%A5%9A.html&quot;&gt;C# 浮点数 double 的 IsFinite IsNormal IsRealNumber 分不清楚&lt;/a&gt;
&lt;!-- [C# 浮点数 double 的 IsFinite IsNormal IsRealNumber 分不清楚 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19309851 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-TypeForwarding-%E7%9A%84%E7%94%A8%E6%B3%95.html&quot;&gt;C# dotnet TypeForwarding 的用法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-GZipStream-%E5%8E%8B%E7%BC%A9%E5%AD%97%E7%AC%A6%E4%B8%B2.html&quot;&gt;dotnet 使用 GZipStream 压缩字符串&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-lz4net-%E5%8E%8B%E7%BC%A9-Stream-%E6%88%96%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 使用 lz4net 压缩 Stream 或文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%A4%E6%96%AD%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B%E6%9C%AA%E5%93%8D%E5%BA%94.html&quot;&gt;dotnet 判断其他进程未响应&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84-Scoped-%E7%BB%99%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%B3%A8%E5%85%A5%E7%9B%B8%E5%90%8C%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet 通过依赖注入的 Scoped 给工作流注入相同的上下文信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%89%BE%E4%B8%8D%E5%88%B0-PostAsJsonAsync-%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 找不到 PostAsJsonAsync 方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%BB%98%E8%AE%A4%E5%88%9B%E5%BB%BA%E7%9A%84-JsonContent-%E6%B2%A1%E6%9C%89-Content-Length-%E7%9A%84%E5%86%85%E5%AE%B9%E5%A4%B4.html&quot;&gt;dotnet 默认创建的 JsonContent 没有 Content Length 的内容头&lt;/a&gt;
&lt;!-- [dotnet 默认创建的 JsonContent 没有 Content Length 的内容头 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18377448 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AE%9A%E5%88%B6-ILogger-%E5%AE%9E%E7%8E%B0.html&quot;&gt;dotnet 定制 ILogger 实现&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%8E%B7%E5%8F%96%E7%A8%8B%E5%BA%8F%E6%89%80%E5%9C%A8%E8%B7%AF%E5%BE%84%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 获取程序所在路径的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%97%E8%A1%A8-Linq-%E7%9A%84-Take-%E7%94%A8%E6%B3%95.html&quot;&gt;dotnet 列表 Linq 的 Take 用法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%9E%9A%E4%B8%BE%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html&quot;&gt;C＃ 枚举转字符串&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%9B%E5%BB%BA%E4%B8%8D%E5%B8%A6BOM-%E7%9A%84UTF8.html&quot;&gt;创建不带BOM 的UTF8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AD%97%E5%85%B8%E7%B1%BB%E6%89%BE%E4%B8%8D%E5%88%B0-TryAdd-%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 字典类找不到 TryAdd 方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%9D%9E%E6%B3%9B%E5%9E%8B-%E7%B1%BB%E5%9E%8B-System.Collections.IEnumerable-%E4%B8%8D%E8%83%BD%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%AE%9E%E5%8F%82%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8.html&quot;&gt;dotnet 非泛型 类型 System.Collections.IEnumerable 不能与类型实参一起使用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%95%B0%E7%BB%84%E8%87%AA%E5%8A%A8%E8%BD%AC%E5%9F%BA%E7%B1%BB%E6%95%B0%E7%BB%84%E6%8F%90%E7%A4%BA-Co-variant-array-conversion-%E6%98%AF%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet 数组自动转基类数组提示 Co-variant array conversion 是什么问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-Find-vs-FirstOrDefault.html&quot;&gt;C＃ Find vs FirstOrDefault&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AD%A6%E6%83%95-ConcurrentDictionary-%E4%BD%BF%E7%94%A8-FirstOrDefault-%E8%8E%B7%E5%8F%96%E5%88%B0%E9%9D%9E%E9%A2%84%E6%9C%9F%E7%9A%84%E9%A6%96%E9%A1%B9.html&quot;&gt;dotnet 警惕 ConcurrentDictionary 使用 FirstOrDefault 获取到非预期的首项&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E7%94%A8%E5%80%BC%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B4%E4%B8%AA%E6%95%B0%E7%BB%84.html&quot;&gt;dotnet core 用值初始化整个数组&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D%E6%89%BE%E4%B8%8D%E5%88%B0-System.ServiceProcess-%E5%AE%9A%E4%B9%89.html&quot;&gt;dotnet 修复找不到 System.ServiceProcess 定义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93%E5%90%8D%E5%AD%97%E9%95%BF%E5%BA%A6%E9%99%90%E5%88%B6.html&quot;&gt;dotnet 命名管道名字长度限制&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%89%B9%E6%80%A7-DynamicallyInvokable-%E6%98%AF%E7%94%A8%E6%9D%A5%E5%81%9A%E4%BB%80%E4%B9%88%E7%9A%84.html&quot;&gt;dotnet 特性 DynamicallyInvokable 是用来做什么的&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Environment.FailFast-%E7%BB%93%E6%9D%9F%E7%A8%8B%E5%BA%8F.html&quot;&gt;dotnet 使用 Environment.FailFast 结束程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-GC.GetAllocatedBytesForCurrentThread-%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E5%88%86%E9%85%8D%E8%BF%87%E7%9A%84%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F.html&quot;&gt;dotnet 使用 GC.GetAllocatedBytesForCurrentThread 获取当前线程分配过的内存大小&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B0%86%E4%BB%BB%E6%84%8F%E6%97%B6%E5%8C%BA%E7%9A%84-DateTimeOffset-%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%B8%AD%E5%9B%BD%E6%97%B6%E5%8C%BA%E6%97%B6%E9%97%B4%E6%96%87%E6%9C%AC.html&quot;&gt;dotnet 将任意时区的 DateTimeOffset 转换为中国时区时间文本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%9C%A8-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E6%B7%BB%E5%8A%A0-CallerMemberName-%E4%BC%9A%E6%80%8E%E6%A0%B7.html&quot;&gt;C# 在 构造函数添加 CallerMemberName 会怎样&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-double-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%89%A9%E5%B1%95.html&quot;&gt;C# double 好用的扩展&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%90%86%E8%A7%A3-IConfigurationProvider-%E7%9A%84-GetChildKeys-%E6%96%B9%E6%B3%95%E7%94%A8%E9%80%94.html&quot;&gt;dotnet 理解 IConfigurationProvider 的 GetChildKeys 方法用途&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%BB%99-NuGet-%E5%8C%85%E5%8A%A0%E4%B8%8A-Aliases-%E5%88%AB%E5%90%8D%E8%A7%A3%E5%86%B3%E7%B1%BB%E5%9E%8B%E5%86%B2%E7%AA%81.html&quot;&gt;dotnet 给 NuGet 包加上 Aliases 别名解决类型冲突&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB-dotnet-%E6%BA%90%E4%BB%A3%E7%A0%81-%E4%B8%BA%E4%BD%95-Thread.Sleep-%E5%8D%8A%E6%AF%AB%E7%A7%92%E5%92%8C%E4%B8%80%E6%AF%AB%E7%A7%92%E7%AD%89%E5%BE%85%E6%97%B6%E9%97%B4%E5%B7%AE%E8%B7%9D%E5%A6%82%E6%AD%A4%E4%B9%8B%E5%A4%A7.html&quot;&gt;读 dotnet 源代码 为何 Thread.Sleep 半毫秒和一毫秒等待时间差距如此之大&lt;/a&gt;
&lt;!-- [读 dotnet 源代码 为何 Thread.Sleep 半毫秒和一毫秒等待时间差距如此之大 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18381792 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-System.IO.Hashing-%E5%BA%93%E8%BF%9B%E8%A1%8C-Crc32-%E8%AE%A1%E7%AE%97.html&quot;&gt;dotnet C# 使用 System.IO.Hashing 库进行 Crc32 计算&lt;/a&gt;
&lt;!-- [dotnet C# 使用 System.IO.Hashing 库进行 Crc32 计算 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18817812 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Microsoft.NET.HostModel-%E5%BA%93%E8%BE%85%E5%8A%A9%E6%9B%B4%E6%94%B9-AppHost-%E5%86%85%E5%AE%B9.html&quot;&gt;dotnet 使用 Microsoft.NET.HostModel 库辅助更改 AppHost 内容&lt;/a&gt;
&lt;!-- [dotnet 使用 Microsoft.NET.HostModel 库辅助更改 AppHost 内容 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18897793 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%95%B0%E7%BB%84%E6%B1%A0-ArrayPool-%E8%A1%8C%E4%B8%BA%E8%AE%B0%E5%BD%95.html&quot;&gt;dotnet 数组池 ArrayPool 行为记录&lt;/a&gt;
&lt;!-- [dotnet 数组池 ArrayPool 行为记录 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18978158 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;net-framework&quot;&gt;.NET Framework&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E8%AE%BE%E5%A4%87%E5%AE%89%E8%A3%85%E4%BA%86%E5%93%AA%E4%BA%9B-.NET-Framework-%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 获取用户设备安装了哪些 .NET Framework 框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Framework-%E6%BA%90%E4%BB%A3%E7%A0%81-%E7%B1%BB%E5%BA%93%E7%9A%84%E6%84%8F%E6%80%9D.html&quot;&gt;dotnet Framework 源代码 类库的意思&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-dotnet-%E4%BD%BF%E7%94%A8%E6%9C%AC%E6%9C%BA%E6%98%A0%E5%83%8F-native-%E4%BC%98%E5%8C%96-dotnet-framework-%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6.html&quot;&gt;WPF dotnet 使用本机映像 native 优化 dotnet framework 二进制文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%90%AF%E5%8A%A8%E8%BF%9B%E7%A8%8B%E4%BC%A0%E5%85%A5%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E4%BD%9C%E4%B8%BA%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95%E8%A1%8C%E4%B8%BA%E5%8F%98%E6%9B%B4.html&quot;&gt;dotnet 启动进程传入不存在的文件夹作为工作目录行为变更&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;net-framework-与-net-core-差别&quot;&gt;.NET Framework 与 .NET Core 差别&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%92%8C-dotnet-Framework-%E5%90%AF%E5%8A%A8%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%E5%B7%AE%E5%88%AB.html&quot;&gt;dotnet core 和 dotnet Framework 启动可执行文件的差别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%87%E7%BA%A7%E5%88%B0-dotnet-core-%E4%B9%8B%E5%90%8E-HandleProcessCorruptedStateExceptions-%E6%97%A0%E6%B3%95%E6%8E%A5%E4%BD%8F%E5%BC%82%E5%B8%B8.html&quot;&gt;升级到 dotnet core 之后 HandleProcessCorruptedStateExceptions 无法接住异常&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dotnet-core-2&quot;&gt;dotnet core 2&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-2-%E4%BD%BF%E7%94%A8-DispatchProxy-%E5%81%9A%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86-AOP-%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet core 2 使用 DispatchProxy 做动态代理 AOP 入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-2.1-%E4%BD%BF%E7%94%A8%E9%98%B6%E6%A2%AF%E7%BC%96%E8%AF%91.html&quot;&gt;dotnet core 2.1 使用阶梯编译&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E4%BD%BF%E7%94%A8-GBK-%E7%BC%96%E7%A0%81.html&quot;&gt;dotnet core 使用 GBK 编码&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dotnet-5&quot;&gt;dotnet 5&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-dotnet-5-%E9%A2%84%E8%A7%88%E7%89%88.html&quot;&gt;如何使用 dotnet 5 预览版&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%9A%E5%88%9A%E6%88%91%E4%BB%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%9B%9E%E6%BB%9A%E4%BA%86-dotnet-5-%E7%9A%84%E7%8E%AF%E5%A2%83.html&quot;&gt;刚刚我从服务器回滚了 dotnet 5 的环境&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-5-%E4%BB%8E-IL-%E5%B1%82%E9%9D%A2%E5%88%86%E6%9E%90%E5%8D%8F%E5%8F%98%E8%BF%94%E5%9B%9E%E7%B1%BB%E5%9E%8B%E6%96%B0%E7%89%B9%E6%80%A7.html&quot;&gt;dotnet 5 从 IL 层面分析协变返回类型新特性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-5-%E7%9A%84-bin-%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E7%9A%84-ref-%E6%96%87%E4%BB%B6%E5%A4%B9%E6%98%AF%E5%81%9A%E4%BB%80%E4%B9%88%E7%94%A8%E7%9A%84.html&quot;&gt;dotnet 5 的 bin 文件夹下的 ref 文件夹是做什么用的&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-5-%E7%A0%B4%E5%9D%8F%E6%80%A7%E6%94%B9%E5%8A%A8-WPF-%E5%92%8C-WinForms-%E7%9A%84-OutputType-%E8%BE%93%E5%87%BA%E7%B1%BB%E5%9E%8B%E9%87%8D%E5%AE%9A%E5%90%91%E4%B8%BA-WinExe-%E7%B1%BB%E5%9E%8B.html&quot;&gt;dotnet 5 破坏性改动 WPF 和 WinForms 的 OutputType 输出类型重定向为 WinExe 类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%92%8C-.NET-5-%E4%B8%8D%E6%94%AF%E6%8C%81-Prefer32Bit-%E9%A6%96%E9%80%89-32-%E4%BD%8D%E7%9A%84%E5%8A%9F%E8%83%BD.html&quot;&gt;dotnet core 和 .NET 5 不支持 Prefer32Bit 首选 32 位的功能&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dotnet-6&quot;&gt;dotnet 6&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E7%A0%B4%E5%9D%8F%E6%80%A7%E6%94%B9%E5%8A%A8-%E4%BB%85%E5%BC%95%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%9B%86%E8%BE%93%E5%87%BA%E8%B7%AF%E5%BE%84%E5%8F%98%E6%9B%B4.html&quot;&gt;dotnet 6 破坏性改动 仅引用程序集输出路径变更&lt;/a&gt;
&lt;!-- [dotnet 6 破坏性改动 仅引用程序集输出路径变更 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18261881 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-Obfuscar-%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86.html&quot;&gt;dotnet 6 使用 Obfuscar 进行代码混淆&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-string.Create-%E6%8F%90%E5%8D%87%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%88%9B%E5%BB%BA%E5%92%8C%E6%8B%BC%E6%8E%A5%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 6 使用 string.Create 提升字符串创建和拼接性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E9%80%9A%E8%BF%87-DOTNET_ROOT-%E8%AE%A9%E8%B0%83%E8%B5%B7%E7%9A%84%E5%BA%94%E7%94%A8%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%8B%BF%E5%88%B0%E5%85%B1%E4%BA%AB%E7%9A%84%E8%BF%90%E8%A1%8C%E6%97%B6%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;dotnet 6 通过 DOTNET_ROOT 让调起的应用的进程拿到共享的运行时文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E6%8E%A8%E8%8D%90%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A3%E6%9B%BF-.NET-Remoting-%E7%9A%84-IPC-%E5%BA%93.html&quot;&gt;dotnet 6 推荐一个可代替 .NET Remoting 的 IPC 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-File.Exists-%E5%88%A4%E6%96%AD%E7%AE%A1%E9%81%93%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E5%B0%86%E8%AE%A9%E4%B8%8B%E6%AC%A1%E8%BF%9E%E6%8E%A5%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 6 使用 File.Exists 判断管道是否存在将让下次连接失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Crossgen2-%E5%AF%B9-DLL-%E8%BF%9B%E8%A1%8C-ReadyToRun-%E6%8F%90%E5%8D%87%E5%90%AF%E5%8A%A8%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-DependentHandle-%E5%85%B3%E8%81%94%E5%AF%B9%E8%B1%A1%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html&quot;&gt;dotnet 6 使用 DependentHandle 关联对象生命周期&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-CreateSymbolicLink-%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5.html&quot;&gt;dotnet 6 使用 CreateSymbolicLink 创建文件夹符号链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BF%AE%E5%A4%8D%E6%89%BE%E4%B8%8D%E5%88%B0-EnumeratorToEnumVariantMarshaler-%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet 6 修复找不到 EnumeratorToEnumVariantMarshaler 问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-InterpolatedStringHandler-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E7%9A%84-out-%E5%8F%82%E6%95%B0%E6%9C%89%E4%BB%80%E4%B9%88%E6%84%8F%E4%B9%89.html&quot;&gt;dotnet 6 InterpolatedStringHandler 构造函数的 out 参数有什么意义&lt;/a&gt;
&lt;!-- [dotnet 6 InterpolatedStringHandler 构造函数的 out 参数有什么意义 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18682800 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;dotnet-7&quot;&gt;dotnet 7&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%81%8A%E8%81%8A-dotnet-7-%E5%AF%B9-bool-%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BA%92%E8%BD%AC%E7%9A%84%E5%BA%95%E5%B1%82%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.html&quot;&gt;聊聊 dotnet 7 对 bool 与字符串互转的底层性能优化&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dotnet-8&quot;&gt;dotnet 8&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-8-%E7%A0%B4%E5%9D%8F%E6%80%A7%E6%94%B9%E5%8A%A8-%E5%9C%A8-AssemblyInformationalVersionAttribute-%E6%B7%BB%E5%8A%A0%E4%B8%8A-git-%E7%9A%84-commit-%E5%8F%B7.html&quot;&gt;dotnet 8 破坏性改动 在 AssemblyInformationalVersionAttribute 添加上 git 的 commit 号&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dotnet-9&quot;&gt;dotnet 9&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-9-%E9%80%9A%E8%BF%87-AppHostRelativeDotNet-%E6%8C%87%E5%AE%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E8%BF%90%E8%A1%8C%E6%97%B6%E8%B7%AF%E5%BE%84.html&quot;&gt;dotnet 9 通过 AppHostRelativeDotNet 指定自定义的运行时路径&lt;/a&gt;
&lt;!-- [dotnet 9 通过 AppHostRelativeDotNet 指定自定义的运行时路径 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18847625 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-9-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E9%BB%98%E8%AE%A4%E5%BC%80%E5%90%AF-CET-%E5%AF%BC%E8%87%B4%E8%BF%9B%E7%A8%8B%E5%B4%A9%E6%BA%83.html&quot;&gt;dotnet 9 已知问题 默认开启 CET 导致进程崩溃&lt;/a&gt;
&lt;!-- [dotnet 9 已知问题 默认开启 CET 导致进程崩溃 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18700406 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Cli-sdk-%E4%BB%80%E4%B9%88%E6%98%AF-Terminal-Logger-%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E7%A6%81%E7%94%A8%E6%AD%A4%E5%8A%9F%E8%83%BD.html&quot;&gt;dotnet Cli sdk 什么是 Terminal Logger 以及如何禁用此功能&lt;/a&gt;
&lt;!-- [dotnet Cli sdk 什么是 Terminal Logger 以及如何禁用此功能 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18764082 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%B5%8B%E8%AF%95-dotnet-9-%E7%9A%84-AssemblyLoadContext-%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E5%92%8C%E5%8D%B8%E8%BD%BD%E7%A8%8B%E5%BA%8F%E9%9B%86%E8%83%BD%E5%8A%9B.html&quot;&gt;测试 dotnet 9 的 AssemblyLoadContext 动态加载和卸载程序集能力&lt;/a&gt;
&lt;!-- [测试 dotnet 9 的 AssemblyLoadContext 动态加载和卸载程序集能力 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18976101 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;序列化&quot;&gt;序列化&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-MessagePack-%E5%BA%8F%E5%88%97%E5%8C%96%E5%AF%B9%E8%B1%A1.html&quot;&gt;dotnet 使用 MessagePack 序列化对象&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;xml&quot;&gt;XML&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%BA%8F%E5%88%97%E5%8C%96-XML-%E6%97%B6%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E6%A0%BC%E5%BC%8F%E5%8C%96.html&quot;&gt;dotnet C# 序列化 XML 时进行自动格式化&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E8%BF%9B%E8%A1%8C-XML-%E5%BA%8F%E5%88%97%E5%8C%96%E6%8A%9B%E5%87%BA-XmlSerializers-dll-%E6%96%87%E4%BB%B6%E6%89%BE%E4%B8%8D%E5%88%B0.html&quot;&gt;dotnet core 进行 XML 序列化抛出 XmlSerializers dll 文件找不到&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%BA%8F%E5%88%97%E7%B1%BB%E4%B8%BA-xml-%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E7%9A%84%E7%89%B9%E6%80%A7%E5%A4%A7%E5%85%A8.html&quot;&gt;C# 序列类为 xml 可以使用的特性大全&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;json&quot;&gt;JSON&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-json-%E8%BD%AC-xml-%E5%AD%97%E7%AC%A6%E4%B8%B2.html&quot;&gt;C# json 转 xml 字符串&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A6%82%E4%BD%95%E8%AE%A9-Json-%E5%BA%8F%E5%88%97%E5%8C%96%E6%95%B0%E7%BB%84%E6%97%B6%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%A7%E6%89%BF%E7%B1%BB%E7%9A%84%E5%B1%9E%E6%80%A7.html&quot;&gt;dotnet C# 如何让 Json 序列化数组时序列化继承类的属性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%89%8B%E5%8A%A8%E8%A7%A3%E5%86%B3-json-%E8%A7%A3%E6%9E%90%E4%B8%AD%E4%B8%8D%E5%90%88%E6%B3%95%E5%AD%97%E7%AC%A6%E4%B8%B2.html&quot;&gt;dotnet 手动解决 json 解析中不合法字符串&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Newtonsoft.Json-%E8%BE%93%E5%87%BA%E6%9E%9A%E4%B8%BE%E9%A6%96%E5%AD%97%E7%AC%A6%E5%B0%8F%E5%86%99.html&quot;&gt;dotnet 使用 Newtonsoft.Json 输出枚举首字符小写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E5%9C%A8-System.Text.Json-%E4%BD%BF%E7%94%A8-source-generation-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E6%8F%90%E5%8D%87-JSON-%E5%BA%8F%E5%88%97%E5%8C%96%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 6 在 System.Text.Json 使用 source generation 源代码生成提升 JSON 序列化性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BF%AE%E5%A4%8D%E5%9C%A8-System.Text.Json-%E4%BD%BF%E7%94%A8-source-generation-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E6%8F%90%E7%A4%BA-SYSLIB1032-%E9%94%99%E8%AF%AF.html&quot;&gt;dotnet 6 修复在 System.Text.Json 使用 source generation 源代码生成提示 SYSLIB1032 错误&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;公共组件-cbb-建设&quot;&gt;公共组件 CBB 建设&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%9B%E5%BB%BACBB%E5%BF%83%E5%BE%97.html&quot;&gt;创建CBB心得&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%90%AC%E9%BE%99%E5%8D%8E%E8%AE%B2%E5%85%AC%E5%85%B1%E7%BB%84%E4%BB%B6-CBB-%E5%BB%BA%E8%AE%BE%E7%AC%94%E8%AE%B0.html&quot;&gt;听龙华讲公共组件 CBB 建设笔记&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BC%80%E6%BA%90%E5%85%AC%E5%85%B1%E7%BB%84%E4%BB%B6%E4%BB%93%E5%BA%93%E7%9A%84%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%86%99.html&quot;&gt;开源公共组件仓库的更新日志应该如何写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%A0%B9%E6%8D%AE%E5%9F%BA%E7%BA%BF%E5%8C%85%E7%89%88%E6%9C%AC%E5%AE%9E%E7%8E%B0%E5%BA%93%E7%89%88%E6%9C%AC%E5%85%BC%E5%AE%B9.html&quot;&gt;dotnet 根据基线包版本实现库版本兼容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-CBB-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%B3%E5%AE%9A%E6%8E%A8%E9%80%81-Tag-%E6%89%8D%E8%83%BD%E6%89%93%E5%8C%85.html&quot;&gt;dotnet CBB 为什么决定推送 Tag 才能打包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%A6%82%E4%BD%95%E5%86%99%E5%87%BA%E4%B8%80%E4%B8%AA%E4%B8%8D%E8%83%BD%E8%A2%AB%E5%85%B6%E4%BB%96%E7%A8%8B%E5%BA%8F%E9%9B%86%E7%BB%A7%E6%89%BF%E7%9A%84%E6%8A%BD%E8%B1%A1%E7%B1%BB.html&quot;&gt;C# 如何写出一个不能被其他程序集继承的抽象类&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%9C%A8%E5%9F%BA%E7%B1%BB%E5%AE%9A%E4%B9%89%E5%A5%BD%E6%96%B9%E6%B3%95%E8%AE%A9%E5%AD%90%E7%B1%BB%E7%BB%A7%E6%89%BF%E6%8E%A5%E5%8F%A3%E5%B0%B1%E8%83%BD%E5%AE%9E%E7%8E%B0.html&quot;&gt;C# 在基类定义好方法让子类继承接口就能实现&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;插件式开发&quot;&gt;插件式开发&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E9%80%9A%E8%BF%87-DOTNET_ROOT-%E8%AE%A9%E8%B0%83%E8%B5%B7%E7%9A%84%E5%BA%94%E7%94%A8%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%8B%BF%E5%88%B0%E5%85%B1%E4%BA%AB%E7%9A%84%E8%BF%90%E8%A1%8C%E6%97%B6%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;dotnet 6 通过 DOTNET_ROOT 让调起的应用的进程拿到共享的运行时文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-dnlib-%E6%A3%80%E6%B5%8B%E6%8F%92%E4%BB%B6%E7%A8%8B%E5%BA%8F%E9%9B%86%E7%9A%84-API-%E5%85%BC%E5%AE%B9%E6%80%A7.html&quot;&gt;dotnet 使用 dnlib 检测插件程序集的 API 兼容性&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;构建和打包&quot;&gt;构建和打包&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/MSBuild-%E5%B8%B8%E7%94%A8%E5%8F%82%E6%95%B0.html&quot;&gt;MSBuild 常用参数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C-msbuild-%E7%BC%96%E8%AF%91%E9%A1%B9%E7%9B%AE.html&quot;&gt;如何通过命令行 msbuild 编译项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%BF%81%E7%A7%BB-dotnet-6-%E6%8F%90%E7%A4%BA%E5%BF%85%E9%A1%BB%E5%B0%86%E7%9B%AE%E6%A0%87%E5%B9%B3%E5%8F%B0%E8%AE%BE%E7%BD%AE%E4%B8%BA-Windows-%E5%B9%B3%E5%8F%B0.html&quot;&gt;迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%96%B0-sdk-style-%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F%E7%9A%84%E4%B8%80%E4%BA%9B%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%92%8C%E5%BC%95%E7%94%A8.html&quot;&gt;dotnet 新 sdk style 项目格式的一些命名空间和引用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%96%B0-sdk-style-%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F-%E6%96%87%E4%BB%B6%E5%86%B2%E7%AA%81.html&quot;&gt;dotnet 新 sdk style 项目格式 文件冲突&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%AE%E5%A4%8D-dotnet-Core-%E7%BC%BASDK%E7%BC%96%E8%AF%91%E5%A4%B1%E8%B4%A5.html&quot;&gt;修复 dotnet Core 缺SDK编译失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%A1%8C%E9%9D%A2%E7%AB%AF%E5%9F%BA%E4%BA%8E-AppHost-%E7%9A%84%E9%85%8D%E7%BD%AE%E5%BC%8F%E8%87%AA%E5%8A%A8%E5%88%87%E6%8D%A2%E6%9B%B4%E6%96%B0%E5%90%8E%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%B7%AF%E5%BE%84.html&quot;&gt;dotnet 桌面端基于 AppHost 的配置式自动切换更新后的应用程序路径&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PublishFolderCleaner-%E8%AE%A9%E4%BD%A0%E7%9A%84-dotnet-%E5%BA%94%E7%94%A8%E5%8F%91%E5%B8%83%E6%96%87%E4%BB%B6%E5%A4%B9%E6%9B%B4%E5%8A%A0%E6%95%B4%E6%B4%81.html&quot;&gt;PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%8F%91%E5%B8%83%E5%8F%AA%E6%9C%89%E4%B8%80%E4%B8%AA-exe-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet core 发布只有一个 exe 的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%9E%84%E5%BB%BA%E8%BF%98%E5%8E%9F%E5%A4%B1%E8%B4%A5-NuGet.targets-%E9%94%99%E8%AF%AF%E5%8F%AF%E8%83%BD%E5%8E%9F%E5%9B%A0.html&quot;&gt;dotnet 构建还原失败 NuGet.targets 错误可能原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%A7%A3%E5%86%B3%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0%E4%B8%8D%E5%AE%89%E5%85%A8-http-%E7%9A%84-NuGet-%E6%BA%90-NU1803-%E8%AD%A6%E5%91%8A%E6%88%96%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet 解决使用本地不安全 http 的 NuGet 源 NU1803 警告或构建失败问题&lt;/a&gt;
&lt;!-- [dotnet 解决使用本地不安全 http 的 NuGet 源 NU1803 警告或构建失败问题 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18312649 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D%E5%A4%9A%E6%A1%86%E6%9E%B6-TargetFrameworks-%E5%8C%85%E5%90%AB%E4%B8%8D%E5%8F%97%E6%94%AF%E6%8C%81%E5%B9%B3%E5%8F%B0%E5%AF%BC%E8%87%B4%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 修复多框架 TargetFrameworks 包含不受支持平台导致构建失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E5%BC%95%E7%94%A8-NAudio-%E7%9A%84%E6%97%A7%E7%89%88%E6%9C%AC%E6%9E%84%E5%BB%BA%E4%B8%8D%E9%80%9A%E8%BF%87.html&quot;&gt;dotnet 6 引用 NAudio 的旧版本构建不通过&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81%E6%9E%84%E5%BB%BA%E6%B2%A1%E9%97%AE%E9%A2%98-%E4%BD%86-CI-%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;C# dotnet 本地代码构建没问题，但 CI 自动构建失败可能的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E6%89%93%E5%8C%85%E6%9E%84%E5%BB%BA%E6%8F%90%E7%A4%BA-MSB3024-%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;dotnet core 打包构建提示 MSB3024 可能的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%9E%84%E5%BB%BA-SourceRoot-items-must-include-at-least-one-top-level-item-when-DeterministicSourcePaths-is-true-%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 构建 SourceRoot items must include at least one top-level item when DeterministicSourcePaths is true 失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3-vs-%E5%87%BA%E7%8E%B0Error-MC3000-%E7%BB%99%E5%AE%9A%E7%BC%96%E7%A0%81%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E6%97%A0%E6%95%88.html&quot;&gt;解决 vs 出现Error MC3000 给定编码中的字符无效&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/msbuild-%E4%BD%BF%E7%94%A8-ProduceOnlyReferenceAssembly-%E5%88%9B%E5%BB%BA%E4%BD%9C%E4%B8%BA%E5%BC%95%E7%94%A8%E7%9A%84%E4%BB%85%E5%85%AC%E5%BC%80%E6%88%90%E5%91%98%E7%A8%8B%E5%BA%8F%E9%9B%86.html&quot;&gt;msbuild 使用 ProduceOnlyReferenceAssembly 创建作为引用的仅公开成员程序集&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3%E4%BB%8E%E6%97%A7%E6%A0%BC%E5%BC%8F%E7%9A%84-csproj-%E8%BF%81%E7%A7%BB%E5%88%B0%E6%96%B0%E6%A0%BC%E5%BC%8F%E7%9A%84-csproj-%E6%A0%BC%E5%BC%8F-AssemblyInfo-%E6%96%87%E4%BB%B6%E5%80%BC%E9%87%8D%E5%A4%8D%E9%97%AE%E9%A2%98.html&quot;&gt;解决从旧格式的 csproj 迁移到新格式的 csproj 格式 AssemblyInfo 文件值重复问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D-ILLinkTasksAssembly-%E7%89%B9%E6%80%A7%E7%9A%84%E5%80%BC%E7%9A%84%E8%AE%A1%E7%AE%97%E7%BB%93%E6%9E%9C%E6%97%A0%E6%95%88.html&quot;&gt;dotnet 修复 ILLinkTasksAssembly 特性的值的计算结果无效&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%96%B0%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F%E4%B8%8E%E5%AF%B9%E5%BA%94%E6%A1%86%E6%9E%B6%E9%A2%84%E5%AE%9A%E4%B9%89%E7%9A%84%E5%AE%8F.html&quot;&gt;dotnet 新项目格式与对应框架预定义的宏&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%9E%81%E9%99%90%E5%8E%8B%E7%BC%A9-dotnet-core-%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%8F%91%E5%B8%83%E6%96%87%E4%BB%B6.html&quot;&gt;C# 极限压缩 dotnet core 控制台发布文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%B0%86dll%E6%89%93%E5%8C%85%E5%88%B0%E7%A8%8B%E5%BA%8F%E4%B8%AD.html&quot;&gt;C＃ 将dll打包到程序中&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E4%BD%BF%E7%94%A8-CoreRT-%E5%B0%86%E7%A8%8B%E5%BA%8F%E7%BC%96%E8%AF%91%E4%B8%BA-Native-%E7%A8%8B%E5%BA%8F.html&quot;&gt;dotnet core 使用 CoreRT 将程序编译为 Native 程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%90%AF%E5%8A%A8-JIT-%E5%A4%9A%E6%A0%B8%E5%BF%83%E7%BC%96%E8%AF%91%E6%8F%90%E5%8D%87%E5%90%AF%E5%8A%A8%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 启动 JIT 多核心编译提升启动性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-PublishReadyToRunComposite-%E5%87%8F%E5%B0%91%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E8%AF%BB%E5%8F%96%E5%A4%A7%E9%87%8F-DLL-%E6%96%87%E4%BB%B6%E6%8F%90%E5%8D%87%E5%90%AF%E5%8A%A8%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 通过 PublishReadyToRunComposite 减少启动过程读取大量 DLL 文件提升启动性能&lt;/a&gt;
&lt;!-- [dotnet 通过 PublishReadyToRunComposite 减少启动过程读取大量 DLL 文件提升启动性能 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18899676 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E8%A7%A3%E5%86%B3-Path-%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6%E5%90%8D%E8%B7%AF%E5%BE%84%E5%9C%A8-Windows-%E6%9E%84%E5%BB%BA%E5%9C%A8-Linux-%E6%89%A7%E8%A1%8C%E9%97%AE%E9%A2%98.html&quot;&gt;C# dotnet 解决 Path 获取文件名路径在 Windows 构建在 Linux 执行问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Obsolete-%E7%89%B9%E6%80%A7%E6%A0%87%E8%AE%B0%E6%88%90%E5%91%98%E8%BF%87%E6%97%B6%E4%BF%9D%E6%8C%81%E5%BA%93%E5%92%8C%E6%A1%86%E6%9E%B6%E7%9A%84%E5%85%BC%E5%AE%B9%E6%80%A7.html&quot;&gt;dotnet 使用 Obsolete 特性标记成员过时保持库和框架的兼容性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Ubuntu-%E9%80%9A%E8%BF%87%E6%9C%AC%E6%9C%BA%E4%BB%A3%E7%90%86%E4%BF%AE%E5%A4%8D-NuGet-%E8%BF%98%E5%8E%9F-error-NU1301-%E5%A4%B1%E8%B4%A5.html&quot;&gt;Ubuntu 通过本机代理修复 NuGet 还原 error NU1301 失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%8F%91%E5%B8%83%E5%8F%AA%E5%B8%A6%E5%BF%85%E8%A6%81%E7%9A%84%E4%BE%9D%E8%B5%96%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet core 发布只带必要的依赖文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E5%91%BD%E4%BB%A4%E8%A1%8C-cmd-%E8%AE%BE%E7%BD%AE%E8%BE%93%E5%87%BA%E8%8B%B1%E6%96%87%E8%A7%A3%E5%86%B3%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81.html&quot;&gt;dotnet 6 命令行 cmd 设置输出英文解决中文乱码&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;aot&quot;&gt;AOT&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%B5%8B%E8%AF%95-AOT-%E7%9A%84-API-%E8%A1%8C%E4%B8%BA.html&quot;&gt;dotnet 测试 AOT 的 API 行为&lt;/a&gt;
&lt;!-- [dotnet 测试 AOT 的 API 行为 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18976102 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;多线程和锁相关&quot;&gt;多线程和锁相关&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/code-daily/p/18924622&quot;&gt;C# 锁机制全景与高效实践：从 Monitor 到 .NET 9 全新 Lock - AI·NET极客圈 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%A6%81%E6%AD%A2%E5%90%8C%E6%97%B6%E8%B0%83%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E6%96%B9%E6%B3%95-%E7%A6%81%E6%AD%A2%E6%96%B9%E6%B3%95%E9%87%8D%E5%85%A5%E8%B0%83%E7%94%A8-%E5%8F%8C%E6%A3%80%E9%94%81%E7%9A%84%E8%AE%BE%E8%AE%A1.html&quot;&gt;dotnet 多线程禁止同时调用相同的方法 禁止方法重入调用 双检锁的设计&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E7%9A%84%E9%94%81-SemaphoreSlim-%E5%92%8C%E9%98%9F%E5%88%97.html&quot;&gt;C# dotnet 的锁 SemaphoreSlim 和队列&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%B5%8B%E8%AF%95-SemaphoreSlim-%E7%9A%84-Wait-%E6%98%AF%E5%90%A6%E4%BF%9D%E6%8C%81%E8%BF%9B%E5%85%A5%E7%AD%89%E5%BE%85%E7%9A%84%E9%A1%BA%E5%BA%8F%E5%85%88%E8%BF%9B%E5%85%88%E5%87%BA.html&quot;&gt;dotnet 测试 SemaphoreSlim 的 Wait 是否保持进入等待的顺序先进先出&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%87%8C%E7%9A%84%E9%82%A3%E4%BA%9B%E9%94%81-AutoResetEvent-%E7%94%A8%E6%B3%95.html&quot;&gt;dotnet 里的那些锁 AutoResetEvent 用法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%BD%BF%E7%94%A8-AsyncEx-%E5%BA%93%E7%9A%84-AsyncLock-%E5%BC%82%E6%AD%A5%E9%94%81.html&quot;&gt;C# dotnet 使用 AsyncEx 库的 AsyncLock 异步锁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%B5%8B%E8%AF%95-Mutex-%E7%9A%84-WaitOne-%E6%98%AF%E5%90%A6%E4%BF%9D%E6%8C%81%E8%BF%9B%E5%85%A5%E7%AD%89%E5%BE%85%E7%9A%84%E9%A1%BA%E5%BA%8F%E5%85%88%E8%BF%9B%E5%85%88%E5%87%BA.html&quot;&gt;dotnet 测试 Mutex 的 WaitOne 是否保持进入等待的顺序先进先出&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E8%87%AA%E5%B7%B1%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5%E4%B8%8A%E4%B8%8B%E6%96%87.html&quot;&gt;C# dotnet 自己实现一个线程同步上下文&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E9%AB%98%E6%80%A7%E8%83%BD%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B7%A5%E5%85%B7-ExecuteOnceAwaiter-%E5%8F%AA%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E7%9A%84%E4%BB%BB%E5%8A%A1.html&quot;&gt;C# dotnet 高性能多线程工具 ExecuteOnceAwaiter 只执行一次的任务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-SemaphoreSlim-%E5%8F%AF%E8%83%BD%E7%9A%84%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2.html&quot;&gt;dotnet 使用 SemaphoreSlim 可能的内存泄露&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E9%AB%98%E6%80%A7%E8%83%BD%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B7%A5%E5%85%B7-AsyncAutoResetEvent-%E5%BC%82%E6%AD%A5%E7%AD%89%E5%BE%85%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E5%92%8C%E5%8E%9F%E7%90%86.html&quot;&gt;C# dotnet 高性能多线程工具 AsyncAutoResetEvent 异步等待使用方法和原理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E7%BA%BF%E7%A8%8B%E4%B8%8D%E5%AE%89%E5%85%A8%E7%9A%84%E5%BC%B1%E5%BC%95%E7%94%A8%E7%BC%93%E5%AD%98.html&quot;&gt;C# dotnet 线程不安全的弱引用缓存&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%B0%86-Begin-%E5%92%8C-End-%E5%BC%82%E6%AD%A5%E6%96%B9%E6%B3%95%E8%BD%AC-task-%E5%BC%82%E6%AD%A5.html&quot;&gt;C# 将 Begin 和 End 异步方法转 task 异步&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%BD%BF%E7%94%A8-TaskCompletionSource-%E8%AE%A9%E4%BA%8B%E4%BB%B6%E8%BD%AC%E5%BC%82%E6%AD%A5%E6%96%B9%E6%B3%95.html&quot;&gt;C# dotnet 使用 TaskCompletionSource 让事件转异步方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%BA%BF%E7%A8%8B%E9%9D%99%E6%80%81%E5%AD%97%E6%AE%B5.html&quot;&gt;dotnet 线程静态字段&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%B0%A8%E6%85%8E%E5%9C%A8%E9%9D%99%E6%80%81%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E9%87%8C%E4%BD%BF%E7%94%A8%E9%94%81.html&quot;&gt;dotnet 谨慎在静态构造函数里使用锁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-Thread.GetCurrentProcessorId-%E5%92%8C-CurrentProcess.Id-%E7%9A%84%E5%8C%BA%E5%88%AB.html&quot;&gt;C# dotnet Thread.GetCurrentProcessorId 和 CurrentProcess.Id 的区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%A4%E6%96%AD%E7%89%B9%E5%AE%9A%E8%BF%9B%E7%A8%8B%E5%AD%98%E5%9C%A8%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 判断特定进程存在方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E8%BF%9B%E7%A8%8B%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 获取当前进程方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E9%9B%86%E5%90%88%E7%9A%84-Linq-%E8%8E%B7%E5%8F%96%E5%80%BC%E5%90%8C%E6%97%B6%E5%86%99%E5%85%A5%E9%9B%86%E5%90%88%E5%B0%86%E4%BC%9A%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet C# 多线程集合的 Linq 获取值同时写入集合将会抛出异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-Task.Run-%E5%92%8C-Task.Factory.StartNew-%E5%8C%BA%E5%88%AB.html&quot;&gt;C# Task.Run 和 Task.Factory.StartNew 区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AD%A6%E6%83%95-Task-%E7%9A%84-ContinueWith-%E5%B8%A6%E4%B8%8A-OnlyOnFaulted-%E5%8F%82%E6%95%B0%E6%8A%9B%E5%87%BA%E5%8F%96%E6%B6%88%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet 警惕 Task 的 ContinueWith 带上 OnlyOnFaulted 参数抛出取消异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-TaskTupleAwaiter-%E5%90%8C%E6%97%B6%E7%AD%89%E5%BE%85%E5%A4%9A%E4%B8%AA%E4%BB%BB%E5%8A%A1%E7%AE%80%E5%8C%96%E4%BB%A3%E7%A0%81%E5%86%99%E6%B3%95.html&quot;&gt;dotnet 使用 TaskTupleAwaiter 同时等待多个任务简化代码写法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%9A%84-TaskCompletionSource-%E7%9A%84-TrySetResult-%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8.html&quot;&gt;dotnet 的 TaskCompletionSource 的 TrySetResult 是线程安全&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%B0-TaskCompletionSource-%E7%9A%84-SetException-%E5%8F%AF%E8%83%BD%E5%B0%86%E5%BC%82%E5%B8%B8%E8%AE%B0%E5%BD%95%E5%88%B0-UnobservedTaskException-%E7%9A%84%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet 记 TaskCompletionSource 的 SetException 可能将异常记录到 UnobservedTaskException 的问题&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;多进程&quot;&gt;多进程&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E5%88%9B%E5%BB%BA%E8%BF%9B%E7%A8%8B-Process.Start-%E6%97%B6%E8%AE%BE%E7%BD%AE-UseShellExecute-%E5%9C%A8-Windows-%E4%B8%8B%E5%AF%B9%E6%80%A7%E8%83%BD%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;dotnet 6 创建进程 Process.Start 时设置 UseShellExecute 在 Windows 下对性能的影响&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;多进程通讯&quot;&gt;多进程通讯&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E6%8E%A8%E8%8D%90%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A3%E6%9B%BF-.NET-Remoting-%E7%9A%84-IPC-%E5%BA%93.html&quot;&gt;dotnet 6 推荐一个可代替 .NET Remoting 的 IPC 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%8E%A8%E8%8D%90%E4%B8%80%E4%B8%AA%E4%BD%BF%E7%94%A8-Json-%E7%9B%B4%E6%8E%A5%E8%B7%AF%E7%94%B1%E9%80%9A%E8%AE%AF%E7%9A%84-IPC-%E5%BA%93.html&quot;&gt;dotnet 推荐一个使用 Json 直接路由通讯的 IPC 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-MVC-%E7%9A%84%E6%96%B9%E5%BC%8F%E6%89%93%E5%BC%80-IPC-%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93.html&quot;&gt;dotnet 用 MVC 的方式打开 IPC 命名管道&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%95%99%E4%BD%A0%E5%86%99%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A5%E6%90%9E%E7%82%B8%E6%9C%AC%E6%9C%BA%E6%89%80%E6%9C%89-WCF-%E5%BA%94%E7%94%A8%E7%9A%84%E7%A8%8B%E5%BA%8F%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 教你写一个可以搞炸本机所有 WCF 应用的程序方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dot-net-core-%E4%BD%BF%E7%94%A8-IPC-%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1.html&quot;&gt;dot net core 使用 IPC 进程通信&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;性能优化&quot;&gt;性能优化&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%BB%8E%E5%90%8E%E5%90%91%E5%89%8D%E5%88%A0%E9%99%A4%E5%88%97%E8%A1%A8%E5%85%83%E7%B4%A0%E6%8F%90%E5%8D%87%E6%80%A7%E8%83%BD%E7%9A%84%E5%8E%9F%E7%90%86.html&quot;&gt;C# dotnet 从后向前删除列表元素提升性能的原理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%BD%BF%E7%94%A8-startIndex-%E6%8F%90%E5%8D%87-IndexOf-%E7%9A%84%E6%80%A7%E8%83%BD.html&quot;&gt;C# dotnet 使用 startIndex 提升 IndexOf 的性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-7.2-%E9%80%9A%E8%BF%87-in-%E5%92%8C-readonly-struct-%E5%87%8F%E5%B0%91%E6%96%B9%E6%B3%95%E5%80%BC%E5%A4%8D%E5%88%B6%E6%8F%90%E9%AB%98%E6%80%A7%E8%83%BD.html&quot;&gt;C# 7.2 通过 in 和 readonly struct 减少方法值复制提高性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-Span-%E5%85%A5%E9%97%A8.html&quot;&gt;C# Span 入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-ValueTask-%E7%AE%80%E5%8D%95%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet ValueTask 简单入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Interlocked-%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E6%97%A0%E9%94%81%E7%9A%84%E5%BF%AB%E9%80%9F%E6%97%A0%E5%BA%8F%E4%BB%85%E5%86%99%E9%9B%86%E5%90%88.html&quot;&gt;dotnet 使用 Interlocked 实现一个无锁的快速无序仅写集合&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96-%E5%88%A9%E7%94%A8%E5%93%88%E5%B8%8C%E6%80%9D%E6%83%B3%E4%BC%98%E5%8C%96%E5%A4%A7%E5%AF%B9%E8%B1%A1%E9%9B%86%E5%90%88%E7%9B%B8%E7%AD%89%E5%88%A4%E6%96%AD%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 性能优化 利用哈希思想优化大对象集合相等判断性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8%E6%97%A0%E6%8D%95%E8%8E%B7%E7%9A%84%E5%A7%94%E6%89%98%E5%8F%AF%E4%BB%A5%E8%8E%B7%E5%BE%97%E7%BC%96%E8%AF%91%E5%99%A8%E7%BC%93%E5%AD%98%E5%87%8F%E5%B0%91%E5%AF%B9%E8%B1%A1%E5%88%9B%E5%BB%BA.html&quot;&gt;dotnet C# 使用无捕获的委托可以获得编译器缓存减少对象创建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-EqualityComparer-%E6%8F%90%E5%8D%87%E6%B3%9B%E5%9E%8B%E5%80%BC%E7%B1%BB%E5%9E%8B%E7%9B%B8%E7%AD%89%E5%88%A4%E6%96%AD%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet C# 使用 EqualityComparer 提升泛型值类型相等判断性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AF%B9%E6%8C%87%E9%92%88%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%BB%93%E6%9E%84%E4%BD%93%E5%A4%9A%E4%B8%AA%E4%B8%8D%E5%90%8C%E6%96%B9%E6%B3%95%E7%9A%84%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90.html&quot;&gt;dotnet 对指针转换为结构体多个不同方法的性能分析&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-ToUpperInvariant-%E6%9B%BF%E6%8D%A2-ToUpper-%E4%BB%A5%E9%81%BF%E5%85%8D%E5%88%9D%E5%A7%8B%E5%8C%96-icu-%E8%BF%87%E6%85%A2.html&quot;&gt;dotnet 使用 ToUpperInvariant 替换 ToUpper 以避免初始化 icu 过慢&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;网络&quot;&gt;网络&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E4%B8%8D%E8%B7%9F%E9%9A%8F%E7%B3%BB%E7%BB%9F%E7%BD%91%E7%BB%9C%E4%BB%A3%E7%90%86%E5%8F%98%E5%8C%96%E8%80%8C%E5%8A%A8%E6%80%81%E5%88%87%E6%8D%A2%E4%BB%A3%E7%90%86.html&quot;&gt;dotnet 6 为什么网络请求不跟随系统网络代理变化而动态切换代理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-HttpClientHandler-%E5%92%8C-SocketsHttpHandler-%E6%9C%89%E4%BB%80%E4%B9%88%E5%B7%AE%E5%88%AB.html&quot;&gt;dotnet 6 HttpClientHandler 和 SocketsHttpHandler 有什么差别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%98%AF%E5%90%A6%E5%BA%94%E8%AF%A5%E5%AF%B9-HttpResponseMessage-%E8%B0%83%E7%94%A8-Dispose-%E8%BF%9B%E8%A1%8C%E9%87%8A%E6%94%BE.html&quot;&gt;dotnet 是否应该对 HttpResponseMessage 调用 Dispose 进行释放&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-HttpWebRequest-%E8%BF%9B%E8%A1%8C-POST-%E6%96%87%E4%BB%B6%E5%B0%86%E5%8D%A0%E7%94%A8%E5%A4%A7%E9%87%8F%E5%86%85%E5%AD%98.html&quot;&gt;dotnet 6 使用 HttpWebRequest 进行 POST 文件将占用大量内存&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-HttpClient-%E7%9A%84%E8%B6%85%E6%97%B6%E6%9C%BA%E5%88%B6.html&quot;&gt;dotnet 6 使用 HttpClient 的超时机制&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E7%B2%BE%E7%BB%86%E6%8E%A7%E5%88%B6-HttpClient-%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E8%B6%85%E6%97%B6.html&quot;&gt;dotnet 6 精细控制 HttpClient 网络请求超时&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E5%9C%A8-Win7-%E7%B3%BB%E7%BB%9F%E8%AF%81%E4%B9%A6%E9%93%BE%E9%94%99%E8%AF%AF%E5%AF%BC%E8%87%B4-HttpWebRequest-%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2.html&quot;&gt;dotnet 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/NewLife-%E7%9A%84-RocketMQ-%E7%9A%84%E7%94%9F%E4%BA%A7%E8%80%85%E6%AF%8F%E6%AC%A1%E9%83%BD%E6%98%AF%E6%96%B0%E5%AE%9E%E4%BE%8B%E5%B0%86%E5%8F%AA%E7%94%B1%E4%B8%80%E4%B8%AA%E6%B6%88%E8%B4%B9%E8%80%85%E6%B6%88%E8%B4%B9.html&quot;&gt;NewLife 的 RocketMQ 的生产者每次都是新实例将只由一个消费者消费&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A6%82%E4%BD%95%E4%B8%8D%E8%81%94%E7%BD%91%E4%B8%8B%E5%BF%AB%E9%80%9F%E8%8E%B7%E5%8F%96%E4%B8%80%E6%AE%B5url%E9%93%BE%E6%8E%A5%E9%87%8C%E9%9D%A2%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E5%90%8D.html&quot;&gt;dotnet C# 如何不联网下快速获取一段url链接里面读取文件名&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-core-%E5%B1%80%E5%9F%9F%E7%BD%91%E7%BB%84%E6%92%AD%E6%96%B9%E6%B3%95.html&quot;&gt;C# dotnet core 局域网组播方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E8%8E%B7%E5%8F%96%E6%95%B4%E4%B8%AA%E5%B1%80%E5%9F%9F%E7%BD%91%E7%9A%84-ip-%E5%9C%B0%E5%9D%80.html&quot;&gt;C# dotnet 获取整个局域网的 ip 地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E8%8E%B7%E5%8F%96%E6%9C%AC%E6%9C%BA%E5%A4%96%E7%BD%91-IP-%E5%9C%B0%E5%9D%80.html&quot;&gt;dotnet C# 获取本机外网 IP 地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E8%8E%B7%E5%8F%96-MacAddress-%E5%9C%B0%E5%9D%80%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet core 获取 MacAddress 地址方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-HttpClient-%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E5%90%8C%E6%97%B6%E6%8A%A5%E5%91%8A%E8%BF%9B%E5%BA%A6%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 通过 HttpClient 下载文件同时报告进度的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%85%B3%E4%BA%8E%E5%A4%9A%E4%B8%AA-Cookie-%E7%9A%84%E5%88%86%E9%9A%94%E7%AC%A6%E8%BF%99%E4%BB%B6%E4%BA%8B.html&quot;&gt;关于多个 Cookie 的分隔符这件事&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%BC%80%E5%90%AF-Fiddler-%E6%8A%93%E5%8C%85%E5%B0%86%E4%BC%9A%E8%AE%A9%E8%AF%B7%E6%B1%82-HOST-%E5%A4%B4%E8%A2%AB%E6%9B%B4%E6%94%B9.html&quot;&gt;dotnet 开启 Fiddler 抓包将会让请求 HOST 头被更改&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3-System.Net.Sockets.SocketException-10106-%E6%97%A0%E6%B3%95%E5%8A%A0%E8%BD%BD%E6%88%96%E5%88%9D%E5%A7%8B%E5%8C%96%E8%AF%B7%E6%B1%82%E7%9A%84%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E7%A8%8B%E5%BA%8F-%E6%97%A0%E6%B3%95%E8%81%94%E7%BD%91.html&quot;&gt;解决 System.Net.Sockets.SocketException 10106 无法加载或初始化请求的服务提供程序 无法联网&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3-System.Net.Sockets.SocketException-10045-%E5%8F%82%E8%80%83%E7%9A%84%E5%AF%B9%E8%B1%A1%E7%B1%BB%E5%9E%8B%E4%B8%8D%E6%94%AF%E6%8C%81%E5%B0%9D%E8%AF%95%E7%9A%84%E6%93%8D%E4%BD%9C-%E6%97%A0%E6%B3%95%E8%81%94%E7%BD%91.html&quot;&gt;解决 System.Net.Sockets.SocketException 10045 参考的对象类型不支持尝试的操作 无法联网&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E4%B8%8D%E8%87%AA%E5%8A%A8%E4%BB%8E-https-%E5%88%B0-http-%E7%9A%84-302-%E9%87%8D%E5%AE%9A%E5%90%91.html&quot;&gt;dotnet core 不自动从 https 到 http 的 302 重定向&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet6-C-%E4%B8%80%E4%B8%AA%E5%9B%BD%E5%86%85%E8%BF%98%E8%83%BD%E7%94%A8%E7%9A%84-NTP-%E6%97%B6%E9%97%B4%E6%A0%A1%E5%87%86%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E5%AE%9E%E7%8E%B0.html&quot;&gt;dotnet6 C# 一个国内还能用的 NTP 时间校准客户端的实现&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%85%A5%E9%97%A8%E7%A4%BA%E4%BE%8B-%E7%94%A8%E5%BA%95%E5%B1%82%E7%9A%84-Socket-%E8%BF%9B%E8%A1%8C-HTTP-%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82.html&quot;&gt;dotnet C# 入门示例 用底层的 Socket 进行 HTTP 网络请求&lt;/a&gt;
&lt;!-- [dotnet C# 入门示例 用底层的 Socket 进行 HTTP 网络请求 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18932217 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;文件读写&quot;&gt;文件读写&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E5%8A%A1%E5%BF%85%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.html&quot;&gt;dotnet 文件读写务必注意事项&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E7%AE%80%E5%8D%95%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6.html&quot;&gt;C# 简单读取文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%BD%BF%E7%94%A8-FileStream-%E9%9A%8F%E6%9C%BA%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99.html&quot;&gt;C# dotnet 使用 FileStream 随机文件读写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%BD%BF%E7%94%A8%E5%88%A4%E6%96%AD%E6%96%87%E4%BB%B6%E5%A4%B9%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%B9%E6%B3%95%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E4%BC%9A%E6%80%8E%E6%A0%B7.html&quot;&gt;C# dotnet 使用判断文件夹存在的方法判断一个文件路径会怎样&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E4%B8%8D%E8%83%BD%E7%94%A8%E4%BA%8E%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E5%AD%97%E7%AC%A6.html&quot;&gt;C# 不能用于文件名的字符&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E5%B0%86-Stream-%E4%BF%9D%E5%AD%98%E5%88%B0%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;C# dotnet 将 Stream 保存到文件的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%A4%B9%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 删除文件夹方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B0%86%E6%96%87%E4%BB%B6%E5%88%A0%E9%99%A4%E5%88%B0%E5%9B%9E%E6%94%B6%E7%AB%99.html&quot;&gt;dotnet 将文件删除到回收站&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%A0%E9%99%A4%E5%8F%AA%E8%AF%BB%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 删除只读文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E8%BD%AC%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84.html&quot;&gt;C＃ 相对路径转绝对路径&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AD%A6%E6%83%95%E5%88%A4%E6%96%AD%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E5%9B%A0%E4%B8%BA%E6%A3%80%E6%9F%A5%E7%BD%91%E7%BB%9C%E8%B5%84%E6%BA%90%E9%80%A0%E6%88%90%E8%B6%85%E9%95%BF%E7%AD%89%E5%BE%85.html&quot;&gt;dotnet 警惕判断文件是否存在因为检查网络资源造成超长等待&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%88%A4%E6%96%AD%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81.html&quot;&gt;C＃ 判断文件编码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%88%A4%E6%96%AD%E6%96%87%E4%BB%B6%E5%B1%9E%E4%BA%8E%E6%96%87%E6%9C%AC%E6%88%96%E4%BA%8C%E8%BF%9B%E5%88%B6.html&quot;&gt;C＃判断文件属于文本或二进制&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;平台调用&quot;&gt;平台调用&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-CsWin32-%E5%BA%93%E7%AE%80%E5%8C%96-Win32-%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E9%80%BB%E8%BE%91.html&quot;&gt;dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%8E%A8%E8%8D%90%E5%AE%98%E6%96%B9%E5%BC%80%E6%BA%90-PInvoke-%E5%BA%93-%E5%8C%85%E5%90%AB%E5%A4%A7%E9%87%8F-win32-%E5%B0%81%E8%A3%85.html&quot;&gt;推荐官方开源 PInvoke 库 包含大量 win32 封装&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-Win32-%E5%87%BD%E6%95%B0%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E8%B7%AF%E5%BE%84%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet C# 使用 Win32 函数获取用户下载文件夹的路径的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%BC%94%E7%BB%83-dotnet-%E4%BD%BF%E7%94%A8-GeneratedComInterface-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E6%96%B9%E5%BC%8F%E8%B0%83%E7%94%A8-COM-%E6%8E%A5%E5%8F%A3.html&quot;&gt;演练 dotnet 使用 GeneratedComInterface 源代码生成方式调用 COM 接口&lt;/a&gt;
&lt;!-- [演练 dotnet 使用 GeneratedComInterface 源代码生成方式调用 COM 接口 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18684914 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%BC%94%E7%BB%83-dotnet-%E4%BD%BF%E7%94%A8-%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88-%E8%B0%83%E7%94%A8-COM-%E6%8E%A5%E5%8F%A3.html&quot;&gt;演练 dotnet 使用 函数指针 调用 COM 接口&lt;/a&gt;
&lt;!-- [演练 dotnet 使用 函数指针 调用 COM 接口 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18684913 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;原理博客&quot;&gt;原理博客&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%8E%A2%E7%B4%A2-dotnet-core-%E4%B8%BA%E4%BD%95%E5%9C%A8-Windows7-%E7%B3%BB%E7%BB%9F%E9%9C%80%E8%A6%81%E8%A1%A5%E4%B8%81%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;探索 dotnet core 为何在 Windows7 系统需要补丁的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%BA%94%E7%94%A8%E6%98%AF%E5%A6%82%E4%BD%95%E8%B7%91%E8%B5%B7%E6%9D%A5%E7%9A%84-%E9%80%9A%E8%BF%87AppHost%E7%90%86%E8%A7%A3%E8%BF%90%E8%A1%8C%E8%BF%87%E7%A8%8B.html&quot;&gt;dotnet core 应用是如何跑起来的 通过AppHost理解运行过程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-dotnet-%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%9C%A8%E5%86%85%E5%AD%98%E6%98%AF%E5%A6%82%E4%BD%95%E5%AD%98%E6%94%BE.html&quot;&gt;读书笔记 dotnet 的字符串在内存是如何存放&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%BA%94%E7%94%A8%E6%98%AF%E5%A6%82%E4%BD%95%E8%B7%91%E8%B5%B7%E6%9D%A5%E7%9A%84-%E9%80%9A%E8%BF%87%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA-dotnet-host-%E7%90%86%E8%A7%A3%E8%BF%90%E8%A1%8C%E8%BF%87%E7%A8%8B.html&quot;&gt;dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-CLR-%E8%81%8A%E8%81%8A%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80-%E4%B8%80%E4%B8%AA%E7%A9%BA%E5%AF%B9%E8%B1%A1%E5%8D%A0%E7%94%A8%E5%A4%9A%E5%B0%91%E5%86%85%E5%AD%98.html&quot;&gt;C# CLR 聊聊对象的内存布局 一个空对象占用多少内存&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-dotnet-%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E8%BF%9B%E8%A1%8C%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6.html&quot;&gt;读书笔记 dotnet 什么时候进行垃圾回收&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-ConditionalWeakTable-%E7%9A%84%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86.html&quot;&gt;dotnet ConditionalWeakTable 的底层原理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-dotnet-%E5%A4%A7%E5%AF%B9%E8%B1%A1%E5%A0%86%E5%92%8C%E5%B0%8F%E5%AF%B9%E8%B1%A1%E5%A0%86.html&quot;&gt;读书笔记 dotnet 大对象堆和小对象堆&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E9%BB%91%E7%A7%91%E6%8A%80-String.IndexOf-%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet core 黑科技·String.IndexOf 性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-5-%E4%BB%8E-IL-%E5%B1%82%E9%9D%A2%E5%88%86%E6%9E%90%E5%8D%8F%E5%8F%98%E8%BF%94%E5%9B%9E%E7%B1%BB%E5%9E%8B%E6%96%B0%E7%89%B9%E6%80%A7.html&quot;&gt;dotnet 5 从 IL 层面分析协变返回类型新特性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E4%BB%A3%E7%A0%81%E5%8D%A0%E7%94%A8%E7%9A%84%E7%A9%BA%E9%97%B4.html&quot;&gt;C# 代码占用的空间&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-ValueTuple-%E5%8E%9F%E7%90%86.html&quot;&gt;C# ValueTuple 原理&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;设计规范&quot;&gt;设计规范&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83.html&quot;&gt;dotnet core 编程规范&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83-%E6%95%B0%E7%BB%84%E5%AE%9A%E4%B9%89.html&quot;&gt;dotnet 设计规范 · 数组定义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83-%E6%8A%BD%E8%B1%A1%E5%AE%9A%E4%B9%89.html&quot;&gt;dotnet 设计规范 · 抽象定义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83-%E6%8A%BD%E8%B1%A1%E7%B1%BB.html&quot;&gt;dotnet 设计规范 · 抽象类&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83-%E7%BB%93%E6%9E%84%E4%BD%93%E5%AE%9A%E4%B9%89.html&quot;&gt;dotnet 设计规范 · 结构体定义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%96%B9%E6%B3%95%E5%90%8D-To-%E5%92%8C-As-%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C.html&quot;&gt;dotnet 方法名 To 和 As 有什么不同&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E5%BB%BA%E8%AE%AE%E5%AF%B9%E4%BB%BB%E6%84%8F%E7%9A%84-IEnumerable-%E5%8F%8D%E8%BD%AC.html&quot;&gt;C# 为什么不建议对任意的 IEnumerable 反转&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BC%80%E6%BA%90%E7%9A%84%E8%BF%90%E8%A1%8C%E6%97%B6%E4%BB%93%E5%BA%93%E4%BB%A3%E7%A0%81%E5%87%8F%E5%B0%91%E4%BD%BF%E7%94%A8-Linq-%E8%AF%AD%E5%8F%A5.html&quot;&gt;dotnet 为什么开源的运行时仓库代码减少使用 Linq 语句&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;工具方法&quot;&gt;工具方法&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%89%BE%E5%88%B0%E5%8D%9A%E5%AE%A2%E4%B8%AD%E5%BC%95%E7%94%A8%E5%B7%B2%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%93%BE%E6%8E%A5%E5%9C%B0%E5%9D%80.html&quot;&gt;dotnet 找到博客中引用已失败的链接地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E8%8E%B7%E5%8F%96%E6%9F%90%E4%B8%AA%E5%AD%97%E7%AC%A6%E6%89%80%E5%9C%A8-Unicode-%E5%AD%97%E7%AC%A6%E5%B9%B3%E9%9D%A2%E6%98%A0%E5%B0%84.html&quot;&gt;C# dotnet 获取某个字符所在 Unicode 字符平面映射&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8-C-%E5%86%99%E8%84%9A%E6%9C%AC-%E5%A6%82%E4%BD%95%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E5%86%85%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%90%8D.html&quot;&gt;用 C# 写脚本 如何输出文件夹内所有文件名&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%BF%9B%E8%A1%8C%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%B7%AE%E5%88%86%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 进行二进制差分压缩文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E7%AE%80%E5%8D%95%E7%9A%84%E8%BF%BD%E5%8A%A0%E6%96%87%E4%BB%B6%E5%A4%B9%E5%88%B0-ZipArchive-%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet C# 简单的追加文件夹到 ZipArchive 压缩文件的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E9%99%84%E5%8A%A0%E5%B1%9E%E6%80%A7%E5%AE%9A%E4%B9%89-%E6%94%AF%E6%8C%81%E9%99%84%E5%8A%A0%E4%BB%BB%E6%84%8F%E7%B1%BB%E5%9E%8B.html&quot;&gt;C# dotnet 创建对象附加属性定义 支持附加任意类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E5%88%86%E5%89%B2%E6%8D%A2%E8%A1%8C.html&quot;&gt;C# dotnet 分割换行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-dotnetCampus.YamlToCsharp-%E5%B0%86-YAML-%E5%A4%9A%E8%AF%AD%E8%A8%80%E6%96%87%E4%BB%B6%E6%9E%84%E5%BB%BA%E4%B8%BA%E4%BB%A3%E7%A0%81.html&quot;&gt;dotnet 通过 dotnetCampus.YamlToCsharp 将 YAML 多语言文件构建为代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%B8%80%E4%B8%AA%E7%9C%8B%E4%B8%8A%E5%8E%BB%E8%BF%98%E8%83%BD%E7%94%A8%E7%9A%84%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%BA%8F%E5%88%97%E5%8C%96%E5%B8%AE%E5%8A%A9%E7%B1%BB.html&quot;&gt;C# dotnet 一个看上去还能用的二进制序列化帮助类&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-WeakLazy-%E5%BC%B1%E5%BC%95%E7%94%A8%E7%9A%84%E5%BB%B6%E8%BF%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95.html&quot;&gt;C# dotnet WeakLazy 弱引用的延迟初始化实现方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E9%AD%94%E6%B3%95%E4%B9%A6.html&quot;&gt;dotnet 动态代理魔法书&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E8%A7%A3%E6%9E%90-sln-%E6%96%87%E4%BB%B6.html&quot;&gt;C＃ 解析 sln 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0-sln-%E5%92%8C-slnx-%E4%B8%A4%E4%B8%AA%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E4%BA%92%E8%BD%AC.html&quot;&gt;简单实现 sln 和 slnx 两个解决方案文件格式互转&lt;/a&gt;
&lt;!-- [简单实现 sln 和 slnx 两个解决方案文件格式互转 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18782265 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E9%87%91%E9%A2%9D%E8%BD%AC%E4%B8%AD%E6%96%87%E5%A4%A7%E5%86%99.html&quot;&gt;C# 金额转中文大写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%8D%E7%94%B3%E8%AF%B7%E9%A2%9D%E5%A4%96%E6%95%B0%E7%BB%84%E7%A9%BA%E9%97%B4%E5%90%88%E5%B9%B6%E5%A4%9A%E4%B8%AA%E5%8F%AA%E8%AF%BB%E6%95%B0%E7%BB%84%E5%88%97%E8%A1%A8.html&quot;&gt;dotnet 不申请额外数组空间合并多个只读数组列表&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-C-%E7%88%AC%E8%99%AB%E8%8E%B7%E5%BE%97%E4%B8%93%E6%A0%8F%E5%8D%9A%E5%AE%A2%E6%9B%B4%E6%96%B0%E6%8E%92%E8%A1%8C.html&quot;&gt;如何使用 C# 爬虫获得专栏博客更新排行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%9E%9A%E4%B8%BE%E5%BD%93%E5%89%8D%E8%AE%BE%E5%A4%87wifi%E7%83%AD%E7%82%B9.html&quot;&gt;dotnet 枚举当前设备wifi热点&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AF%B9-DateTime-%E6%8E%92%E5%BA%8F.html&quot;&gt;dotnet 对 DateTime 排序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%8E%B7%E5%8F%96%E6%9C%AC%E6%9C%BA-IP-%E5%9C%B0%E5%9D%80%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 获取本机 IP 地址方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dot-net-double-%E6%95%B0%E7%BB%84%E8%BD%AC-float-%E6%95%B0%E7%BB%84.html&quot;&gt;dot net double 数组转 float 数组&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E4%BB%8E-short-%E8%BD%AC-byte-%E6%96%B9%E6%B3%95.html&quot;&gt;C# 从 short 转 byte 方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-16-%E8%BF%9B%E5%88%B6%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC-int.html&quot;&gt;C# 16 进制字符串转 int &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%AF%B9-byte-%E6%95%B0%E7%BB%84%E8%BF%9B%E8%A1%8C%E6%A8%A1%E5%BC%8F%E6%90%9C%E7%B4%A2.html&quot;&gt;C# 对 byte 数组进行模式搜索&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%BF%AB%E9%80%9F%E9%87%8A%E6%94%BE%E5%86%85%E5%AD%98%E7%9A%84%E5%A4%A7%E6%95%B0%E7%BB%84.html&quot;&gt;C# 快速释放内存的大数组&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%A4%8D%E5%88%B6%E5%88%97%E8%A1%A8.html&quot;&gt;C# 复制列表&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%A4%A7%E7%AB%AF%E5%B0%8F%E7%AB%AF%E8%BD%AC%E6%8D%A2.html&quot;&gt;C# 大端小端转换&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%9F%BA%E4%BA%8E-INotifyPropertyChanged-%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA-CLR-%E5%B1%9E%E6%80%A7%E7%BB%91%E5%AE%9A%E8%BE%85%E5%8A%A9%E7%B1%BB.html&quot;&gt;dotnet C# 基于 INotifyPropertyChanged 实现一个 CLR 属性绑定辅助类&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%AE%9E%E7%8E%B0-GetHashCode-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet C# 实现 GetHashCode 的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E7%B3%BB%E7%BB%9F%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet 制作一个简单的自动更新系统日期时间工具&lt;/a&gt;
&lt;!-- [dotnet 制作一个简单的自动更新系统日期时间工具 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19344403 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8%E6%96%B0%E8%BF%9B%E7%A8%8B%E6%89%A7%E8%A1%8C%E6%9F%90%E6%AE%B5%E5%A7%94%E6%89%98%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 在新进程执行某段委托的方法&lt;/a&gt;
&lt;!-- [dotnet 在新进程执行某段委托的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19630685 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9F%BA%E4%BA%8E-FFmpeg-%E5%AE%9E%E7%8E%B0%E5%9B%BE%E7%89%87%E5%8A%A0%E5%A4%9A%E9%9F%B3%E9%A2%91%E6%89%B9%E9%87%8F%E5%90%88%E6%88%90%E8%A7%86%E9%A2%91%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 基于 FFmpeg 实现图片加多音频批量合成视频方法&lt;/a&gt;
&lt;!-- [dotnet 基于 FFmpeg 实现图片加多音频批量合成视频方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19998655 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;已知问题&quot;&gt;已知问题&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AD%A6%E6%83%95-C-%E7%9A%84-is-var-%E5%86%99%E6%B3%95.html&quot;&gt;dotnet 警惕 C# 的 is var 写法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AD%A6%E6%83%95%E4%BD%BF%E7%94%A8-StackTrace-%E5%8A%A0%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95%E6%A0%87%E8%AE%B0-Attribute-%E7%89%B9%E6%80%A7%E5%9C%A8-Release-%E4%B8%8B%E8%A2%AB%E5%86%85%E8%81%94.html&quot;&gt;dotnet 警惕使用 StackTrace 加获取方法标记 Attribute 特性在 Release 下被内联&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8-ThreadLocal-%E4%B9%9F%E8%AE%B8%E4%BC%9A%E6%8A%9B%E5%87%BA%E5%AF%B9%E6%96%B9%E5%B7%B2%E9%87%8A%E6%94%BE.html&quot;&gt;dotnet 在析构函数调用 ThreadLocal 也许会抛出对方已释放&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-NamedPipeClientStream-%E8%BF%9E%E6%8E%A5%E4%B8%80%E4%B8%AA%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%AE%A1%E9%81%93%E6%9C%8D%E5%8A%A1%E5%90%8D%E5%B0%86%E4%B8%8D%E6%96%AD%E7%A9%BA%E8%B7%91-CPU-%E8%B5%84%E6%BA%90.html&quot;&gt;dotnet 使用 NamedPipeClientStream 连接一个不存在管道服务名将不断空跑 CPU 资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%BF%9B%E7%A8%8B%E5%88%9B%E5%BB%BA%E5%A4%AA%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B0%86%E4%BC%9A%E6%8A%9B%E5%87%BA-OutOfMemoryException-%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet C# 应用程序进程创建太多线程将会抛出 OutOfMemoryException 异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E4%BD%BF%E7%94%A8-Directory.EnumerateXXX-%E6%96%B9%E6%B3%95%E6%9E%9A%E4%B8%BE-C-%E7%9B%98%E6%A0%B9%E8%B7%AF%E5%BE%84%E5%8F%AF%E8%83%BD%E9%94%99%E8%AF%AF%E7%9A%84%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet 已知问题 使用 Directory.EnumerateXXX 方法枚举 C 盘根路径可能错误的问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-ManualResetEventSlim-%E7%9A%84-Set-%E6%96%B9%E6%B3%95%E6%8A%9B%E5%87%BA%E7%A9%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet 6 已知问题 ManualResetEventSlim 的 Set 方法抛出空异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AD%A6%E6%83%95-async-void-%E7%BA%BF%E7%A8%8B%E9%A1%B6%E5%B1%82%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet 警惕 async void 线程顶层异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E5%9C%A8-win7-%E7%B3%BB%E7%BB%9F-AES-CFB-%E6%8A%9B%E5%87%BA%E4%B8%8D%E6%94%AF%E6%8C%81%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet 6 在 win7 系统 AES CFB 抛出不支持异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E9%94%99%E8%AF%AF%E6%A0%87%E8%AE%B0-MethodImplOptions.InternalCall-%E7%89%B9%E6%80%A7%E5%8F%82%E6%95%B0%E5%B0%86%E4%BC%9A%E5%9C%A8%E7%B1%BB%E5%9E%8B%E8%AE%BF%E9%97%AE%E4%B9%8B%E5%89%8D%E6%8A%9B%E5%87%BA-TypeLoadException-%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet 已知问题 错误标记 MethodImplOptions.InternalCall 特性参数将会在类型访问之前抛出 TypeLoadException 异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E8%AD%A6%E6%83%95-StreamReader-%E7%9A%84-EndOfStream-%E5%8D%A1%E4%BD%8F%E7%BA%BF%E7%A8%8B.html&quot;&gt;dotnet 已知问题 警惕 StreamReader 的 EndOfStream 卡住线程&lt;/a&gt;
&lt;!-- [dotnet 已知问题 警惕 StreamReader 的 EndOfStream 卡住线程 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18397603 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AD%A6%E6%83%95%E8%AE%BE%E7%BD%AE-StreamReader-%E7%9A%84-BaseStream-%E7%9A%84-Position-%E5%B1%9E%E6%80%A7.html&quot;&gt;dotnet 警惕设置 StreamReader 的 BaseStream 的 Position 属性&lt;/a&gt;
&lt;!-- [dotnet 警惕设置 StreamReader 的 BaseStream 的 Position 属性 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18835047 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-QEMU-%E8%AE%A9-dotnet-6-%E7%A8%8B%E5%BA%8F%E6%8A%9B%E5%87%BA%E7%A9%BA%E5%BC%82%E5%B8%B8%E9%97%AE%E9%A2%98.html&quot;&gt;记 QEMU 让 dotnet 6 程序抛出空异常问题&lt;/a&gt;
&lt;!-- [记 QEMU 让 dotnet 6 程序抛出空异常问题 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18863488 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-NamedPipeClientStream-%E8%BF%9E%E6%8E%A5%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%9C%A8%E5%86%85%E9%83%A8%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet 已知问题 NamedPipeClientStream 连接不存在的服务在内部抛出异常&lt;/a&gt;
&lt;!-- [dotnet 已知问题 NamedPipeClientStream 连接不存在的服务在内部抛出异常 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18990724 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;混淆&quot;&gt;混淆&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%88%A4%E6%96%AD%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E8%A2%AB%E6%B7%B7%E6%B7%86.html&quot;&gt;C＃判断文件是否被混淆&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E4%BD%BF%E7%94%A8-Obfuscar-%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86.html&quot;&gt;dotnet 6 使用 Obfuscar 进行代码混淆&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;wmi&quot;&gt;WMI&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E6%8C%87%E5%AE%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E8%BE%93%E5%85%A5%E5%91%BD%E4%BB%A4%E8%A1%8C.html&quot;&gt;dotnet 通过 WMI 获取指定进程的输入命令行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E8%AE%BE%E5%A4%87%E5%8E%82%E5%95%86.html&quot;&gt;dotnet 通过 WMI 获取设备厂商&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E8%A1%A5%E4%B8%81.html&quot;&gt;dotnet 通过 WMI 获取系统补丁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E7%9A%84%E9%A9%B1%E5%8A%A8.html&quot;&gt;dotnet 通过 WMI 获取系统安装的驱动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E7%9A%84%E6%9C%8D%E5%8A%A1.html&quot;&gt;dotnet 通过 WMI 获取系统启动的服务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet 通过 WMI 获取系统信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E6%8B%BF%E5%88%B0%E6%98%BE%E5%8D%A1%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet 通过 WMI 拿到显卡信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6.html&quot;&gt;dotnet 通过 WMI 获取系统安装软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1.html&quot;&gt;PowerShell 通过 WMI 获取系统服务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6.html&quot;&gt;PowerShell 通过 WMI 获取系统安装软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF.html&quot;&gt;PowerShell 通过 WMI 获取系统信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E4%BD%BF%E7%94%A8-WMI-%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF.html&quot;&gt;PowerShell 使用 WMI 获取信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E7%9A%84%E9%A9%B1%E5%8A%A8.html&quot;&gt;PowerShell 通过 WMI 获取系统安装的驱动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E8%AE%BE%E5%A4%87%E5%8E%82%E5%95%86.html&quot;&gt;PowerShell 通过 WMI 获取设备厂商&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E8%A1%A5%E4%B8%81.html&quot;&gt;PowerShell 通过 WMI 获取补丁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E6%8B%BF%E5%88%B0%E6%98%BE%E5%8D%A1%E4%BF%A1%E6%81%AF.html&quot;&gt;PowerShell 拿到显卡信息&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;跨平台开发&quot;&gt;跨平台开发&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-5-%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8D%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E5%9C%A8-Windows-%E7%B3%BB%E7%BB%9F-Linux-%E7%B3%BB%E7%BB%9F%E7%9A%84%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 5 判断当前程序运行在 Windows 系统 Linux 系统的简单方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%AE%89%E8%A3%85%E5%9C%A8-Redhat6-RHEL-6-%E6%88%96-CentOS-6-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet core 安装在 Redhat6 RHEL 6 或 CentOS 6 的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-Linux-%E4%B8%8B%E7%9A%84-GDI-%E5%BA%93%E5%AF%B9-EMF-%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%94%AF%E6%8C%81.html&quot;&gt;dotnet 在 Linux 下的 GDI 库对 EMF 图片格式的支持&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-XWT-%E6%9E%84%E5%BB%BA%E8%B7%A8%E5%B9%B3%E5%8F%B0%E5%AE%A2%E6%88%B7%E7%AB%AF-%E5%85%A5%E9%97%A8%E7%AF%87.html&quot;&gt;dotnet 使用 XWT 构建跨平台客户端 入门篇&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%B5%8B%E8%AF%95%E5%9C%A8-Linux-%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84-Environment.GetFolderPath-%E8%A1%8C%E4%B8%BA.html&quot;&gt;dotnet 测试在 Linux 系统上的 Environment.GetFolderPath 行为&lt;/a&gt;
&lt;!-- [dotnet 测试在 Linux 系统上的 Environment.GetFolderPath 行为 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17970814 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%B5%8B%E8%AF%95%E5%9C%A8-UOS-Linux-%E4%B8%8A%E4%BD%BF%E7%94%A8-Process-Start-%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%E7%9A%84%E8%A1%8C%E4%B8%BA.html&quot;&gt;dotnet 测试在 UOS Linux 上使用 Process Start 打开文件的行为&lt;/a&gt;
&lt;!-- [dotnet 测试在 UOS Linux 上使用 Process Start 打开文件的行为 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17985683 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%B0%E5%9C%A8-Linux-%E4%B8%8A%E6%9F%90%E4%BA%9B%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%87%E4%BB%B6%E9%95%BF%E5%BA%A6%E4%B8%BA-0-%E4%BD%86%E6%98%AF%E5%AD%98%E5%9C%A8%E5%86%85%E5%AE%B9.html&quot;&gt;dotnet 记在 Linux 上某些文件的文件长度为 0 但是存在内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%9C%A8-Linux-%E7%B3%BB%E7%BB%9F%E8%AE%BE%E7%BD%AE%E6%88%96%E8%8E%B7%E5%8F%96%E9%9F%B3%E9%87%8F%E4%BB%A5%E5%8F%8A%E5%8F%98%E6%9B%B4%E9%9F%B3%E9%87%8F%E6%94%B6%E5%88%B0%E9%80%9A%E7%9F%A5.html&quot;&gt;dotnet C# 在 Linux 系统设置或获取音量以及变更音量收到通知&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%A7%A3%E5%86%B3-Avalonia-%E5%9C%A8-OpenKylin-%E9%BA%92%E9%BA%9F%E7%B3%BB%E7%BB%9F%E8%BF%90%E8%A1%8C%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AD%97%E4%BD%93%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 解决 Avalonia 在 OpenKylin 麒麟系统运行找不到默认字体启动失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GtkSharp-%E8%8E%B7%E5%8F%96%E8%A7%A6%E6%91%B8%E5%AE%BD%E5%BA%A6%E9%AB%98%E5%BA%A6%E9%9D%A2%E7%A7%AF%E5%B0%BA%E5%AF%B8%E4%BF%A1%E6%81%AF.html&quot;&gt;GtkSharp 获取触摸宽度高度面积尺寸信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GtkSharp-%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3%E8%83%8C%E6%99%AF%E9%80%8F%E6%98%8E.html&quot;&gt;GtkSharp 设置窗口背景透明&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%AE%E5%A4%8D-Debian-%E5%AE%89%E8%A3%85-dotnet-%E5%A4%B1%E8%B4%A5-depends-on-ca-certificates.html&quot;&gt;修复 Debian 安装 dotnet 失败 depends on ca-certificates&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%A6%82%E4%BD%95-SSH-%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95-Linux-%E7%9A%84-dotnet-%E5%BA%94%E7%94%A8%E7%9A%84%E5%90%AF%E5%8A%A8.html&quot;&gt;VisualStudio 如何 SSH 远程调试 Linux 的 dotnet 应用的启动&lt;/a&gt;
&lt;!-- [VisualStudio 如何 SSH 远程调试 Linux 的 dotnet 应用的启动 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18238164 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%9C%A8-X11-%E4%B8%8B%E4%BD%BF%E7%94%A8%E8%BD%AF%E6%B8%B2%E6%9F%93%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;Avalonia 在 X11 下使用软渲染的方法&lt;/a&gt;
&lt;!-- [Avalonia 在 X11 下使用软渲染的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18317439 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E9%BE%99%E8%8A%AF%E6%97%A7%E4%B8%96%E7%95%8C%E7%9A%84-dotnet-sdk-docker-%E9%95%9C%E5%83%8F.html&quot;&gt;制作一个龙芯旧世界的 dotnet sdk docker 镜像&lt;/a&gt;
&lt;!-- [制作一个龙芯旧世界的 dotnet sdk docker 镜像 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18521578 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-8-%E7%89%88%E6%9C%AC%E4%B8%8E%E9%93%B6%E6%B2%B3%E9%BA%92%E9%BA%9FV10%E5%92%8CUOS%E7%B3%BB%E7%BB%9F%E7%9A%84-glibc-%E5%85%BC%E5%AE%B9%E6%80%A7.html&quot;&gt;dotnet 8 版本与银河麒麟V10和UOS系统的 glibc 兼容性&lt;/a&gt;
&lt;!-- [dotnet 8 版本与银河麒麟V10和UOS系统的 glibc 兼容性 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18161216 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-dotnet-campus-%E7%BB%84%E7%BB%87%E4%B8%BA%E9%80%82%E9%85%8D%E9%BE%99%E8%8A%AF%E6%89%80%E5%81%9A%E7%9A%84%E6%9B%B4%E6%94%B9.html&quot;&gt;记 dotnet campus 组织为适配龙芯所做的更改&lt;/a&gt;
&lt;!-- [记 dotnet campus 组织为适配龙芯所做的更改 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18542775 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%88%A4%E6%96%AD%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%9C%A8-Wine-%E9%87%8C%E8%BF%90%E8%A1%8C%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet C# 判断应用程序在 Wine 里运行的方法&lt;/a&gt;
&lt;!-- [dotnet C# 判断应用程序在 Wine 里运行的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18808709 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E4%B8%8A%E9%AB%98%E6%95%88%E5%BC%80%E5%8F%91%E4%B8%8E%E8%B0%83%E8%AF%95-docker-%E5%AE%B9%E5%99%A8%E5%86%85-dotnet-%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%96%B9%E6%A1%88.html&quot;&gt;Windows 上高效开发与调试 docker 容器内 dotnet 程序的方案&lt;/a&gt;
&lt;!-- [Windows 上高效开发与调试 docker 容器内 dotnet 程序的方案 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20057057 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;uos&quot;&gt;UOS&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E5%9B%BD%E4%BA%A7%E7%B3%BB%E7%BB%9F%E4%B8%8A%E5%AE%89%E8%A3%85-dotnet-sdk-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 在 UOS 国产系统上安装 dotnet sdk 的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UOS-%E5%BC%80%E5%90%AF-VisualStudio-%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95-.NET-%E5%BA%94%E7%94%A8%E4%B9%8B%E6%97%85.html&quot;&gt;UOS 开启 VisualStudio 远程调试 .NET 应用之旅&lt;/a&gt;
&lt;!-- [UOS 开启 VisualStudio 远程调试 .NET 应用之旅 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18086533 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%A6%82%E4%BD%95-SSH-%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95-Linux-%E7%9A%84-dotnet-%E5%BA%94%E7%94%A8%E7%9A%84%E5%90%AF%E5%8A%A8.html&quot;&gt;VisualStudio 如何 SSH 远程调试 Linux 的 dotnet 应用的启动&lt;/a&gt;
&lt;!-- [VisualStudio 如何 SSH 远程调试 Linux 的 dotnet 应用的启动 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18238164 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/fireicesion/p/15134245.html&quot;&gt;统信UOS系统部署.Net Core 5.0 - 火冰·瓶 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/yujing2013/article/details/121741789&quot;&gt;Uos NetCoreSdk环境部署_uos生态适配的博客-CSDN博客_netcore部署环境&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E5%9B%BD%E4%BA%A7%E7%B3%BB%E7%BB%9F%E4%B8%8A%E5%AE%89%E8%A3%85-Mono-%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 在 UOS 国产系统上安装 Mono 开发工具的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E5%9B%BD%E4%BA%A7%E7%B3%BB%E7%BB%9F%E4%B8%8A%E5%AE%89%E8%A3%85-MonoDevelop-%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet 在 UOS 国产系统上安装 MonoDevelop 开发工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E5%9B%BD%E4%BA%A7%E7%B3%BB%E7%BB%9F%E4%B8%8A%E4%BD%BF%E7%94%A8-MonoDevelop-%E8%BF%9B%E8%A1%8C%E6%8B%96%E6%8E%A7%E4%BB%B6%E5%BC%80%E5%8F%91-GTK-%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet 在 UOS 国产系统上使用 MonoDevelop 进行拖控件开发 GTK 应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E5%9B%BD%E4%BA%A7%E7%B3%BB%E7%BB%9F%E4%B8%8A%E4%BD%BF%E7%94%A8-MonoDevelop-%E5%88%9B%E5%BB%BA-GTK-%E5%85%A8%E5%B9%B3%E5%8F%B0%E5%B8%A6%E7%95%8C%E9%9D%A2%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E5%9B%BD%E4%BA%A7%E7%B3%BB%E7%BB%9F%E4%B8%8A%E4%BD%BF%E7%94%A8-Xamarin-Forms-%E5%88%9B%E5%BB%BA-xaml-%E7%95%8C%E9%9D%A2%E7%9A%84-GTK-%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Avalonia-%E5%BC%80%E5%8F%91-UOS-%E5%8E%9F%E7%94%9F%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet 使用 Avalonia 开发 UOS 原生应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8%E5%9B%BD%E4%BA%A7-UOS-%E7%B3%BB%E7%BB%9F%E5%88%A9%E7%94%A8-dotnet-tool-%E5%B7%A5%E5%85%B7%E5%81%9A%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93.html&quot;&gt;dotnet 在国产 UOS 系统利用 dotnet tool 工具做文件传输&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-UOS-%E7%BB%9F%E4%BF%A1%E8%BF%90%E8%A1%8C-dotnet-%E7%A8%8B%E5%BA%8F%E6%8F%90%E7%A4%BA%E6%B2%A1%E6%9C%89%E9%80%9A%E8%BF%87%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E9%AA%8C%E8%AF%81%E6%97%A0%E6%B3%95%E8%BF%90%E8%A1%8C.html&quot;&gt;在 UOS 统信运行 dotnet 程序提示没有通过系统安全验证无法运行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-UOS-%E7%BB%9F%E4%BF%A1%E5%AE%89%E8%A3%85-dotnet-sdk-%E5%A4%B1%E8%B4%A5-%E6%8F%90%E7%A4%BA-failed-the-verification.html&quot;&gt;在 UOS 统信安装 dotnet sdk 失败 提示 failed the verification&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E7%BB%9F%E4%BF%A1%E7%B3%BB%E7%BB%9F%E4%B8%8A%E8%BF%90%E8%A1%8C-UNO-%E7%A8%8B%E5%BA%8F%E8%BE%93%E5%85%A5%E6%97%B6%E9%97%AA%E7%83%81%E9%BB%91%E5%B1%8F%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet 在 UOS 统信系统上运行 UNO 程序输入时闪烁黑屏问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%BB%9F%E4%BF%A1-UOS-%E8%BF%90%E8%A1%8C-UNO-FrameBuffer-%E5%BA%94%E7%94%A8%E9%94%99%E8%AF%AF-Failed-to-open-FrameBuffer-device.html&quot;&gt;dotnet 统信 UOS 运行 UNO FrameBuffer 应用错误 Failed to open FrameBuffer device&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%80%E6%AD%A5%E6%AD%A5%E6%95%99%E4%BD%A0%E5%9C%A8-Windows-%E4%B8%8A%E6%9E%84%E5%BB%BA-dotnet-%E7%B3%BB%E5%BA%94%E7%94%A8%E7%9A%84-UOS-%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85%E5%8C%85.html&quot;&gt;一步步教你在 Windows 上构建 dotnet 系应用的 UOS 软件安装包&lt;/a&gt;
&lt;!-- [一步步教你在 Windows 上构建 dotnet 系应用的 UOS 软件安装包 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17925826.html ) --&gt;
&lt;!-- [一步步教你在 Windows 上构建 dotnet 系应用的 UOS 软件安装包-腾讯云开发者社区-腾讯云](https://cloud.tencent.com/developer/article/2374481 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Packaging.DebUOS-%E4%B8%93%E9%97%A8%E4%B8%BA-dotnet-%E5%BA%94%E7%94%A8%E5%88%B6%E4%BD%9C-UOS-%E5%AE%89%E8%A3%85%E5%8C%85.html&quot;&gt;Packaging.DebUOS 专门为 dotnet 应用制作 UOS 安装包&lt;/a&gt;
&lt;!-- [Packaging.DebUOS 专门为 dotnet 应用制作 UOS 安装包 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17995729 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;麒麟&quot;&gt;麒麟&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%BA%92%E9%BA%9F-Kylin-%E7%9A%84-X11-%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95.html&quot;&gt;dotnet 麒麟 Kylin 的 X11 应用开发记录&lt;/a&gt;
&lt;!-- [dotnet 麒麟 Kylin 的 X11 应用开发记录 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18569239 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-Kylin-%E9%BA%92%E9%BA%9F%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E4%B8%AD%E5%BF%83%E6%8B%A6%E6%88%AA%E5%AF%BC%E8%87%B4-dotnet-sdk-%E6%89%BE%E4%B8%8D%E5%88%B0-OpenSsl-%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5.html&quot;&gt;记 Kylin 麒麟系统安全中心拦截导致 dotnet sdk 找不到 OpenSsl 构建失败&lt;/a&gt;
&lt;!-- [记 Kylin 麒麟系统安全中心拦截导致 dotnet sdk 找不到 OpenSsl 构建失败 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18514833 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%B0%E9%BE%99%E8%8A%AF%E9%BA%92%E9%BA%9F%E6%95%99%E8%82%B2%E7%89%88%E5%AE%89%E5%85%A8%E4%B8%AD%E5%BF%83%E6%8B%A6%E6%88%AA%E6%96%87%E4%BB%B6-%E5%AF%BC%E8%87%B4-docker-%E5%86%85-CI-CD-%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 记龙芯麒麟教育版安全中心拦截文件 导致 docker 内 CI CD 构建失败&lt;/a&gt;
&lt;!-- [dotnet 记龙芯麒麟教育版安全中心拦截文件 导致 docker 内 CI CD 构建失败 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18545167 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB%E5%8F%96%E9%BA%92%E9%BA%9F%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%90%84%E9%A1%B9%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF.html&quot;&gt;读取麒麟系统的各项版本信息&lt;/a&gt;
&lt;!-- [读取麒麟系统的各项版本信息 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18527091 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3%E9%BA%92%E9%BA%9F-Kylin-%E7%B3%BB%E7%BB%9F%E6%8F%90%E7%A4%BA-IP-%E5%86%B2%E7%AA%81-%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%9E%E6%8E%A5%E5%88%B0%E7%BD%91%E7%BB%9C.html&quot;&gt;解决麒麟 Kylin 系统提示 IP 冲突 无法正常连接到网络&lt;/a&gt;
&lt;!-- [解决麒麟 Kylin 系统提示 IP 冲突 无法正常连接到网络 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18827933 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/linux-%E9%BA%92%E9%BA%9F%E7%B3%BB%E7%BB%9F%E4%BF%AE%E5%A4%8D-wmf2gd-%E8%BD%AC%E6%8D%A2-wmf-%E5%9B%BE%E7%89%87%E6%8F%90%E7%A4%BA-wmf_ipa_font_map-%E9%94%99%E8%AF%AF.html&quot;&gt;linux 麒麟系统修复 wmf2gd 转换 wmf 图片提示 wmf_ipa_font_map 错误&lt;/a&gt;
&lt;!-- [linux 麒麟系统修复 wmf2gd 转换 wmf 图片提示 wmf_ipa_font_map 错误 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19003836 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;uno&quot;&gt;UNO&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UNO-UnoConf-2020-%E5%9C%A8%E7%BA%BF%E4%BC%9A%E8%AE%AE-%E4%BA%86%E8%A7%A3%E5%85%A8%E5%B9%B3%E5%8F%B0%E6%96%B0%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6-%E9%9B%B6%E8%B7%9D%E7%A6%BB%E6%8E%A5%E8%A7%A6%E5%AE%98%E6%96%B9%E5%BC%80%E5%8F%91%E8%80%85.html&quot;&gt;UNO UnoConf 2020 在线会议 了解全平台新开发框架 零距离接触官方开发者&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E-WPF-%E6%90%AC%E8%BF%81%E5%88%B0-UOS-%E4%B8%8B%E7%9A%84-UNO-%E7%9A%84%E7%AC%94%E8%AE%B0.html&quot;&gt;从 WPF 搬迁到 UOS 下的 UNO 的笔记&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2364682&quot;&gt;腾讯云&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-Uno-Islands-%E5%9C%A8%E7%8E%B0%E6%9C%89-WPF-%E9%87%8C%E9%9D%A2%E5%B5%8C%E5%85%A5-Uno-%E6%A1%86%E6%9E%B6.html&quot;&gt;使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-UNO-%E6%B5%8B%E8%AF%95%E5%9B%BA%E5%AE%9A%E5%B0%BA%E5%AF%B8%E4%B8%94%E6%B0%B4%E5%B9%B3%E5%92%8C%E5%9E%82%E7%9B%B4%E5%AF%B9%E9%BD%90%E8%AE%BE%E7%BD%AE-Stretch-%E7%9A%84%E5%85%83%E7%B4%A0%E5%9C%A8%E5%AE%B9%E5%99%A8%E5%86%85%E7%9A%84%E5%B8%83%E5%B1%80%E8%A1%8C%E4%B8%BA.html&quot;&gt;UNO 测试固定尺寸且水平和垂直对齐设置 Stretch 的元素在容器内的布局行为&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E5%B0%86-Microsoft.Maui.Graphics-%E5%AF%B9%E6%8E%A5%E5%88%B0-UNO-%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 如何将 Microsoft.Maui.Graphics 对接到 UNO 框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D-Uno-%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81.html&quot;&gt;dotnet 修复 Uno 中文乱码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UOS-%E7%BB%9F%E4%BF%A1%E7%B3%BB%E7%BB%9F%E4%B8%8A%E8%BF%90%E8%A1%8C-UNO-%E7%A8%8B%E5%BA%8F%E8%BE%93%E5%85%A5%E6%97%B6%E9%97%AA%E7%83%81%E9%BB%91%E5%B1%8F%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet 在 UOS 统信系统上运行 UNO 程序输入时闪烁黑屏问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%BB%9F%E4%BF%A1-UOS-%E8%BF%90%E8%A1%8C-UNO-FrameBuffer-%E5%BA%94%E7%94%A8%E9%94%99%E8%AF%AF-Failed-to-open-FrameBuffer-device.html&quot;&gt;dotnet 统信 UOS 运行 UNO FrameBuffer 应用错误 Failed to open FrameBuffer device&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-UNO-%E5%A6%82%E4%BD%95%E5%9C%A8%E8%B0%83%E8%AF%95%E4%B8%8B%E8%BE%93%E5%87%BA%E7%95%8C%E9%9D%A2%E5%B1%82%E7%BA%A7%E7%BB%93%E6%9E%84.html&quot;&gt;dotnet UNO 如何在调试下输出界面层级结构&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UNO.Skia.Gtk-%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3%E5%B0%BA%E5%AF%B8%E5%8F%98%E5%8C%96%E6%96%B9%E6%B3%95.html&quot;&gt;UNO.Skia.Gtk 设置窗口尺寸变化方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UNO-%E8%AE%BE%E7%BD%AE%E5%B9%B3%E5%8F%B0%E8%BF%9B%E5%85%A5%E5%85%A8%E5%B1%8F%E7%AA%97%E5%8F%A3%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;UNO 设置平台进入全屏窗口模式的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E-Uno-Platform-4-%E6%9B%B4%E6%96%B0-Uno-Platform-5-%E7%9A%84%E8%BF%81%E7%A7%BB%E6%96%B9%E6%B3%95.html&quot;&gt;从 Uno Platform 4 更新 Uno Platform 5 的迁移方法&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2380234&quot;&gt;腾讯云&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UNO-%E6%96%B0%E5%BB%BA%E5%9F%BA%E7%A1%80%E5%BA%93%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA%E6%8F%90%E7%A4%BA-UNOB0002-%E9%94%99%E8%AF%AF.html&quot;&gt;UNO 新建基础库项目构建提示 UNOB0002 错误&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2380233&quot;&gt;腾讯云&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UNO-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%9C%A8%E5%90%8E%E5%8F%B0%E7%BA%BF%E7%A8%8B%E8%A7%A6%E5%8F%91-SKXamlCanvas-%E7%9A%84-Invalidate-%E4%B8%94%E5%9C%A8-PaintSurface-%E4%BA%8B%E4%BB%B6%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8%E5%B0%86%E7%82%B8%E6%8E%89%E5%BA%94%E7%94%A8.html&quot;&gt;UNO 已知问题 在后台线程触发 SKXamlCanvas 的 Invalidate 且在 PaintSurface 事件抛出异常将炸掉应用&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2381479&quot;&gt;腾讯云&lt;/a&gt;
&lt;!-- [UNO 已知问题 在后台线程触发 SKXamlCanvas 的 Invalidate 且在 PaintSurface 事件抛出异常将炸掉应用 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17975446 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UNO-WinUI-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%9C%A8-XAML-%E6%9D%A1%E4%BB%B6%E6%9E%84%E5%BB%BA%E9%87%8C%E5%B0%86-win-%E5%B9%B3%E5%8F%B0%E5%8A%A0%E5%85%A5-Ignorable-%E5%B0%86%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5.html&quot;&gt;UNO WinUI 已知问题 在 XAML 条件构建里将 win 平台加入 Ignorable 将构建失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UNO-%E9%87%8C%E8%8E%B7%E5%8F%96-X11-%E7%AA%97%E5%8F%A3%E6%8C%87%E9%92%88%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 在 UNO 里获取 X11 窗口指针的方法&lt;/a&gt;
&lt;!-- [dotnet 在 UNO 里获取 X11 窗口指针的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18207530 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%E5%88%B0-UNO-%E6%A1%86%E6%9E%B6%E9%87%8C%E9%9D%A2%E7%9A%84-internal-%E4%B8%8D%E5%85%AC%E5%BC%80%E6%88%90%E5%91%98.html&quot;&gt;dotnet 如何访问到 UNO 框架里面的 internal 不公开成员&lt;/a&gt;
&lt;!-- [dotnet 如何访问到 UNO 框架里面的 internal 不公开成员 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18243188 ) --&gt;
&lt;!-- [Accessing Internal Members in the UNO Framework](https://blog.lindexi.com/post/Accessing-Internal-Members-in-the-UNO-Framework.html ) --&gt;
&lt;!-- [Accessing Internal Members in the UNO Framework - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18243187 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%9E%8D%E5%90%88-Avalonia-%E5%92%8C-UNO-%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 融合 Avalonia 和 UNO 框架&lt;/a&gt;
&lt;!-- [dotnet 融合 Avalonia 和 UNO 框架 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18263041 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%A7%A3%E5%86%B3-UNO-%E5%9C%A8-OpenKylin-%E9%BA%92%E9%BA%9F%E7%B3%BB%E7%BB%9F%E8%BF%90%E8%A1%8C%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AD%97%E4%BD%93%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 解决 UNO 在 OpenKylin 麒麟系统运行找不到默认字体启动失败&lt;/a&gt;
&lt;!-- [dotnet 解决 UNO 在 OpenKylin 麒麟系统运行找不到默认字体启动失败 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18268131 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%80%9A%E8%BF%87%E6%97%A5%E5%BF%97%E5%88%A4%E6%96%AD-Uno-Platform-%E6%98%AF%E5%90%A6%E5%9C%A8-X11-%E4%BD%BF%E7%94%A8-OpenGL-%E6%B8%B2%E6%9F%93%E5%8A%A0%E9%80%9F%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;通过日志判断 Uno Platform 是否在 X11 使用 OpenGL 渲染加速的方法&lt;/a&gt;
&lt;!-- [通过日志判断 Uno Platform 是否在 X11 使用 OpenGL 渲染加速的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18319977 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%AE%80%E5%8D%95%E5%9C%A8-WinUI-%E4%BB%BF%E9%80%A0-WPF-%E7%9A%84-ColumnDefinition-SharedSizeGroup-%E5%85%B1%E4%BA%AB%E5%88%97%E5%AE%BD%E5%8A%9F%E8%83%BD.html&quot;&gt;简单在 WinUI 仿造 WPF 的 ColumnDefinition SharedSizeGroup 共享列宽功能&lt;/a&gt;
&lt;!-- [简单在 WinUI 仿造 WPF 的 ColumnDefinition SharedSizeGroup 共享列宽功能 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18353046 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;avalonia&quot;&gt;Avalonia&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%9E%8D%E5%90%88-Avalonia-%E5%92%8C-UNO-%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 融合 Avalonia 和 UNO 框架&lt;/a&gt;
&lt;!-- [dotnet 融合 Avalonia 和 UNO 框架 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18263041 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Avalonia-%E5%BC%80%E5%8F%91-UOS-%E5%8E%9F%E7%94%9F%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet 使用 Avalonia 开发 UOS 原生应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%A7%A3%E5%86%B3-Avalonia-%E5%9C%A8-OpenKylin-%E9%BA%92%E9%BA%9F%E7%B3%BB%E7%BB%9F%E8%BF%90%E8%A1%8C%E6%89%BE%E4%B8%8D%E5%88%B0%E9%BB%98%E8%AE%A4%E5%AD%97%E4%BD%93%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 解决 Avalonia 在 OpenKylin 麒麟系统运行找不到默认字体启动失败&lt;/a&gt;
&lt;!-- [dotnet 解决 Avalonia 在 OpenKylin 麒麟系统运行找不到默认字体启动失败 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18132455 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-Avalonia-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%85%A8%E5%B1%8F%E7%BD%AE%E9%A1%B6%E7%9A%84-X11-%E5%BA%94%E7%94%A8%E7%AA%97%E5%8F%A3.html&quot;&gt;学习 Avalonia 框架笔记 如何创建一个全屏置顶的 X11 应用窗口&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2407503&quot;&gt;腾讯云&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-Avalonia-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E8%AE%BE%E7%BD%AE-X11-%E7%AA%97%E5%8F%A3%E4%BB%8E%E6%9C%80%E5%B0%8F%E5%8C%96%E7%8A%B6%E6%80%81%E8%BF%98%E5%8E%9F%E4%B8%BA%E6%AD%A3%E5%B8%B8%E7%8A%B6%E6%80%81.html&quot;&gt;学习 Avalonia 框架笔记 设置 X11 窗口从最小化状态还原为正常状态&lt;/a&gt;
&lt;!-- [学习 Avalonia 框架笔记 设置 X11 窗口从最小化状态还原为正常状态 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18197087 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-11.1-%E8%8E%B7%E5%8F%96%E5%B9%B3%E5%8F%B0%E8%B0%83%E7%94%A8%E7%9A%84%E7%AA%97%E5%8F%A3%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;Avalonia 11.1 获取平台调用的窗口的方法&lt;/a&gt;
&lt;!-- [Avalonia 11.1 获取平台调用的窗口的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18350133 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%90%8E%E5%8F%B0%E4%BB%A3%E7%A0%81%E7%AE%80%E5%8D%95%E6%92%AD%E6%94%BE%E5%8A%A8%E7%94%BB%E7%A4%BA%E4%BE%8B.html&quot;&gt;Avalonia 后台代码简单播放动画示例&lt;/a&gt;
&lt;!-- [Avalonia 后台代码简单播放动画示例 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18368582 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0%E8%BE%93%E5%85%A5%E6%B3%95%E5%85%89%E6%A0%87%E8%B7%9F%E9%9A%8F%E6%95%88%E6%9E%9C.html&quot;&gt;Avalonia 简单实现输入法光标跟随效果&lt;/a&gt;
&lt;!-- [Avalonia 简单实现输入法光标跟随效果 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18669800 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%B0%86-DrawingImage-%E4%BF%9D%E5%AD%98%E5%88%B0%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;Avalonia 将 DrawingImage 保存到本地文件的方法&lt;/a&gt;
&lt;!-- [Avalonia 将 DrawingImage 保存到本地文件的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18832016 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%88%B6%E4%BD%9C-AOT-%E5%8D%95%E6%96%87%E4%BB%B6.html&quot;&gt;Avalonia 制作 AOT 单文件&lt;/a&gt;
&lt;!-- [Avalonia 制作 AOT 单文件 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19038846 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%AE%9E%E7%8E%B0%E7%A6%BB%E5%B1%8F%E6%B8%B2%E6%9F%93%E8%83%BD%E5%8A%9B.html&quot;&gt;Avalonia 实现离屏渲染能力&lt;/a&gt;
&lt;!-- [Avalonia 实现离屏渲染能力 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19779219 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/lindexi/p/19857476&quot;&gt;Avalonia 使用 AvaloniaMath 做内联 Latex 公式 - lindexi - 博客园&lt;/a&gt;
&lt;!-- [Avalonia 使用 AvaloniaMath 做内联 Latex 公式 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19857476 ) --&gt;&lt;/p&gt;

&lt;h5 id=&quot;avalonia-界面效果&quot;&gt;Avalonia 界面效果&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E7%95%8C%E9%9D%A2%E6%95%88%E6%9E%9C-%E6%BB%9A%E5%8A%A8%E7%9A%84%E6%B8%90%E5%8F%98%E7%9F%A9%E5%BD%A2%E8%BE%B9%E6%A1%86.html&quot;&gt;Avalonia 界面效果 滚动的渐变矩形边框&lt;/a&gt;
&lt;!-- [Avalonia 界面效果 滚动的渐变矩形边框 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18803386 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E7%95%8C%E9%9D%A2%E6%95%88%E6%9E%9C-%E4%B8%89%E4%B8%AA%E5%9C%86%E5%AE%9E%E7%8E%B0%E6%A8%A1%E7%B3%8A%E7%95%8C%E9%9D%A2%E5%8A%A8%E6%95%88%E8%83%8C%E6%99%AF.html&quot;&gt;Avalonia 界面效果 三个圆实现模糊界面动效背景&lt;/a&gt;
&lt;!-- [Avalonia 界面效果 三个圆实现模糊界面动效背景 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18803385 ) --&gt;&lt;/p&gt;

&lt;h5 id=&quot;avalonia-渲染&quot;&gt;Avalonia 渲染&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AF%B9%E6%AF%94-Avalonia-%E5%92%8C-WPF-%E7%9A%84%E6%B8%B2%E6%9F%93%E5%BB%B6%E8%BF%9F.html&quot;&gt;对比 Avalonia 和 WPF 的渲染延迟&lt;/a&gt;
&lt;!-- [对比 Avalonia 和 WPF 的渲染延迟 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19582321 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E7%AE%80%E6%98%93%E5%AF%B9%E6%AF%94%E4%B8%8D%E5%90%8C%E7%9A%84-Win32CompositionMode-%E7%9A%84%E6%80%A7%E8%83%BD%E6%83%85%E5%86%B5.html&quot;&gt;Avalonia 简易对比不同的 Win32CompositionMode 的性能情况&lt;/a&gt;
&lt;!-- [Avalonia 简易对比不同的 Win32CompositionMode 的性能情况 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19582320 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E7%AC%94%E8%BF%B9%E6%B8%B2%E6%9F%93%E5%A4%AA%E6%85%A2%E4%BA%86-%E7%94%A8-WPF-%E5%81%9A%E5%8A%A0%E9%80%9F%E5%B1%82.html&quot;&gt;Avalonia 笔迹渲染太慢了 用 WPF 做加速层&lt;/a&gt;
&lt;!-- [Avalonia 笔迹渲染太慢了 用 WPF 做加速层 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18835048 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%9C%A8-X11-%E4%B8%8B%E4%BD%BF%E7%94%A8%E8%BD%AF%E6%B8%B2%E6%9F%93%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;Avalonia 在 X11 下使用软渲染的方法&lt;/a&gt;
&lt;!-- [Avalonia 在 X11 下使用软渲染的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18317439 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%9C%A8-Docker-%E5%AE%B9%E5%99%A8%E4%B8%AD%E9%80%9A%E8%BF%87-xvfb-%E8%BF%90%E8%A1%8C%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;Avalonia 在 Docker 容器中通过 xvfb 运行的方法&lt;/a&gt;
&lt;!-- [Avalonia 在 Docker 容器中通过 xvfb 运行的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19941247 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E6%97%A0%E5%A4%B4%E6%A8%A1%E5%BC%8F%E5%9C%A8-Docker-%E5%AE%B9%E5%99%A8%E4%B8%AD%E7%9A%84%E8%BF%90%E8%A1%8C%E6%96%B9%E6%B3%95.html&quot;&gt;Avalonia 无头模式在 Docker 容器中的运行方法&lt;/a&gt;
&lt;!-- [Avalonia 无头模式在 Docker 容器中的运行方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19955703 ) --&gt;&lt;/p&gt;

&lt;h5 id=&quot;avalonia-已知问题&quot;&gt;Avalonia 已知问题&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-11.1-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-IterationCount-%E4%B8%BA-Infinite-%E7%9A%84%E5%8A%A8%E7%94%BB%E6%92%AD%E6%94%BE%E5%87%BA%E7%8E%B0%E5%BC%82%E5%B8%B8.html&quot;&gt;Avalonia 11.1 已知问题 IterationCount 为 Infinite 的动画播放出现异常&lt;/a&gt;
&lt;!-- [Avalonia 11.1 已知问题 IterationCount 为 Infinite 的动画播放出现异常 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18375091 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-11.1-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%BA%94%E7%94%A8%E5%90%AF%E5%8A%A8%E6%97%B6-PointToScreen-%E6%97%A0%E6%B3%95%E8%8E%B7%E5%8F%96%E6%AD%A3%E7%A1%AE%E5%9D%90%E6%A0%87.html&quot;&gt;Avalonia 11.1 已知问题 应用启动时 PointToScreen 无法获取正确坐标&lt;/a&gt;
&lt;!-- [Avalonia 11.1 已知问题 应用启动时 PointToScreen 无法获取正确坐标 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18351896 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E7%AC%AC%E4%BA%8C%E6%AC%A1-Composition-Animation-%E6%97%A0%E6%B3%95%E6%92%AD%E6%94%BE.html&quot;&gt;Avalonia 已知问题 第二次 Composition Animation 无法播放&lt;/a&gt;
&lt;!-- [Avalonia 已知问题 第二次 Composition Animation 无法播放 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18512022 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E7%BB%A7%E6%89%BF%E6%BB%9A%E5%8A%A8%E6%9D%A1%E5%B0%86%E8%AE%A9%E9%87%8C%E5%B1%82%E6%8E%A7%E4%BB%B6%E6%97%A0%E6%B3%95%E8%8E%B7%E5%BE%97%E6%97%A0%E7%A9%B7%E5%A4%A7%E7%A9%BA%E9%97%B4.html&quot;&gt;Avalonia 已知问题 继承滚动条将让里层控件无法获得无穷大空间&lt;/a&gt;
&lt;!-- [Avalonia 已知问题 继承滚动条将让里层控件无法获得无穷大空间 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18766603 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%8F%96%E6%B6%88%E7%AA%97%E5%8F%A3%E5%85%B3%E9%97%AD%E5%AF%BC%E8%87%B4-Linux-%E9%BA%92%E9%BA%9F%E7%B3%BB%E7%BB%9F%E6%97%A0%E6%B3%95%E5%85%B3%E6%9C%BA%E6%B3%A8%E9%94%80%E9%87%8D%E5%90%AF.html&quot;&gt;Avalonia 取消窗口关闭导致 Linux 麒麟系统无法关机注销重启&lt;/a&gt;
&lt;!-- [Avalonia 取消窗口关闭导致 Linux 麒麟系统无法关机注销重启 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18924837 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E4%BD%BF%E7%94%A8-RenderTargetBitmap-%E6%88%AA%E5%9B%BE%E6%96%87%E6%9C%AC%E6%A8%A1%E7%B3%8A.html&quot;&gt;Avalonia 已知问题 使用 RenderTargetBitmap 截图文本模糊&lt;/a&gt;
&lt;!-- [Avalonia 已知问题 使用 RenderTargetBitmap 截图文本模糊 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18978159 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E8%A7%A3%E5%86%B3%E6%B8%B2%E6%9F%93%E9%AB%98%E6%B8%85%E5%A4%A7%E5%9B%BE%E5%B8%A7%E7%8E%87%E4%B8%8B%E9%99%8D%E9%97%AE%E9%A2%98.html&quot;&gt;Avalonia 解决渲染高清大图帧率下降问题&lt;/a&gt;
&lt;!-- [Avalonia 解决渲染高清大图帧率下降问题 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19741763 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E8%BF%87%E6%97%A9%E5%88%9B%E5%BB%BA-App-%E5%AF%B9%E8%B1%A1%E5%B0%86%E6%8A%9B%E5%87%BA-PlatformNotSupportedException-%E5%BC%82%E5%B8%B8.html&quot;&gt;Avalonia 已知问题 过早创建 App 对象将抛出 PlatformNotSupportedException 异常&lt;/a&gt;
&lt;!-- [Avalonia 已知问题 过早创建 App 对象将抛出 PlatformNotSupportedException 异常 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19819931 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;cpf&quot;&gt;CPF&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-CPF-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-X11-%E7%AA%97%E5%8F%A3%E5%92%8C%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html&quot;&gt;学习 CPF 框架笔记 了解 X11 窗口和消息基础知识&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-CPF-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-X11-%E7%BB%98%E5%88%B6%E5%9B%BE%E7%89%87%E6%96%B9%E6%B3%95.html&quot;&gt;学习 CPF 框架笔记 了解 X11 绘制图片方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AD%A6%E4%B9%A0-CPF-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-X11-%E9%87%8C%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%A7%A6%E6%91%B8%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet 学习 CPF 框架笔记 了解 X11 里如何获取触摸信息&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;x11&quot;&gt;X11&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-CPF-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-X11-%E7%AA%97%E5%8F%A3%E5%92%8C%E6%B6%88%E6%81%AF%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html&quot;&gt;学习 CPF 框架笔记 了解 X11 窗口和消息基础知识&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E8%AE%BE%E7%BD%AE-X11-%E5%BA%94%E7%94%A8%E7%AA%97%E5%8F%A3%E8%83%8C%E6%99%AF%E9%80%8F%E6%98%8E.html&quot;&gt;dotnet C# 设置 X11 应用窗口背景透明&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%88%9B%E5%BB%BA-X11-%E5%BA%94%E7%94%A8%E6%97%B6%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3%E8%83%8C%E6%99%AF%E9%A2%9C%E8%89%B2.html&quot;&gt;dotnet C# 创建 X11 应用时设置窗口背景颜色&lt;/a&gt;
&lt;!-- [dotnet C# 创建 X11 应用时设置窗口背景颜色 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18225520 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-CPF-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-X11-%E7%BB%98%E5%88%B6%E5%9B%BE%E7%89%87%E6%96%B9%E6%B3%95.html&quot;&gt;学习 CPF 框架笔记 了解 X11 绘制图片方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E5%A4%9A%E6%AC%A1%E8%B0%83%E7%94%A8-XPutImage-%E6%98%AF%E5%90%A6%E8%83%BD%E5%81%9A%E5%88%B0%E6%B8%B2%E6%9F%93%E5%90%8C%E6%AD%A5.html&quot;&gt;dotnet X11 多次调用 XPutImage 是否能做到渲染同步&lt;/a&gt;
&lt;!-- [dotnet X11 多次调用 XPutImage 是否能做到渲染同步 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18377330 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8-MIT-SHM-%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98%E6%8E%A8%E9%80%81%E5%9B%BE%E7%89%87.html&quot;&gt;dotnet X11 简单使用 MIT-SHM 共享内存推送图片&lt;/a&gt;
&lt;!-- [dotnet X11 简单使用 MIT-SHM 共享内存推送图片 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18370811 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E6%A0%88%E7%A9%BA%E9%97%B4%E8%A2%AB%E5%9B%9E%E6%94%B6%E5%AF%BC%E8%87%B4%E8%B0%83%E7%94%A8-XPutShmImage-%E9%97%AA%E9%80%80.html&quot;&gt;dotnet X11 栈空间被回收导致调用 XPutShmImage 闪退&lt;/a&gt;
&lt;!-- [dotnet X11 栈空间被回收导致调用 XPutShmImage 闪退 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18375092 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-Avalonia-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%85%A8%E5%B1%8F%E7%BD%AE%E9%A1%B6%E7%9A%84-X11-%E5%BA%94%E7%94%A8%E7%AA%97%E5%8F%A3.html&quot;&gt;学习 Avalonia 框架笔记 如何创建一个全屏置顶的 X11 应用窗口&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2407503&quot;&gt;腾讯云&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%90%86%E8%A7%A3-X11-%E7%9A%84-24-%E4%BD%8D%E6%88%96-32-%E4%BD%8D%E8%89%B2%E6%B7%B1%E7%AA%97%E5%8F%A3.html&quot;&gt;dotnet 理解 X11 的 24 位或 32 位色深窗口&lt;/a&gt;
&lt;!-- [dotnet 理解 X11 的 24 位或 32 位色深窗口 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18299633 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-X11-%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0.html&quot;&gt;dotnet C# X11 开发笔记&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E4%BB%8E-Gtk-3-%E7%9A%84%E7%AA%97%E5%8F%A3%E5%88%B0%E5%AF%B9%E5%BA%94%E7%9A%84-X11-%E7%AA%97%E5%8F%A3.html&quot;&gt;dotnet 如何从 Gtk 3 的窗口到对应的 X11 窗口&lt;/a&gt;
&lt;!-- [dotnet 如何从 Gtk 3 的窗口到对应的 X11 窗口 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18192609 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E7%AA%97%E5%8F%A3%E4%B9%8B%E9%97%B4%E5%8F%91%E9%80%81%E9%BC%A0%E6%A0%87%E6%B6%88%E6%81%AF-%E6%A8%A1%E6%8B%9F%E9%BC%A0%E6%A0%87%E8%BE%93%E5%85%A5.html&quot;&gt;dotnet X11 窗口之间发送鼠标消息 模拟鼠标输入&lt;/a&gt;
&lt;!-- [dotnet X11 窗口之间发送鼠标消息 模拟鼠标输入 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18192607 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%90%8E%E5%8F%B0%E7%BA%BF%E7%A8%8B%E5%8F%91%E9%80%81-X11-%E7%AA%97%E5%8F%A3%E6%B6%88%E6%81%AF.html&quot;&gt;dotnet 后台线程发送 X11 窗口消息&lt;/a&gt;
&lt;!-- [dotnet 后台线程发送 X11 窗口消息 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18192608 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%90%8E%E5%8F%B0%E7%BA%BF%E7%A8%8B%E8%AE%BE%E7%BD%AE-X11-%E7%AA%97%E5%8F%A3%E6%9C%80%E5%B0%8F%E5%8C%96.html&quot;&gt;dotnet 后台线程设置 X11 窗口最小化&lt;/a&gt;
&lt;!-- [dotnet 后台线程设置 X11 窗口最小化 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18192610 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AD%A6%E4%B9%A0-Avalonia-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E8%AE%BE%E7%BD%AE-X11-%E7%AA%97%E5%8F%A3%E4%BB%8E%E6%9C%80%E5%B0%8F%E5%8C%96%E7%8A%B6%E6%80%81%E8%BF%98%E5%8E%9F%E4%B8%BA%E6%AD%A3%E5%B8%B8%E7%8A%B6%E6%80%81.html&quot;&gt;学习 Avalonia 框架笔记 设置 X11 窗口从最小化状态还原为正常状态&lt;/a&gt;
&lt;!-- [学习 Avalonia 框架笔记 设置 X11 窗口从最小化状态还原为正常状态 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18197087 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%BE%E7%BD%AE-X11-%E5%BB%BA%E7%AB%8B%E7%AA%97%E5%8F%A3%E4%B9%8B%E9%97%B4%E7%9A%84%E7%88%B6%E5%AD%90%E5%85%B3%E7%B3%BB.html&quot;&gt;dotnet 设置 X11 建立窗口之间的父子关系&lt;/a&gt;
&lt;!-- [dotnet 设置 X11 建立窗口之间的父子关系 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18197088 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3%E9%BC%A0%E6%A0%87%E8%A7%A6%E6%91%B8%E5%91%BD%E4%B8%AD%E7%A9%BF%E9%80%8F.html&quot;&gt;dotnet X11 设置窗口鼠标触摸命中穿透&lt;/a&gt;
&lt;!-- [dotnet X11 设置窗口鼠标触摸命中穿透 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18204514 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-UNO-%E9%87%8C%E8%8E%B7%E5%8F%96-X11-%E7%AA%97%E5%8F%A3%E6%8C%87%E9%92%88%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 在 UNO 里获取 X11 窗口指针的方法&lt;/a&gt;
&lt;!-- [dotnet 在 UNO 里获取 X11 窗口指针的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18207530 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E7%AA%97%E5%8F%A3-Destroy-%E4%B9%8B%E5%90%8E%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%86%8D%E6%AC%A1-Map-%E6%98%BE%E7%A4%BA.html&quot;&gt;dotnet X11 窗口 Destroy 之后是否可以再次 Map 显示&lt;/a&gt;
&lt;!-- [dotnet X11 窗口 Destroy 之后是否可以再次 Map 显示 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18358071 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E8%B0%83%E7%94%A8-XRootWindow-%E6%98%AF%E5%90%A6%E8%80%97%E6%97%B6.html&quot;&gt;dotnet X11 调用 XRootWindow 是否耗时&lt;/a&gt;
&lt;!-- [dotnet X11 调用 XRootWindow 是否耗时 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18274612 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Avalonia-%E5%9C%A8-X11-%E4%B8%8B%E4%BD%BF%E7%94%A8%E8%BD%AF%E6%B8%B2%E6%9F%93%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;Avalonia 在 X11 下使用软渲染的方法&lt;/a&gt;
&lt;!-- [Avalonia 在 X11 下使用软渲染的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18317439 ) --&gt;&lt;/p&gt;

&lt;h5 id=&quot;x11-触摸相关&quot;&gt;X11 触摸相关&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AD%A6%E4%B9%A0-CPF-%E6%A1%86%E6%9E%B6%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-X11-%E9%87%8C%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%A7%A6%E6%91%B8%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet 学习 CPF 框架笔记 了解 X11 里如何获取触摸信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-X11-%E9%87%8C%E9%9D%A2%E8%A7%A6%E6%91%B8%E7%9A%84%E4%B8%80%E4%BA%9B%E8%A1%8C%E4%B8%BA.html&quot;&gt;记 X11 里面触摸的一些行为&lt;/a&gt;
&lt;!-- [记 X11 里面触摸的一些行为 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18468854 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E7%9A%84%E5%A4%9A%E5%B1%8F%E8%A7%A6%E6%91%B8%E8%A1%8C%E4%B8%BA%E6%B5%8B%E8%AF%95.html&quot;&gt;dotnet X11 的多屏触摸行为测试&lt;/a&gt;
&lt;!-- [dotnet X11 的多屏触摸行为测试 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18333725 ) --&gt;&lt;/p&gt;

&lt;h5 id=&quot;x11-多屏&quot;&gt;X11 多屏&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/X11-%E4%BD%BF%E7%94%A8-XSetWMNormalHints-%E5%9B%BA%E5%AE%9A%E7%AA%97%E5%8F%A3%E6%89%80%E5%9C%A8%E7%9A%84%E5%B1%8F%E5%B9%95.html&quot;&gt;X11 使用 XSetWMNormalHints 固定窗口所在的屏幕&lt;/a&gt;
&lt;!-- [X11 使用 XSetWMNormalHints 固定窗口所在的屏幕 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19024401 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/X11-%E8%AE%BE%E7%BD%AE%E5%A4%9A%E5%B1%8F%E4%B8%8B%E7%AA%97%E5%8F%A3%E5%9C%A8%E5%93%AA%E4%B8%AA%E5%B1%8F%E5%B9%95%E4%B8%8A%E5%85%A8%E5%B1%8F.html&quot;&gt;X11 设置多屏下窗口在哪个屏幕上全屏&lt;/a&gt;
&lt;!-- [X11 设置多屏下窗口在哪个屏幕上全屏 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19027800 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E8%8E%B7%E5%8F%96%E5%A4%9A%E5%B1%8F-edid-%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet X11 获取多屏 edid 信息&lt;/a&gt;
&lt;!-- [dotnet X11 获取多屏 edid 信息 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19033056 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-X11-%E7%9A%84%E5%A4%9A%E5%B1%8F%E8%A7%A6%E6%91%B8%E8%A1%8C%E4%B8%BA%E6%B5%8B%E8%AF%95.html&quot;&gt;dotnet X11 的多屏触摸行为测试&lt;/a&gt;
&lt;!-- [dotnet X11 的多屏触摸行为测试 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18333725 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;数据库&quot;&gt;数据库&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E4%BD%BF%E7%94%A8-ef-%E8%BF%81%E7%A7%BB%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98.html&quot;&gt;dotnet core 使用 ef 迁移常见问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E8%B0%83%E8%AF%95-SmartSql-%E7%9A%84%E5%AE%9E%E9%99%85%E6%89%A7%E8%A1%8C-SQL-%E8%AF%AD%E5%8F%A5.html&quot;&gt;dotnet 如何调试 SmartSql 的实际执行 SQL 语句&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%85%B3%E4%BA%8E-SmartSql-%E7%9A%84-SQL-%E8%AF%AD%E5%8F%A5%E7%9A%84%E5%B1%9E%E6%80%A7%E6%9B%BF%E6%8D%A2%E5%89%8D%E7%BC%80%E8%AF%B4%E6%98%8E.html&quot;&gt;dotnet 关于 SmartSql 的 SQL 语句的属性替换前缀说明&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E4%BD%BF%E7%94%A8-sqlite-%E9%83%A8%E7%BD%B2%E5%88%B0-Centos-%E6%9C%8D%E5%8A%A1%E5%99%A8.html&quot;&gt;dotnet core 使用 sqlite 部署到 Centos 服务器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%A6%81%E7%94%A8-SQLite-%E7%9A%84-SQLiteFunction-%E6%89%AB%E6%8F%8F%E7%A8%8B%E5%BA%8F%E9%9B%86%E6%8F%90%E5%8D%87%E5%90%AF%E5%8A%A8%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 禁用 SQLite 的 SQLiteFunction 扫描程序集提升启动性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SQLite-%E7%94%B1%E4%BA%8E-mscoree.dll-%E6%8D%9F%E5%9D%8F%E5%AF%BC%E8%87%B4-BadImageFormatException-%E8%AF%95%E5%9B%BE%E5%8A%A0%E8%BD%BD%E6%A0%BC%E5%BC%8F%E4%B8%8D%E6%AD%A3%E7%A1%AE%E7%9A%84%E7%A8%8B%E5%BA%8F.html&quot;&gt;SQLite 由于 mscoree.dll 损坏导致 BadImageFormatException 试图加载格式不正确的程序&lt;/a&gt;
&lt;!-- [SQLite 由于 mscoree.dll 损坏导致 BadImageFormatException 试图加载格式不正确的程序 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18397604 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;wpf&quot;&gt;WPF&lt;/h2&gt;

&lt;p&gt;记录 WPF 开发的杂烩： &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%80%E5%8F%91.html&quot;&gt;WPF 开发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;入门的教程： &lt;a href=&quot;https://wpf-tutorial.com/zh/1/%E5%85%B3%E4%BA%8Ewpf/%E4%BB%80%E4%B9%88%E6%98%AFwpf/?tdsourcetag=s_pctim_aiomsg&quot;&gt;什么是WPF - The complete WPF tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-Application-Compatibility-switches-list.html&quot;&gt;WPF Application Compatibility switches list&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-Switch.MS.Internal.EnableWeakEventMemoryImprovements-%E5%BC%80%E5%85%B3%E5%BC%80%E5%90%AF%E5%BC%B1%E4%BA%8B%E4%BB%B6%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96.html&quot;&gt;WPF 通过 Switch.MS.Internal.EnableWeakEventMemoryImprovements 开关开启弱事件内存优化&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-MAUI-%E7%9A%84%E8%87%AA%E7%BB%98%E5%88%B6%E9%80%BB%E8%BE%91.html&quot;&gt;WPF 使用 MAUI 的自绘制逻辑&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/16395472.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%87%E6%8D%A2%E4%B8%BB%E9%A2%98%E4%BD%BF%E7%94%A8-luna-%E5%A4%8D%E5%8F%A4%E7%89%88%E6%9C%AC.html&quot;&gt;WPF 切换主题使用 luna 复古版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%85%B3%E4%BA%8E%E5%B0%86-ManipulationDeltaEventArgs-%E7%9A%84-Manipulators-%E5%B1%9E%E6%80%A7%E8%BF%94%E5%9B%9E%E5%80%BC%E4%BF%AE%E6%94%B9%E4%B8%BA-ReadOnlyCollection-%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%8F%90%E8%AE%AE.html&quot;&gt;WPF 关于将 ManipulationDeltaEventArgs 的 Manipulators 属性返回值修改为 ReadOnlyCollection 类型的提议&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnetCampus.UITest.WPF-%E4%B8%80%E4%B8%AA%E6%94%AF%E6%8C%81%E4%B8%AD%E6%96%87%E7%94%A8%E4%BE%8B%E7%9A%84%E7%95%8C%E9%9D%A2%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnetCampus.UITest.WPF 一个支持中文用例的界面单元测试框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-%E5%8D%95%E4%BE%8B.html&quot;&gt;wpf 单例&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%97%8B%E8%BD%AC%E5%A4%AA%E6%9E%81.html&quot;&gt;WPF 旋转太极&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%95%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93%E7%9A%84%E6%8E%A7%E4%BB%B6%E5%9C%A8%E8%AE%BE%E8%AE%A1%E5%99%A8%E5%8A%A0%E4%B8%8A%E8%AE%BE%E8%AE%A1%E6%97%B6%E6%95%B0%E6%8D%AE%E5%92%8C%E5%B1%9E%E6%80%A7.html&quot;&gt;WPF 引用第三方库的控件在设计器加上设计时数据和属性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E5%8D%A0%E7%94%A8%E6%96%87%E4%BB%B6%E7%9A%84%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 制作一个占用文件的测试工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Microsoft.Toolkit.Wpf.UI.Controls-%E7%9A%84-InkCanvas-%E5%81%9A%E9%AB%98%E6%80%A7%E8%83%BD%E7%AC%94%E8%BF%B9%E5%BA%94%E7%94%A8.html&quot;&gt;WPF 使用 Microsoft.Toolkit.Wpf.UI.Controls 的 InkCanvas 做高性能笔迹应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8%E5%90%8E%E5%8F%B0%E4%BB%A3%E7%A0%81%E5%AE%9A%E4%B9%89-ResourceDictionary-%E8%B5%84%E6%BA%90%E5%AD%97%E5%85%B8.html&quot;&gt;WPF 在后台代码定义 ResourceDictionary 资源字典&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%90%AF%E5%8A%A8%E5%B1%8F%E5%B9%95%E9%94%AE%E7%9B%98.html&quot;&gt;WPF 启动屏幕键盘&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%99%84%E5%8A%A0%E5%B1%9E%E6%80%A7%E6%8F%90%E4%BE%9B%E6%9F%90%E4%B8%AA%E5%85%83%E7%B4%A0%E6%8B%A5%E6%9C%89%E6%8B%96%E6%8B%BD%E7%AA%97%E5%8F%A3%E7%9A%84%E5%8A%9F%E8%83%BD.html&quot;&gt;WPF 附加属性提供某个元素拥有拖拽窗口的功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%91%E5%AE%9A%E5%AF%86%E7%A0%81.html&quot;&gt;WPF 绑定密码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-%E7%BB%91%E5%AE%9A-TextLength.html&quot;&gt;wpf 绑定 TextLength &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%AE%E5%A4%8D-ContextMenu-%E5%9C%A8%E5%BC%80%E5%90%AF-PerMonitorV2-%E5%90%8E%E6%89%80%E7%94%A8-DPI-%E9%94%99%E8%AF%AF.html&quot;&gt;WPF 修复 ContextMenu 在开启 PerMonitorV2 后所用 DPI 错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8RPC%E8%B0%83%E7%94%A8%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B.html&quot;&gt;WPF 使用RPC调用其他进程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%BC%80%E5%8F%91-dotnet-Remoting-%E7%A8%8B%E5%BA%8F.html&quot;&gt;WPF 从零开始开发 dotnet Remoting 程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E4%BB%8E-dotnet-framework-4.8-%E5%8D%87%E7%BA%A7%E5%88%B0-4.8.1-%E6%97%B6%E8%BF%90%E8%A1%8C%E7%9A%84-dotnet-remoting-%E7%A8%8B%E5%BA%8F%E5%87%BA%E7%8E%B0%E7%A9%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;记从 dotnet framework 4.8 升级到 4.8.1 时运行的 dotnet remoting 程序出现空异常&lt;/a&gt;
&lt;!-- [记从 dotnet framework 4.8 升级到 4.8.1 时运行的 dotnet remoting 程序出现空异常 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18527092 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%91%E5%AE%9A%E7%BB%A7%E6%89%BF%E7%9A%84%E6%A0%B7%E5%BC%8F%E6%8F%90%E7%A4%BA-%E5%8F%AA%E8%83%BD%E6%A0%B9%E6%8D%AE%E5%B8%A6%E6%9C%89%E5%9F%BA%E7%B1%BB%E5%9E%8B-IFrameworkInputElement-%E7%9A%84%E7%9B%AE%E6%A0%87%E7%B1%BB%E5%9E%8B%E7%9A%84-Style-%E6%A0%B7%E5%BC%8F.html&quot;&gt;WPF 绑定继承的样式提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%BA%E4%BD%95-WPF-%E5%AF%B9-vcruntime140-%E6%9C%89%E5%BC%95%E7%94%A8.html&quot;&gt;为何 WPF 对 vcruntime140 有引用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%94%BB%E5%B8%83%E5%B7%A5%E5%85%B7%E6%A0%8F%E7%9A%84%E5%8F%AF%E6%89%A9%E5%B1%95%E8%AE%BE%E8%AE%A1.html&quot;&gt;WPF 画布工具栏的可扩展设计&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%99%E4%BB%BB%E6%84%8F%E6%8E%A7%E4%BB%B6%E9%80%9A%E8%BF%87%E6%8C%89%E4%B8%8B%E7%A7%BB%E5%8A%A8%E6%8A%AC%E8%B5%B7%E5%B0%81%E8%A3%85%E7%82%B9%E5%87%BB%E4%BA%8B%E4%BB%B6.html&quot;&gt;WPF 给任意控件通过按下移动抬起封装点击事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Microsoft.Toolkit.Wpf.UI.Controls-%E7%9A%84-InkCanvas-%E6%97%B6%E5%8A%A0%E4%B8%8A%E8%83%8C%E6%99%AF%E8%89%B2%E5%92%8C%E6%8C%89%E9%92%AE%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 使用 Microsoft.Toolkit.Wpf.UI.Controls 的 InkCanvas 时加上背景色和按钮方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%BC%A0%E6%A0%87%E5%85%89%E6%A0%87%E5%A4%A7%E5%85%A8.html&quot;&gt;WPF 鼠标光标大全&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E5%8C%85%E5%90%AB-%E5%8F%B7%E7%9A%84%E6%96%87%E4%BB%B6.html&quot;&gt;WPF 如何找到资源文件路径包含 # 号的文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E8%8E%B7%E5%8F%96%E4%B8%80%E4%B8%AA%E5%8F%AF%E7%94%A8%E7%9A%84%E7%AB%AF%E5%8F%A3%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet C# 获取一个可用的端口的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%9A%84-DefaultEventAttribute-%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8.html&quot;&gt;WPF 的 DefaultEventAttribute 有什么作用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-Elmish.WPF-%E4%BD%BF%E7%94%A8-F-%E7%BC%96%E5%86%99-WPF-%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%97%E8%A1%A8%E6%8E%A7%E4%BB%B6%E6%95%B0%E6%8D%AE%E6%BA%90%E7%BB%91%E5%AE%9A%E5%A4%9A%E4%B8%AA%E6%95%B0%E6%8D%AE%E9%9B%86%E5%90%88%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 列表控件数据源绑定多个数据集合方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-ManipulationProcessor2D-%E7%BA%AF%E6%95%B0%E5%AD%A6%E8%AE%A1%E7%AE%97%E6%96%B9%E5%BC%8F%E6%8F%90%E4%BE%9B%E5%A4%9A%E7%82%B9%E6%BC%AB%E6%B8%B8%E5%85%83%E7%B4%A0%E5%8A%9F%E8%83%BD.html&quot;&gt;WPF 使用 ManipulationProcessor2D 纯数学计算方式提供多点漫游元素功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-XmlDataProvider-%E6%8F%90%E4%BE%9B%E6%95%B0%E6%8D%AE.html&quot;&gt;WPF 使用 XmlDataProvider 提供数据&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8C%89%E9%92%AE-Button-%E7%9A%84-IsEnabled-%E5%B1%9E%E6%80%A7%E5%AF%B9-WindowChrome-%E7%9A%84-IsHitTestVisibleInChrome-%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;WPF 按钮 Button 的 IsEnabled 属性对 WindowChrome 的 IsHitTestVisibleInChrome 的影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%9C%A8%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E5%AE%9A%E4%B9%89%E5%AD%97%E4%BD%93%E5%A4%A7%E5%B0%8F.html&quot;&gt;WPF 如何在静态资源定义字体大小&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%99%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B7%BB%E5%8A%A0%E6%B0%B4%E5%8D%B0.html&quot;&gt;WPF 给应用程序添加水印&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-WpfAnalyzers-%E8%BE%85%E5%8A%A9%E5%88%86%E6%9E%90-WPF-%E5%BA%94%E7%94%A8%E4%BB%A3%E7%A0%81%E7%BC%BA%E9%99%B7.html&quot;&gt;dotnet 使用 WpfAnalyzers 辅助分析 WPF 应用代码缺陷&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%97%E8%A1%A8%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E6%AF%94%E8%BE%83%E7%AC%A6%E5%90%88-MVVM-%E7%9A%84%E5%91%BD%E4%BB%A4%E7%BB%91%E5%AE%9A%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 列表右键菜单比较符合 MVVM 的命令绑定方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%B8%8B%E6%8B%89%E6%A1%86%E9%80%89%E9%A1%B9%E5%81%9A%E9%BC%A0%E6%A0%87-Hover-%E9%A2%84%E8%A7%88%E6%95%88%E6%9E%9C.html&quot;&gt;WPF 下拉框选项做鼠标 Hover 预览效果&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%99-Grid-%E7%9A%84%E8%BE%85%E5%8A%A9%E6%96%B9%E6%B3%95-%E6%B7%BB%E5%8A%A0%E8%A1%8C%E5%88%97%E5%90%8D%E7%A7%B0%E7%BB%91%E5%AE%9A.html&quot;&gt;WPF 给 Grid 的辅助方法 添加行列名称绑定&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%99%E7%B1%BB%E5%BA%93%E8%AE%BE%E7%BD%AE%E8%AE%BE%E8%AE%A1%E6%97%B6%E4%BD%BF%E7%94%A8%E7%9A%84%E8%B5%84%E6%BA%90%E5%AD%97%E5%85%B8.html&quot;&gt;WPF 给类库设置设计时使用的资源字典&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BD%A2%E7%8A%B6%E7%9A%84-StrokeThickness-%E5%B1%9E%E6%80%A7%E5%AF%B9%E8%BE%B9%E6%A1%86%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;WPF 形状的 StrokeThickness 属性对边框的影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E8%BF%9B%E7%A8%8B%E5%90%AF%E5%8A%A8%E5%88%B0%E5%BD%93%E5%89%8D%E7%8E%B0%E5%9C%A8%E7%9A%84%E6%97%B6%E9%97%B4.html&quot;&gt;WPF 获取进程启动到当前现在的时间&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B0%86-docx-%E7%9A%84-Word-%E6%96%87%E4%BB%B6%E8%BD%AC%E6%8D%A2%E4%B8%BA-FlowDocument-%E6%98%BE%E7%A4%BA.html&quot;&gt;WPF 将 docx 的 Word 文件转换为 FlowDocument 显示&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%B8%BA%E4%BD%95%E4%B8%8D%E8%A6%81%E9%87%8D%E5%86%99%E9%BB%98%E8%AE%A4-string-%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84-DataTemplate-%E6%95%B0%E6%8D%AE%E6%A8%A1%E7%89%88.html&quot;&gt;WPF 为何不要重写默认 string 字符串的 DataTemplate 数据模版&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE%E5%85%83%E7%B4%A0%E4%B8%BA-Collapsed-%E6%98%AF%E5%90%A6%E4%BC%9A%E5%88%9B%E5%BB%BA%E6%AD%A4%E5%85%83%E7%B4%A0.html&quot;&gt;WPF 设置元素为 Collapsed 是否会创建此元素&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3%E4%B8%8D%E8%B7%9F%E9%9A%8F%E8%A7%A6%E6%91%B8%E6%83%AF%E6%80%A7%E6%8B%96%E5%8A%A8%E6%8A%96%E5%8A%A8.html&quot;&gt;WPF 设置窗口不跟随触摸惯性拖动抖动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE%E7%AE%A1%E7%90%86%E5%91%98%E6%9D%83%E9%99%90%E5%90%AF%E5%8A%A8.html&quot;&gt;WPF 设置管理员权限启动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BB%B6%E8%BF%9F%E5%8A%A0%E8%BD%BD.html&quot;&gt;WPF 延迟加载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%80%E5%8F%91%E8%87%AA%E5%8A%A8%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F.html&quot;&gt;WPF 开发自动开机启动程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%9A%90%E8%97%8F%E7%B3%BB%E7%BB%9F%E7%AA%97%E5%8F%A3%E8%8F%9C%E5%8D%95.html&quot;&gt;WPF 隐藏系统窗口菜单&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E9%94%AE%E7%9B%98%E4%BA%8B%E4%BB%B6-KeyEventArgs-%E9%87%8C%E8%8E%B7%E5%8F%96-Scan-Code-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 从键盘事件 KeyEventArgs 里获取 Scan Code 的方法&lt;/a&gt;
&lt;!-- [WPF 从键盘事件 KeyEventArgs 里获取 Scan Code 的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18176388 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-%E7%BB%91%E5%AE%9A-DataGridTextColumn.html&quot;&gt;wpf 绑定 DataGridTextColumn &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-DoEvents.html&quot;&gt;wpf DoEvents &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%BF%90%E8%A1%8C%E6%97%B6%E8%BF%81%E7%A7%BB-EF-Core-%E6%95%B0%E6%8D%AE%E5%BA%93.html&quot;&gt;WPF 运行时迁移 EF Core 数据库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%BD%BB%E9%87%8F%E7%BA%A7-MVVM-%E6%A1%86%E6%9E%B6%E5%85%A5%E9%97%A8-2.1.2.html&quot;&gt;WPF 轻量级 MVVM 框架入门 2.1.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%91%E5%AE%9A%E5%91%BD%E4%BB%A4%E5%9C%A8-MVVM-%E7%9A%84-CanExecute-%E5%92%8C-Execute-%E5%9C%A8%E6%8C%89%E9%92%AE%E7%82%B9%E5%87%BB%E9%83%BD%E6%B2%A1%E8%A7%A6%E5%8F%91%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;WPF 绑定命令在 MVVM 的 CanExecute 和 Execute 在按钮点击都没触发可能的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%9C%A8%E7%BB%91%E5%AE%9A%E5%A4%B1%E8%B4%A5%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 如何在绑定失败异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%85%83%E7%B4%A0%E8%A3%81%E5%89%AA-Clip-%E5%B1%9E%E6%80%A7.html&quot;&gt;WPF 元素裁剪 Clip 属性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%89%98%E7%9B%98%E6%98%BE%E7%A4%BA.html&quot;&gt;WPF 托盘显示&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E6%8E%A7%E4%BB%B6%E5%9C%A8%E6%BB%9A%E5%8A%A8%E6%9D%A1%E7%9A%84%E9%87%8C%E9%9D%A2%E6%98%AF%E7%94%A8%E6%88%B7%E5%8F%AF%E8%A7%81.html&quot;&gt;WPF 如何判断一个控件在滚动条的里面是用户可见&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%91%E5%AE%9A%E7%9A%84%E9%BB%98%E8%AE%A4%E6%A8%A1%E5%BC%8F.html&quot;&gt;WPF 绑定的默认模式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B0%81%E8%A3%85-dotnet-remoting-%E8%B0%83%E7%94%A8%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B.html&quot;&gt;WPF 封装 dotnet remoting 调用其他进程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%97%E8%A1%A8%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C.html&quot;&gt;WPF 列表自动换行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B%E8%87%AA%E5%B7%B1%E7%9A%84-3d-gis-%E7%A8%8B%E5%BA%8F.html&quot;&gt;WPF 如何建立自己的 3d gis 程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8%E7%BB%91%E5%AE%9A%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B7%BB%E5%8A%A0%E8%AE%A1%E7%AE%97.html&quot;&gt;WPF 在绑定表达式添加计算&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%AE%E6%94%B9-ItemContainerStyle-%E9%BC%A0%E6%A0%87%E7%A7%BB%E5%8A%A8%E5%88%B0%E6%9C%AA%E9%80%89%E4%B8%AD%E9%A1%B9%E6%95%88%E6%9E%9C%E5%92%8C%E9%80%89%E4%B8%AD%E9%A1%B9%E8%83%8C%E6%99%AF.html&quot;&gt;WPF 修改 ItemContainerStyle 鼠标移动到未选中项效果和选中项背景&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E4%B8%8B%E8%BD%BD%E5%86%85%E5%AE%B9%E9%95%BF%E5%BA%A6.html&quot;&gt;WPF 获取下载内容长度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8B%96%E5%8A%A8%E6%BB%9A%E5%8A%A8.html&quot;&gt;WPF 拖动滚动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%87%AA%E5%AE%9A%E4%B9%89-TextBoxView-%E7%9A%84-Margin-%E5%A4%A7%E5%B0%8F.html&quot;&gt;WPF 自定义 TextBoxView 的 Margin 大小&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%80%E5%8F%91%E8%87%AA%E5%8A%A8%E5%88%A0%E9%99%A4%E8%BD%AF%E4%BB%B6.html&quot;&gt;WPF 开发自动删除软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%BC%A0%E6%A0%87%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%88%97%E8%A1%A8%E4%B8%8A-%E6%98%BE%E7%A4%BA%E5%88%97%E8%A1%A8%E5%9B%BE%E6%A0%87.html&quot;&gt;WPF 鼠标移动到列表上 显示列表图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%9C%81%E5%B8%82%E5%8E%BF3%E7%BA%A7%E8%81%94%E5%8A%A8.html&quot;&gt;WPF 省市县3级联动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A5%BD%E7%9C%8B%E7%9A%84%E7%9F%A2%E9%87%8F%E5%9B%BE%E6%A0%87.html&quot;&gt;WPF 好看的矢量图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8F%AF%E8%8E%B7%E5%BE%97%E7%84%A6%E7%82%B9%E5%B1%9E%E6%80%A7.html&quot;&gt;WPF 可获得焦点属性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%A4%E6%96%ADUSB%E6%8F%92%E6%8B%94.html&quot;&gt;WPF 判断USB插拔&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%AE%E6%94%B9%E6%8C%89%E9%92%AE%E6%8C%89%E4%B8%8B%E7%9A%84%E9%A2%9C%E8%89%B2.html&quot;&gt;WPF 修改按钮按下的颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AF%BB%E5%8F%96%E7%A1%AC%E4%BB%B6%E5%BA%8F%E5%88%97%E5%8F%B7.html&quot;&gt;WPF 读取硬件序列号&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-WNetUseConnection-%E8%BF%9E%E6%8E%A5-SMB-%E7%BD%91%E7%BB%9C%E8%B5%84%E6%BA%90.html&quot;&gt;WPF 使用 WNetUseConnection 连接 SMB 网络资源&lt;/a&gt;
&lt;!-- [WPF 使用 WNetUseConnection 连接 SMB 网络资源 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19030487 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%B5%84%E6%BA%90%E5%86%BB%E7%BB%93.html&quot;&gt;WPF 资源冻结&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%82%E5%B8%B8-NativeWPFDLLLoader.LoadNativeWPFDLL.html&quot;&gt;WPF 异常 NativeWPFDLLLoader.LoadNativeWPFDLL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8F%AA%E5%85%81%E8%AE%B8%E6%89%93%E5%BC%80%E4%B8%80%E4%B8%AA%E5%AE%9E%E4%BE%8B.html&quot;&gt;WPF 只允许打开一个实例&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Pandoc-%E6%8A%8A-Markdown-%E8%BD%AC-Docx.html&quot;&gt;WPF 使用 Pandoc 把 Markdown 转 Docx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Edge-%E6%B5%8F%E8%A7%88%E5%99%A8.html&quot;&gt;WPF 使用 Edge 浏览器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95%E5%9C%A8%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%E5%86%85%E5%90%8C%E6%97%B6%E8%B7%91%E8%B5%B7-WPF-%E5%92%8C-ASP.NET-Core-%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 简单方法在一个进程内同时跑起 WPF 和 ASP.NET Core 框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%95%E7%94%A8-ASP.NET-Core-%E7%9A%84-AOT-%E7%89%88%E6%9C%AC.html&quot;&gt;WPF 引用 ASP.NET Core 的 AOT 版本&lt;/a&gt;
&lt;!-- [WPF 引用 ASP.NET Core 的 AOT 版本 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19049877 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E-RGB-%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E7%BA%AF%E8%89%B2%E9%A2%9C%E8%89%B2%E7%94%BB%E5%88%B7%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 从 RGB 字符串转纯色颜色画刷的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html&quot;&gt;WPF 性能测试&lt;/a&gt;
&lt;!-- [WPF 性能测试 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17678694.html ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%90%AF%E5%8A%A8%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96-%E5%9C%A8-EnsureHandle-%E4%B9%8B%E5%89%8D%E8%AE%BE%E7%BD%AE-WindowStyle-%E6%8F%90%E5%8D%87%E6%80%A7%E8%83%BD.html&quot;&gt;WPF 启动性能优化 在 EnsureHandle 之前设置 WindowStyle 提升性能&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpf-应用开发&quot;&gt;WPF 应用开发&lt;/h3&gt;

&lt;p&gt;这是记录我用 WPF 开发的一些应用&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E5%8A%A0%E5%AF%86%E6%96%87%E4%BB%B6%E5%A4%B9%E5%BA%94%E7%94%A8.html&quot;&gt;WPF 制作一个加密文件夹应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E6%94%AF%E6%8C%81%E5%88%A0%E9%99%A4%E8%87%AA%E8%BA%AB%E7%9A%84%E5%BA%94%E7%94%A8.html&quot;&gt;WPF 简单实现一个支持删除自身的应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8-WinML-%E5%81%9A%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E6%89%8B%E5%86%99%E6%95%B0%E5%AD%97%E8%AF%86%E5%88%AB%E5%BA%94%E7%94%A8.html&quot;&gt;WPF 尝试使用 WinML 做一个简单的手写数字识别应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%81%9A%E4%B8%80%E4%B8%AA%E8%B6%85%E7%BA%A7%E7%AE%80%E5%8D%95%E7%9A%84-1024-%E6%95%B0%E5%AD%97%E6%8E%A5%E9%BE%99%E6%B8%B8%E6%88%8F.html&quot;&gt;WPF 做一个超级简单的 1024 数字接龙游戏&lt;/a&gt;
&lt;!-- [WPF 做一个超级简单的 1024 数字接龙游戏 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18264294 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%96%B9%E5%BC%8F%E5%88%B6%E4%BD%9C%E7%AE%80%E6%98%93%E7%9A%84-Word-%E4%B8%8A%E7%9A%84-Latex-%E8%BE%93%E5%85%A5%E6%B3%95.html&quot;&gt;WPF 使用快捷键方式制作简易的 Word 上的 Latex 输入法&lt;/a&gt;
&lt;!-- [WPF 使用快捷键方式制作简易的 Word 上的 Latex 输入法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18498720 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%81%9A%E4%B8%80%E4%B8%AA%E5%8E%8B%E7%BC%A9%E5%8C%85%E5%92%8C%E8%A7%A3%E5%8E%8B%E7%BC%A9%E5%87%BA%E6%9D%A5%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E5%86%85%E5%AE%B9%E5%AF%B9%E6%AF%94%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet C# 做一个压缩包和解压缩出来的文件夹内容对比工具&lt;/a&gt;
&lt;!-- [dotnet C# 做一个压缩包和解压缩出来的文件夹内容对比工具 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18817811 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%93%E5%90%88%E6%9C%AC%E5%9C%B0-Ollama-%E5%8D%83%E9%97%AE%E5%A4%9A%E6%A8%A1%E6%80%81%E5%AE%9E%E7%8E%B0%E7%A6%BB%E7%BA%BF%E5%B1%8F%E5%B9%95%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 结合本地 Ollama 千问多模态实现离线屏幕使用记录工具&lt;/a&gt;
&lt;!-- [WPF 结合本地 Ollama 千问多模态实现离线屏幕使用记录工具 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19919367 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E4%BB%8E-PPT-%E6%96%87%E6%A1%A3%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E6%BC%94%E8%AE%B2%E8%A7%86%E9%A2%91%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 制作一个从 PPT 文档自动生成演讲视频工具&lt;/a&gt;
&lt;!-- [WPF 制作一个从 PPT 文档自动生成演讲视频工具 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19998656 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-WPF-%E5%AE%9E%E7%8E%B0%E7%AB%AF%E5%8F%A3%E5%8D%A0%E7%94%A8%E6%A3%80%E6%B5%8B%E4%B8%8E%E8%87%AA%E5%8A%A8%E6%9F%A5%E6%89%BE%E5%8F%AF%E7%94%A8%E7%AB%AF%E5%8F%A3.html&quot;&gt;dotnet WPF 实现端口占用检测与自动查找可用端口&lt;/a&gt;
&lt;!-- [dotnet WPF 实现端口占用检测与自动查找可用端口 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20687206 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%80%E6%9D%A1%E8%87%AA%E5%B7%B1%E6%94%92%E7%9A%84AI%E5%9B%BE%E6%A0%87%E5%88%B6%E4%BD%9C%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%B7%A5%E5%85%B7%E9%93%BE.html&quot;&gt;一条自己攒的AI图标制作流水线工具链&lt;/a&gt;
&lt;!-- [一条自己攒的AI图标制作流水线工具链 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/22056704 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpf-触摸相关&quot;&gt;WPF 触摸相关&lt;/h3&gt;

&lt;p&gt;我写了很多 WPF 触摸相关的博客，请参阅：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A6%E6%91%B8%E7%9B%B8%E5%85%B3.html&quot;&gt;WPF 触摸相关&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-dotnet-core-%E5%A6%82%E4%BD%95%E5%BC%80%E5%90%AF-Pointer-%E6%B6%88%E6%81%AF%E7%9A%84%E6%94%AF%E6%8C%81.html&quot;&gt;WPF dotnet core 如何开启 Pointer 消息的支持&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%90%AF%E4%BA%86-Pointer-%E8%A7%A6%E6%91%B8%E6%B6%88%E6%81%AF%E7%9A%84%E6%94%AF%E6%8C%81.html&quot;&gt;WPF 如何确定应用程序开启了 Pointer 触摸消息的支持&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%BB%8E-WM_POINTER-%E6%B6%88%E6%81%AF%E5%88%B0-Touch-%E4%BA%8B%E4%BB%B6.html&quot;&gt;dotnet 读 WPF 源代码笔记 从 WM_POINTER 消息到 Touch 事件&lt;/a&gt;
&lt;!-- [dotnet 读 WPF 源代码笔记 从 WM_POINTER 消息到 Touch 事件 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18403860 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%80%E5%90%AF-ScrollViewer-%E7%9A%84%E8%A7%A6%E6%91%B8%E6%BB%9A%E5%8A%A8.html&quot;&gt;WPF 开启 ScrollViewer 的触摸滚动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-WindowsAppSDK-%E4%BD%BF%E7%94%A8-WinRT-%E7%9A%84%E6%89%8B%E5%86%99%E8%AF%86%E5%88%AB%E5%8A%9F%E8%83%BD.html&quot;&gt;WPF 通过 WindowsAppSDK 使用 WinRT 的手写识别功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A6%E6%91%B8%E4%B8%8B%E5%A6%82%E4%BD%95%E7%BB%99-StylusPointCollection-%E6%B7%BB%E5%8A%A0%E7%82%B9.html&quot;&gt;WPF 触摸下如何给 StylusPointCollection 添加点&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-GetMessageExtraInfo-%E6%96%B9%E6%B3%95%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E6%94%B6%E5%88%B0%E7%9A%84%E9%BC%A0%E6%A0%87%E6%B6%88%E6%81%AF%E6%98%AF%E5%90%A6%E7%94%B1%E8%A7%A6%E6%91%B8%E8%BD%AC%E6%8D%A2%E8%BF%87%E6%9D%A5.html&quot;&gt;WPF 通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸转换过来&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%B0%E4%B8%80%E4%B8%AA%E7%89%B9%E5%88%AB%E7%AE%80%E5%8D%95%E7%9A%84%E7%82%B9%E9%9B%86%E6%BB%A4%E6%B3%A2%E5%B9%B3%E6%BB%91%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 记一个特别简单的点集滤波平滑方法&lt;/a&gt;
&lt;!-- [WPF 记一个特别简单的点集滤波平滑方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18387840 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E8%A3%B8-Win-32-%E7%9A%84-WM_Pointer-%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96%E8%A7%A6%E6%91%B8%E7%82%B9%E7%BB%98%E5%88%B6%E7%AC%94%E8%BF%B9.html&quot;&gt;WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹&lt;/a&gt;
&lt;!-- [WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18390983 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-GetRawPointerDeviceData-%E4%BB%8E-WM_POINTER-%E6%B6%88%E6%81%AF%E8%A7%A6%E6%91%B8%E8%A3%B8%E6%95%B0%E6%8D%AE.html&quot;&gt;WPF 通过 GetRawPointerDeviceData 从 WM_POINTER 消息触摸裸数据&lt;/a&gt;
&lt;!-- [WPF 通过 GetRawPointerDeviceData 从 WM_POINTER 消息触摸裸数据 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18890017 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E7%9B%91%E5%90%AC-WMI-%E4%BA%8B%E4%BB%B6%E5%AF%BC%E8%87%B4%E8%A7%A6%E6%91%B8%E5%A4%B1%E6%95%88.html&quot;&gt;WPF 已知问题 监听 WMI 事件导致触摸失效&lt;/a&gt;
&lt;!-- [WPF 已知问题 监听 WMI 事件导致触摸失效 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18407581 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-Main-thread-gets-a-deadlock-when-stylus-input-thread-is-waiting-for-the-window-to-close.html&quot;&gt;WPF Main thread gets a deadlock when stylus input thread is waiting for the window to close&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-shows-that-some-windows-in-multithreading-will-be-locked-in-the-PenThreadWorker-constructor-when-the-application-starts.html&quot;&gt;WPF shows that some windows in multithreading will be locked in the PenThreadWorker constructor when the application starts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-will-break-when-an-exception-be-throw-in-the-StylusPlugIn.html&quot;&gt;WPF will break when an exception be throw in the StylusPlugIn&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;控件&quot;&gt;控件&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-checkbox%E6%96%87%E5%AD%97%E4%B8%8B%E6%8E%89.html&quot;&gt;WPF checkbox文字下掉&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-popup%E7%BD%AE%E9%A1%B6.html&quot;&gt;WPF popup置顶&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E7%BB%99-Grid-%E7%9A%84%E6%9F%90%E4%B8%80%E8%A1%8C%E6%B7%BB%E5%8A%A0%E8%83%8C%E6%99%AF%E8%89%B2.html&quot;&gt;WPF 如何给 Grid 的某一行添加背景色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%A9-TextBox-%E6%94%AF%E6%8C%81%E6%B0%B4%E5%B9%B3%E6%BB%9A%E5%8A%A8.html&quot;&gt;WPF 让 TextBox 支持水平滚动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8E%A7%E4%BB%B6-Content-%E7%9A%84%E5%86%85%E5%AE%B9%E4%B8%8D%E6%98%BE%E7%A4%BA%E4%B8%8B%E5%88%92%E7%BA%BF%E5%AD%97%E7%AC%A6%E4%B8%B2.html&quot;&gt;WPF 控件 Content 的内容不显示下划线字符串&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8image%E6%8E%A7%E4%BB%B6%E7%94%A8%E9%BC%A0%E6%A0%87%E6%8B%96%E6%8B%BD%E5%87%BA%E7%9F%A9%E5%BD%A2.html&quot;&gt;WPF 在image控件用鼠标拖拽出矩形&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-ItemsPanel-%E4%BF%AE%E6%94%B9%E6%96%B9%E5%90%91.html&quot;&gt;WPF 使用 ItemsPanel 修改方向&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-ListBox-%E7%9A%84%E9%80%89%E6%8B%A9.html&quot;&gt;WPF ListBox 的选择&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3-ListView-%E7%9A%84%E6%BB%9A%E5%8A%A8%E6%9D%A1%E4%B8%8D%E6%98%BE%E7%A4%BA.html&quot;&gt;WPF 解决 ListView 的滚动条不显示&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;自定义控件&quot;&gt;自定义控件&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8E%A7%E4%BB%B6%E7%BB%A7%E6%89%BF%E6%A0%91.html&quot;&gt;WPF 控件继承树&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6%E5%85%A5%E9%97%A8-%E5%8F%AF%E9%87%8D%E5%86%99%E7%9A%84%E5%90%84%E4%B8%AA%E6%96%B9%E6%B3%95%E6%88%96%E5%B1%9E%E6%80%A7%E7%9A%84%E6%84%8F%E4%B9%89.html&quot;&gt;WPF 自定义控件入门 可重写的各个方法或属性的意义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6%E5%85%A5%E9%97%A8-Focusable-%E4%B8%8E%E7%84%A6%E7%82%B9.html&quot;&gt;WPF 自定义控件入门 Focusable 与焦点&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%89%8B%E7%BB%98%E5%AF%B9%E7%A7%B0%E5%9B%BE%E5%BD%A2%E6%8E%A7%E4%BB%B6.html&quot;&gt;WPF 手绘对称图形控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%BB%91%E5%8A%A8%E4%BF%AE%E6%94%B9%E9%9F%B3%E9%87%8F%E6%8E%A7%E4%BB%B6.html&quot;&gt;WPF 滑动修改音量控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1Ui4y1a717/?vd_source=822993b9bf3248de16ece4f9f39499ea&quot;&gt;【收藏】 WPF教学 WPF做出这样丝滑的动画尽然如此简单？ Magic Navigation Bar 导航栏 哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;控件库&quot;&gt;控件库&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-HandyControl-%E7%BB%99-ListView-%E6%B7%BB%E5%8A%A0%E6%BC%82%E4%BA%AE%E7%9A%84%E8%A1%A8%E5%A4%B4%E6%95%88%E6%9E%9C.html&quot;&gt;WPF 使用 HandyControl 给 ListView 添加漂亮的表头效果&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-HandyControl-%E5%B7%B2%E6%94%AF%E6%8C%81%E7%BB%99%E4%BB%BB%E6%84%8F%E6%8E%A7%E4%BB%B6%E9%80%9A%E8%BF%87%E6%8C%89%E4%B8%8B%E7%A7%BB%E5%8A%A8%E6%8A%AC%E8%B5%B7%E5%B0%81%E8%A3%85%E7%82%B9%E5%87%BB%E4%BA%8B%E4%BB%B6.html&quot;&gt;WPF HandyControl 已支持给任意控件通过按下移动抬起封装点击事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%94%A8-AvalonEdit-%E5%BC%80%E5%8F%91%E7%AE%80%E5%8D%95%E7%9A%84%E4%BB%A3%E7%A0%81%E7%BC%96%E8%BE%91%E5%99%A8-%E6%94%AF%E6%8C%81%E9%AB%98%E4%BA%AE%E8%87%AA%E5%8A%A8%E6%8F%90%E7%A4%BA.html&quot;&gt;WPF 用 AvalonEdit 开发简单的代码编辑器 支持高亮自动提示&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%BC%82%E4%BA%AE%E7%9A%84%E7%8E%B0%E4%BB%A3%E5%8C%96%E6%8E%A7%E4%BB%B6-%E6%96%B0-ModernWPF-%E7%95%8C%E9%9D%A2%E5%BA%93.html&quot;&gt;WPF 漂亮的现代化控件 新 ModernWPF 界面库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8%E5%9F%BA%E4%BA%8E-Chromium-%E5%86%85%E6%A0%B8%E7%9A%84-Microsoft-Edge-%E5%B0%81%E8%A3%85%E7%9A%84-WebView2-%E6%8E%A7%E4%BB%B6.html&quot;&gt;WPF 使用基于 Chromium 内核的 Microsoft Edge 封装的 WebView2 控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-MyScript-%E7%9A%84-IInk-%E5%81%9A%E6%89%8B%E5%86%99%E8%AF%86%E5%88%AB.html&quot;&gt;WPF 使用 MyScript 的 IInk 做手写识别&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;布局&quot;&gt;布局&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B8%83%E5%B1%80-%E5%9C%A8%E6%9C%89%E9%99%90%E7%A9%BA%E9%97%B4%E5%86%85%E8%AE%A9%E4%B8%A4%E4%B8%AA%E5%85%83%E7%B4%A0%E5%B0%BD%E5%8F%AF%E8%83%BD%E6%92%91%E5%BC%80%E7%9A%84%E4%BE%8B%E5%AD%90.html&quot;&gt;WPF 布局 在有限空间内让两个元素尽可能撑开的例子&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-UNO-%E6%B5%8B%E8%AF%95%E5%9B%BA%E5%AE%9A%E5%B0%BA%E5%AF%B8%E4%B8%94%E6%B0%B4%E5%B9%B3%E5%92%8C%E5%9E%82%E7%9B%B4%E5%AF%B9%E9%BD%90%E8%AE%BE%E7%BD%AE-Stretch-%E7%9A%84%E5%85%83%E7%B4%A0%E5%9C%A8%E5%AE%B9%E5%99%A8%E5%86%85%E7%9A%84%E5%B8%83%E5%B1%80%E8%A1%8C%E4%B8%BA.html&quot;&gt;WPF 测试固定尺寸且水平和垂直对齐设置 Stretch 的元素在容器内的布局行为&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%AD%89%E8%B7%9D%E5%B8%83%E5%B1%80.html&quot;&gt;WPF 等距布局&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99-VisualTreeHelper.GetDescendantBounds-%E5%B0%86%E8%BF%94%E5%9B%9E%E6%97%A0%E7%A9%B7%E5%A4%A7.html&quot;&gt;WPF 什么时候 VisualTreeHelper.GetDescendantBounds 将返回无穷大&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/wandia/p/17084881.html&quot;&gt;WrapPanel改进 - 老板娘的神秘商店 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-TranslatePoint-%E6%8D%A2%E7%AE%97%E5%85%83%E7%B4%A0%E4%B9%8B%E9%97%B4%E7%9B%B8%E5%AF%B9%E5%9D%90%E6%A0%87.html&quot;&gt;WPF 使用 TranslatePoint 换算元素之间相对坐标&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;xaml&quot;&gt;XAML&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/XAML-%E7%BB%99%E8%B5%84%E6%BA%90%E8%B5%B7%E4%B8%AA%E5%A5%BD%E5%90%8D%E5%AD%97-%E7%94%A8-StaticResource-%E8%B5%B7%E4%B8%80%E4%B8%AA%E5%88%AB%E5%90%8D.html&quot;&gt;XAML 给资源起个好名字 用 StaticResource 起一个别名&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8-XAML-%E5%86%99-C-%E4%BB%A3%E7%A0%81.html&quot;&gt;WPF 在 XAML 写 C# 代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87%E8%BE%85%E5%8A%A9%E6%96%B9%E6%B3%95%E5%9C%A8-csharp-%E4%BB%A3%E7%A0%81%E5%86%99%E5%87%BA-XAML-%E7%95%8C%E9%9D%A2%E6%95%88%E6%9E%9C.html&quot;&gt;WPF 通过辅助方法在 csharp 代码写出 XAML 界面效果&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Behavior-%E5%BA%93%E8%BE%85%E5%8A%A9%E8%8E%B7%E5%8F%96%E5%8A%A8%E6%80%81%E8%B5%84%E6%BA%90%E5%8F%98%E6%9B%B4%E4%BA%8B%E4%BB%B6.html&quot;&gt;WPF 使用 Behavior 库辅助获取动态资源变更事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-ShowMeTheXAML-%E6%98%BE%E7%A4%BA-WPF-%E7%9A%84-XAML-%E6%8E%A7%E4%BB%B6%E5%86%85%E5%AE%B9.html&quot;&gt;dotnet 使用 ShowMeTheXAML 显示 WPF 的 XAML 控件内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-dotnet-core-%E7%9A%84-Blend-SDK-Behaviors-%E5%BA%93.html&quot;&gt;WPF dotnet core 的 Blend SDK Behaviors 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/xaml-%E6%B7%BB%E5%8A%A0-region.html&quot;&gt;xaml 添加 region&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%82%B9%E5%87%BB%E6%8C%89%E9%92%AE%E6%97%B6%E6%9B%B4%E6%94%B9%E6%8C%89%E9%92%AE%E6%A0%B7%E5%BC%8F%E7%95%8C%E9%9D%A2%E6%95%88%E6%9E%9C%E7%9A%84-XAML-%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 点击按钮时更改按钮样式界面效果的 XAML 实现方法&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;图片&quot;&gt;图片&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E6%96%87%E4%BB%B6%E5%88%9B%E5%BB%BA%E5%9B%BE%E7%89%87%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 从文件创建图片的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E-DrawingVisual-%E8%BD%AC-BitmapImage-%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 从 DrawingVisual 转 BitmapImage 图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%AE%E6%94%B9%E5%9B%BE%E7%89%87%E9%A2%9C%E8%89%B2.html&quot;&gt;WPF 修改图片颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87%E4%BD%8D%E5%A4%84%E7%90%86%E5%90%88%E5%B9%B6%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 通过位处理合并图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9B%BE%E7%89%87%E7%A7%BB%E9%99%A4%E8%A7%86%E8%A7%89%E6%A0%91%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.html&quot;&gt;WPF 图片移除视觉树内存泄漏&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/gif-%E6%A0%BC%E5%BC%8F.html&quot;&gt;gif 格式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%B8%80%E4%B8%AA%E6%80%A7%E8%83%BD%E6%AF%94%E8%BE%83%E5%A5%BD%E7%9A%84-gif-%E8%A7%A3%E6%9E%90%E5%BA%93.html&quot;&gt;WPF 一个性能比较好的 gif 解析库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-Magick.NET-%E6%92%AD%E6%94%BE-gif-%E5%9B%BE%E7%89%87.html&quot;&gt;wpf 如何使用 Magick.NET 播放 gif 图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-GifBitmapDecoder-%E8%A7%A3%E6%9E%90-gif-%E6%A0%BC%E5%BC%8F.html&quot;&gt;wpf GifBitmapDecoder 解析 gif 格式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%92%AD%E6%94%BE-gif.html&quot;&gt;WPF 播放 gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-GifBitmapDecoder-%E8%B0%83%E7%94%A8-WIC-%E8%A7%A3%E6%9E%90-Gif-%E5%92%8C%E8%BF%9B%E8%A1%8C%E5%8A%A8%E7%94%BB%E6%92%AD%E6%94%BE%E7%9A%84%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 通过 GifBitmapDecoder 调用 WIC 解析 Gif 和进行动画播放的简单方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%9B%E5%BB%BA%E7%A9%BA%E7%99%BD%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 创建空白图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%AE%89%E5%85%A8%E4%BB%A3%E7%A0%81%E5%BF%AB%E9%80%9F%E4%BB%8E%E6%95%B0%E7%BB%84%E8%BD%AC-WriteableBitmap.html&quot;&gt;WPF 使用不安全代码快速从数组转 WriteableBitmap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-EXIF-%E8%AE%BE%E7%BD%AE%E5%92%8C%E8%AF%BB%E5%8F%96%E5%9B%BE%E7%89%87%E7%9A%84%E6%97%8B%E8%BD%AC%E4%BF%A1%E6%81%AF.html&quot;&gt;WPF 通过 EXIF 设置和读取图片的旋转信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-WriteableBitmap-%E5%AE%9E%E7%8E%B0-TAGC-%E4%BD%8E%E5%85%89%E5%A2%9E%E5%BC%BA%E6%95%88%E6%9E%9C%E7%AE%97%E6%B3%95.html&quot;&gt;WPF 通过 WriteableBitmap 实现 TAGC 低光增强效果算法&lt;/a&gt;
&lt;!-- [WPF 通过 WriteableBitmap 实现 TAGC 低光增强效果算法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19096083 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;文本&quot;&gt;文本&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%96%87%E5%AD%97%E6%8F%8F%E8%BE%B9.html&quot;&gt;WPF 文字描边&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%B9%E5%87%BA-popup-%E9%87%8C%E9%9D%A2%E7%9A%84-TextBox-%E6%97%A0%E6%B3%95%E8%BE%93%E5%85%A5%E6%B1%89%E5%AD%97.html&quot;&gt;WPF 弹出 popup 里面的 TextBox 无法输入汉字&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8B%BC%E9%9F%B3%E8%BE%93%E5%85%A5%E6%B3%95.html&quot;&gt;WPF 拼音输入法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%BE%97%E5%BD%93%E5%89%8D%E8%BE%93%E5%85%A5%E6%B3%95%E8%AF%AD%E8%A8%80%E5%8C%BA%E5%9F%9F.html&quot;&gt;WPF 获得当前输入法语言区域&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE%E8%BE%93%E5%85%A5%E5%8F%AA%E8%83%BD%E8%8B%B1%E6%96%87.html&quot;&gt;WPF 设置输入只能英文&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-TextBlock-%E4%B8%8A%E6%A0%87.html&quot;&gt;C＃ TextBlock 上标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-OpenXML-WPF-%E8%A7%A3%E6%9E%90%E5%AE%9E%E7%8E%B0-PPT-%E6%96%87%E6%9C%AC%E6%8F%8F%E8%BE%B9%E6%95%88%E6%9E%9C.html&quot;&gt;dotnet OpenXML WPF 解析实现 PPT 文本描边效果&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post代码占用的空/dotnet-%E8%A7%A3%E6%9E%90-TTF-%E5%AD%97%E4%BD%93%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F.html&quot;&gt;dotnet 解析 TTF 字体文件格式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E5%AD%97%E4%BD%93.html&quot;&gt;WPF 从文件加载字体&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%AE%80%E5%8D%95%E8%81%8A%E8%81%8A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-DrawGlyphRun-%E7%BB%98%E5%88%B6%E6%96%87%E6%9C%AC.html&quot;&gt;WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本&lt;/a&gt;
&lt;!-- [WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/15388005.html ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%B5%8B%E8%AF%95-GlyphTypeface-%E7%9A%84-Baseline-%E8%A1%8C%E4%B8%BA.html&quot;&gt;WPF 测试 GlyphTypeface 的 Baseline 行为&lt;/a&gt;
&lt;!-- [WPF 测试 GlyphTypeface 的 Baseline 行为 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18658843 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E6%9C%AC%E6%9C%BA%E6%89%80%E6%9C%89%E5%AD%97%E4%BD%93%E6%8B%BF%E5%88%B0%E6%AF%8F%E4%B8%AA%E5%AD%97%E7%AC%A6%E7%9A%84%E5%AE%BD%E5%BA%A6%E5%92%8C%E9%AB%98%E5%BA%A6.html&quot;&gt;WPF 获取本机所有字体拿到每个字符的宽度和高度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-FreeType-%E8%AF%BB%E5%8F%96%E5%92%8C%E7%BB%98%E5%88%B6%E5%AD%97%E4%BD%93.html&quot;&gt;dotnet C# 使用 FreeType 读取和绘制字体&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%96%87%E6%9C%AC%E6%A1%86%E8%BE%93%E5%85%A5%E6%B3%95-IME-%E8%B7%9F%E9%9A%8F%E5%85%89%E6%A0%87.html&quot;&gt;WPF 自定义文本框输入法 IME 跟随光标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%96%87%E6%9C%AC%E5%BA%93-%E8%81%8A%E8%81%8A%E8%A1%8C%E9%A6%96%E5%85%89%E6%A0%87%E7%9A%84%E8%A1%8C%E4%B8%BA.html&quot;&gt;文本库 聊聊行首光标的行为&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%97%8F%E6%96%87%E7%9A%84%E5%AD%97%E6%95%B0.html&quot;&gt;dotnet C# 如何正确获取藏文的字数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%AD%97%E4%BD%93-FontStyle-%E7%9A%84-Italic-%E5%92%8C-Oblique-%E7%9A%84%E5%8C%BA%E5%88%AB.html&quot;&gt;WPF 字体 FontStyle 的 Italic 和 Oblique 的区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3-SelectionTextBrush-%E8%AE%BE%E7%BD%AE%E6%97%A0%E6%95%88%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 解决 SelectionTextBrush 设置无效问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-How-to-get-plain-text-from-RichTextBox.html&quot;&gt;WPF How to get plain text from RichTextBox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-PreviewTextInput-%E5%9C%A8%E9%BC%A0%E6%A0%87%E8%BE%93%E5%85%A5%E8%8E%B7%E5%BE%97-_u0003.html&quot;&gt;wpf PreviewTextInput 在鼠标输入获得 \u0003&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8E%A2%E7%B4%A2-Skia-%E7%9A%84%E7%AB%96%E6%8E%92%E6%96%87%E6%9C%AC%E6%B8%B2%E6%9F%93%E7%9A%84%E5%AD%97%E7%AC%A6%E9%AB%98%E5%BA%A6.html&quot;&gt;WPF 探索 Skia 的竖排文本渲染的字符高度&lt;/a&gt;
&lt;!-- [WPF 探索 Skia 的竖排文本渲染的字符高度 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18815810 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;线程&quot;&gt;线程&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E8%B7%A8%E7%BA%BF%E7%A8%8B%E9%87%8D%E6%96%B0%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 如何跨线程重新抛出异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE%E8%B5%84%E6%BA%90%E5%AD%97%E5%85%B8%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E8%AF%BB%E5%86%99%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 设置资源字典多线程安全读写方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%AE%80%E5%8D%95%E5%88%A4%E6%96%AD%E4%B8%BB%E7%BA%BF%E7%A8%8B%E7%95%8C%E9%9D%A2%E6%98%AF%E5%90%A6%E5%8D%A1%E9%A1%BF%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 简单判断主线程界面是否卡顿的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E8%B7%A8%E7%BA%BF%E7%A8%8B%E5%A4%84%E7%90%86-ObservableCollection-%E6%95%B0%E6%8D%AE.html&quot;&gt;WPF 多线程下跨线程处理 ObservableCollection 数据&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%B7%A8%E7%BA%BF%E7%A8%8B-UI-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 跨线程 UI 的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-%E4%BD%BF%E7%94%A8-Dispatcher.Invoke-%E5%86%BB%E7%BB%93%E7%AA%97%E5%8F%A3.html&quot;&gt;wpf 使用 Dispatcher.Invoke 冻结窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Dispatcher-%E7%9A%84-InvokeAsync-%E5%92%8C-BeginInvoke-%E7%9A%84%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E5%B7%AE%E5%88%AB.html&quot;&gt;WPF 使用 Dispatcher 的 InvokeAsync 和 BeginInvoke 的异常处理差别&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;窗口&quot;&gt;窗口&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%B8%80%E4%B8%AA%E7%A9%BA%E7%9A%84-WPF-%E7%A8%8B%E5%BA%8F%E6%9C%89%E5%A4%9A%E5%B0%91%E4%B8%AA%E7%AA%97%E5%8F%A3.html&quot;&gt;WPF 一个空的 WPF 程序有多少个窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%86%85%E9%83%A8%E7%9A%845%E4%B8%AA%E7%AA%97%E5%8F%A3%E4%B9%8B-MediaContextNotificationWindow.html&quot;&gt;WPF 内部的5个窗口之 MediaContextNotificationWindow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E7%9A%84%E6%89%80%E6%9C%89%E7%AA%97%E5%8F%A3.html&quot;&gt;WPF 获取应用的所有窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3%E5%BC%B9%E5%87%BA%E6%A8%A1%E6%80%81%E7%AA%97%E5%8F%A3%E5%85%B3%E9%97%AD%E5%90%8E-%E4%B8%BB%E7%AA%97%E5%8F%A3%E4%B8%8D%E5%9C%A8%E6%9C%80%E5%89%8D.html&quot;&gt;WPF 解决弹出模态窗口关闭后，主窗口不在最前&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%A9%E7%AA%97%E5%8F%A3%E6%BF%80%E6%B4%BB%E4%BD%9C%E4%B8%BA%E5%89%8D%E5%8F%B0%E6%9C%80%E4%B8%8A%E5%B1%82%E7%AA%97%E5%8F%A3%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 让窗口激活作为前台最上层窗口的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%B8%A4%E4%B8%AA-Topmost-%E7%9A%84%E7%AA%97%E5%8F%A3%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E8%B0%81%E5%9C%A8%E6%9C%80%E4%B8%8A%E6%96%B9.html&quot;&gt;WPF 两个 Topmost 的窗口如何设置谁在最上方&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E6%9F%90%E4%B8%AA%E7%AA%97%E5%8F%A3%E7%9A%84%E6%89%80%E6%9C%89%E5%AD%90%E7%AA%97%E5%8F%A3.html&quot;&gt;WPF 获取某个窗口的所有子窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE-ShowInTaskbar-%E5%AF%B9%E7%AA%97%E5%8F%A3%E6%9C%80%E5%B0%8F%E5%8C%96%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;WPF 设置 ShowInTaskbar 对窗口最小化的影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E6%94%AF%E6%8C%81%E7%82%B9%E5%87%BB%E7%A9%BF%E9%80%8F%E7%9A%84%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84%E9%80%8F%E6%98%8E%E8%83%8C%E6%99%AF%E5%BC%82%E5%BD%A2%E7%AA%97%E5%8F%A3.html&quot;&gt;WPF 制作支持点击穿透的高性能的透明背景异形窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Win32-%E4%BD%BF%E7%94%A8-SetCurrentProcessExplicitAppUserModelID-%E5%85%B3%E8%81%94%E5%A4%9A%E4%B8%AA%E8%BF%9B%E7%A8%8B-%E5%9C%A8%E4%BB%BB%E5%8A%A1%E6%A0%8F%E5%90%88%E5%B9%B6-WPF-%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%AA%97%E5%8F%A3.html&quot;&gt;Win32 使用 SetCurrentProcessExplicitAppUserModelID 关联多个进程 在任务栏合并 WPF 多进程窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%A8%B3%E5%AE%9A%E7%9A%84%E5%85%A8%E5%B1%8F%E5%8C%96%E7%AA%97%E5%8F%A3%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 稳定的全屏化窗口方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8-SetWindowPos-%E6%96%B9%E6%B3%95%E8%AE%BE%E7%BD%AE%E4%B8%80%E4%B8%AA%E5%81%9C%E6%AD%A2%E5%93%8D%E5%BA%94%E7%9A%84%E7%AA%97%E5%8F%A3%E5%B0%86%E5%8D%A1%E8%B0%83%E7%94%A8%E6%96%B9.html&quot;&gt;用 SetWindowPos 方法设置一个停止响应的窗口将卡调用方&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%85%A8%E5%B1%8F%E9%80%8F%E6%98%8E%E7%AA%97%E5%8F%A3.html&quot;&gt;WPF 全屏透明窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%B7%BB%E5%8A%A0%E7%AA%97%E5%8F%A3%E6%B6%88%E6%81%AF%E9%92%A9%E5%AD%90%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 添加窗口消息钩子方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8-Alt+Tab-%E9%9A%90%E8%97%8F%E7%AA%97%E5%8F%A3.html&quot;&gt;WPF 在 Alt+Tab 隐藏窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E5%85%A8%E5%B1%80%E6%89%80%E6%9C%89%E7%AA%97%E5%8F%A3%E7%9A%84%E5%88%9B%E5%BB%BA%E6%98%BE%E7%A4%BA%E4%BA%8B%E4%BB%B6-%E7%9B%91%E6%8E%A7%E7%AA%97%E5%8F%A3%E6%89%93%E5%BC%80.html&quot;&gt;WPF 获取全局所有窗口的创建显示事件 监控窗口打开&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-SetWindowDisplayAffinity-%E9%85%8D%E7%BD%AE%E7%A6%81%E6%AD%A2%E5%AF%B9%E7%AA%97%E5%8F%A3%E8%BF%9B%E8%A1%8C%E6%88%AA%E5%9B%BE%E6%88%96%E5%BD%95%E5%B1%8F.html&quot;&gt;WPF 通过 SetWindowDisplayAffinity 配置禁止对窗口进行截图或录屏&lt;/a&gt;
&lt;!-- [WPF 通过 SetWindowDisplayAffinity 配置禁止对窗口进行截图或录屏 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18250172 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/dino623/p/custom_window_style_using_WindowChrome.html&quot;&gt;[WPF 自定义控件] 使用WindowChrome自定义Window Style - dino.c - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/wpf-simulate-native-window-style-using-window-chrome.html&quot;&gt;WPF 使用 WindowChrome，在自定义窗口标题栏的同时最大程度保留原生窗口样式（类似 UWP/Chrome） - walterlv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/jasongrass/p/18555472&quot;&gt;将 WPF 嵌入到 MFC 中，无法响应键盘输入 - J.晒太阳的猫 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;渲染&quot;&gt;渲染&lt;/h3&gt;

&lt;p&gt;更多请看 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html#wpf-%E6%B8%B2%E6%9F%93%E7%9B%B8%E5%85%B3&quot;&gt;WPF 渲染相关&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E7%94%BB%E5%87%BA1%E5%83%8F%E7%B4%A0%E7%9A%84%E7%BA%BF.html&quot;&gt;WPF 如何画出1像素的线&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3-ViewBox-%E4%B8%8D%E6%98%BE%E7%A4%BA%E7%BA%BF%E7%9A%84%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 解决 ViewBox 不显示线的问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-DrawingContext-DrawImage-%E7%BB%98%E5%88%B6%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 通过 DrawingContext DrawImage 绘制图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E7%A1%80%E7%BB%98%E5%9B%BE-%E5%88%9B%E5%BB%BA%E5%92%8C%E5%8A%A0%E5%B7%A5%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 基础绘图 创建和加工图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%9C%A8-WriteableBitmap-%E5%86%99%E6%96%87%E5%AD%97.html&quot;&gt;WPF 如何在 WriteableBitmap 写文字&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E7%BB%99%E5%AE%9A%E4%B8%A4%E4%B8%AA%E7%82%B9%E7%94%BB%E5%87%BA%E4%B8%80%E6%9D%A1%E6%B3%A2%E6%B5%AA%E7%BA%BF.html&quot;&gt;WPF 如何给定两个点画出一条波浪线&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-DrawingVisual.html&quot;&gt;WPF DrawingVisual&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E4%B8%A4%E4%B8%AA-LinearGradientBrush-%E7%9B%B8%E7%AD%89.html&quot;&gt;WPF 如何判断两个 LinearGradientBrush 相等&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8-DrawingContext-%E7%9A%84-push-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8.html&quot;&gt;WPF 在 DrawingContext 的 push 如何使用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE%E7%BA%AF%E8%BD%AF%E4%BB%B6%E6%B8%B2%E6%9F%93.html&quot;&gt;WPF 设置纯软件渲染&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%AC%94%E5%88%B7%E7%BB%91%E5%AE%9A%E4%B8%8D%E4%B8%8A%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;WPF 笔刷绑定不上可能的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%B0%83%E7%94%A8-InvalidateVisual-%E4%B8%8D%E8%A7%A6%E5%8F%91-OnRender-%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;WPF 调用 InvalidateVisual 不触发 OnRender 的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3-Skia-%E5%9B%A0%E4%B8%BA%E6%89%BE%E4%B8%8D%E5%88%B0%E5%AD%97%E4%BD%93%E8%80%8C%E7%BB%98%E5%88%B6%E4%B8%8D%E5%87%BA%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6.html&quot;&gt;WPF 解决 Skia 因为找不到字体而绘制不出中文字符&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Skia-%E7%BB%98%E5%88%B6-WriteableBitmap-%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 使用 Skia 绘制 WriteableBitmap 图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E6%9C%89%E5%93%AA%E4%BA%9B-VisualBrush-%E7%94%A8%E4%BA%86%E6%9F%90%E4%B8%AA%E6%8E%A7%E4%BB%B6.html&quot;&gt;WPF 如何获取有哪些 VisualBrush 用了某个控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-WPF-%E9%87%8C%E6%98%BE%E7%A4%BA%E6%95%B0%E5%AD%A6-%CF%80-%E7%9A%84%E9%A2%9C%E8%89%B2.html&quot;&gt;dotnet 在 WPF 里显示数学 π 的颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%9B%B4%E6%94%B9-DrawingVisual-%E7%9A%84-RenderOpen-%E7%94%A8%E5%88%B0%E7%9A%84%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%86%85%E5%AE%B9%E5%B0%86%E6%8C%81%E7%BB%AD%E5%BD%B1%E5%93%8D%E6%B8%B2%E6%9F%93%E6%95%88%E6%9E%9C.html&quot;&gt;WPF 更改 DrawingVisual 的 RenderOpen 用到的对象的内容将持续影响渲染效果&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%AE%80%E5%8D%95%E8%81%8A%E8%81%8A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-DrawGlyphRun-%E7%BB%98%E5%88%B6%E6%96%87%E6%9C%AC.html&quot;&gt;WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A8%A1%E6%8B%9F-WPFMediaKit-%E7%9A%84-D3D-%E9%85%8D%E7%BD%AE%E7%94%A8%E6%9D%A5%E6%B5%8B%E8%AF%954k%E6%80%A7%E8%83%BD.html&quot;&gt;WPF 模拟 WPFMediaKit 的 D3D 配置用来测试4k性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Direct-Manipulation-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 使用 Direct Manipulation 的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Composition-API-%E5%81%9A%E9%AB%98%E6%80%A7%E8%83%BD%E6%B8%B2%E6%9F%93.html&quot;&gt;WPF 使用 Composition API 做高性能渲染&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%B8%B2%E6%9F%93%E7%BA%A7%E5%88%AB.html&quot;&gt;WPF 渲染级别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Win2d-%E6%B8%B2%E6%9F%93.html&quot;&gt;WPF 使用 Win2d 渲染&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%BA%94%E7%94%A8-%E4%B8%80%E5%8D%83%E4%B8%AA%E5%8D%8A%E9%80%8F%E6%98%8E%E7%9F%A9%E5%BD%A2%E5%81%9A%E5%8A%A8%E7%94%BB.html&quot;&gt;WPF 动画性能测试应用 一千个半透明矩形做动画&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96-MediaContext-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 获取 MediaContext 的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE-Aliased-%E7%9A%84-EdgeMode-%E4%BC%9A%E8%AE%A9%E5%9C%86%E5%BD%A2%E6%B8%B2%E6%9F%93%E5%87%BA%E6%A3%B1%E8%A7%92.html&quot;&gt;WPF 设置 Aliased 的 EdgeMode 会让圆形渲染出棱角&lt;/a&gt;
&lt;!-- [WPF 设置 Aliased 的 EdgeMode 会让圆形渲染出棱角 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18905146 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-Windows-%E6%A1%8C%E9%9D%A2%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8-DwmFlush-%E5%AF%B9%E9%BD%90%E5%88%B7%E6%96%B0%E7%8E%87.html&quot;&gt;dotnet C# Windows 桌面应用程序简单使用 DwmFlush 对齐刷新率&lt;/a&gt;
&lt;!-- [dotnet C# Windows 桌面应用程序简单使用 DwmFlush 对齐刷新率 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18932218 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%9D%E6%8C%81%E5%90%8C%E4%B8%80%E4%B8%AA-HWND-%E5%B0%86%E7%AA%97%E5%8F%A3%E4%BB%8E-X8-%E5%8D%95%E5%90%91%E5%8D%87%E7%BA%A7%E5%88%B0-A8-%E9%80%8F%E6%98%8E%E6%B8%B2%E6%9F%93.html&quot;&gt;WPF 保持同一个 HWND 将窗口从 X8 单向升级到 A8 透明渲染&lt;/a&gt;
&lt;!-- [WPF 保持同一个 HWND 将窗口从 X8 单向升级到 A8 透明渲染 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/22019848 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8%E5%83%8F%E7%B4%A0%E7%9D%80%E8%89%B2%E5%99%A8%E5%AE%9E%E7%8E%B0%E5%8D%95%E5%BA%94%E5%8F%98%E6%8D%A2.html&quot;&gt;WPF 使用像素着色器实现单应变换&lt;/a&gt;
&lt;!-- [WPF 使用像素着色器实现单应变换 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/22296691 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;视频&quot;&gt;视频&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-VideoDrawing-%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.html&quot;&gt;WPF 使用 VideoDrawing 播放视频&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/xymfblogs/archive/2022/12/15/16983553.html&quot;&gt;[WPF] MediaElement播放HDR视频泛黄、颜色显示不正确应该如何解决？ - 王_先_生 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;动画&quot;&gt;动画&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%90%8E%E5%8F%B0%E4%BB%A3%E7%A0%81%E5%81%9A-TranslateTransform-%E7%9A%84%E5%8A%A8%E7%94%BB.html&quot;&gt;WPF 后台代码做 TranslateTransform 的动画&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8A%A8%E7%94%BB%E5%AE%9E%E6%88%98-%E7%82%B9%E5%87%BB%E6%97%B6%E6%98%BE%E7%A4%BA%E5%9C%86%E5%9C%88%E6%B7%A1%E5%87%BA%E6%95%88%E6%9E%9C.html&quot;&gt;WPF 动画实战 点击时显示圆圈淡出效果&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;平台调用-1&quot;&gt;平台调用&lt;/h3&gt;

&lt;h4 id=&quot;win32&quot;&gt;Win32&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%89%93%E5%BC%80%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86%E5%99%A8%E4%B8%94%E9%80%89%E4%B8%AD%E6%9F%90%E4%B8%AA%E6%96%87%E4%BB%B6.html&quot;&gt;WPF 打开资源管理器且选中某个文件&lt;/a&gt;
&lt;!-- [WPF 打开资源管理器且选中某个文件 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18548977 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E5%B1%8F%E5%B9%95%E6%9F%90%E4%B8%AA%E7%82%B9%E7%9A%84%E9%A2%9C%E8%89%B2.html&quot;&gt;WPF 获取屏幕某个点的颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%AE%E6%94%B9%E5%B1%8F%E5%B9%95%E4%BA%AE%E5%BA%A6.html&quot;&gt;WPF 修改屏幕亮度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-RawInput-%E6%8E%A5%E6%94%B6%E8%A3%B8%E6%95%B0%E6%8D%AE.html&quot;&gt;WPF 使用 RawInput 接收裸数据&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8E%A2%E7%B4%A2%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8%E7%9A%84%E8%BF%9B%E7%A8%8B%E5%88%86%E7%BB%84%E9%80%BB%E8%BE%91.html&quot;&gt;WPF 探索任务管理器的进程分组逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-DisplayConfigGetDeviceInfo-%E8%8E%B7%E5%8F%96%E6%98%BE%E7%A4%BA%E5%99%A8%E5%90%8D%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 使用 DisplayConfigGetDeviceInfo 获取显示器名的方法&lt;/a&gt;
&lt;!-- [WPF 使用 DisplayConfigGetDeviceInfo 获取显示器名的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19333992 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;winrt&quot;&gt;WinRT&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%B8%8D%E5%AE%89%E8%A3%85-WindowsAppSDK-%E4%BD%BF%E7%94%A8-WinRT-%E5%8A%9F%E8%83%BD%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 不安装 WindowsAppSDK 使用 WinRT 功能的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%AE%E5%A4%8D-WPF-%E5%AE%89%E8%A3%85-WindowsAppSDK-%E5%BA%93%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5-NETSDK1082-%E5%92%8C-NETSDK1112-%E6%89%BE%E4%B8%8D%E5%88%B0-win10-arm-%E5%A4%B1%E8%B4%A5.html&quot;&gt;修复 WPF 安装 WindowsAppSDK 库构建失败 NETSDK1082 和 NETSDK1112 找不到 win10-arm 失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Win10-%E7%9A%84-WinRT-%E8%87%AA%E5%B8%A6-Windows.Media.Ocr-%E5%AE%9E%E7%8E%B0%E5%9B%BE%E7%89%87%E8%BD%AC%E6%96%87%E6%9C%AC.html&quot;&gt;WPF 使用 Win10 的 WinRT 自带 Windows.Media.Ocr 实现图片转文本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-WindowsAppSDK-%E4%BD%BF%E7%94%A8-WinRT-%E7%9A%84%E6%89%8B%E5%86%99%E8%AF%86%E5%88%AB%E5%8A%9F%E8%83%BD.html&quot;&gt;WPF 通过 WindowsAppSDK 使用 WinRT 的手写识别功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-WinRT-%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%B8%A6%E7%9A%84%E5%88%86%E8%AF%8D%E5%BA%93%E5%AF%B9%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%96%87%E6%9C%AC%E8%BF%9B%E8%A1%8C%E5%88%86%E8%AF%8D.html&quot;&gt;UWP WinRT 使用系统自带的分词库对字符串文本进行分词&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%B8%8D%E5%B8%A6-TargetPlatformVersion-%E6%98%BE%E7%A4%BA-Win10-%E7%9A%84-Toast-%E9%80%9A%E7%9F%A5%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 不带 TargetPlatformVersion 显示 Win10 的 Toast 通知的方法&lt;/a&gt;
&lt;!-- [WPF 不带 TargetPlatformVersion 显示 Win10 的 Toast 通知的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18333724 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpf-基础-2d-图形学知识&quot;&gt;WPF 基础 2D 图形学知识&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E7%A1%80-2D-%E5%9B%BE%E5%BD%A2%E5%AD%A6%E7%9F%A5%E8%AF%86.html&quot;&gt;WPF 基础 2D 图形学知识&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E7%A1%80-2D-%E5%9B%BE%E5%BD%A2%E5%AD%A6%E7%9F%A5%E8%AF%86-%E5%88%A4%E6%96%AD%E7%82%B9%E6%98%AF%E5%90%A6%E5%9C%A8%E7%BA%BF%E6%AE%B5%E4%B8%8A.html&quot;&gt;WPF 基础 2D 图形学知识 判断点是否在线段上&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E7%A1%80-2D-%E5%9B%BE%E5%BD%A2%E5%AD%A6%E7%9F%A5%E8%AF%86-%E5%88%A4%E6%96%AD%E7%82%B9%E6%98%AF%E5%90%A6%E5%9C%A8%E4%BB%BB%E6%84%8F%E5%87%A0%E4%BD%95%E5%86%85%E9%83%A8%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 基础 2D 图形学知识 判断点是否在任意几何内部方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E7%A1%80-2D-%E5%9B%BE%E5%BD%A2%E5%AD%A6%E7%9F%A5%E8%AF%86-%E6%B1%82%E5%90%91%E9%87%8F%E6%97%8B%E8%BD%AC%E8%A7%92%E5%BA%A6.html&quot;&gt;WPF 基础 2D 图形学知识 求向量旋转角度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%88%A4%E6%96%AD%E4%B8%A4%E6%9D%A1%E7%9B%B4%E7%BA%BF%E8%B7%9D%E7%A6%BB.html&quot;&gt;C# 判断两条直线距离&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%B7%B2%E7%9F%A5%E7%82%B9%E5%92%8C%E5%90%91%E9%87%8F-%E6%B1%82%E8%B7%9D%E7%A6%BB%E7%9A%84%E7%82%B9.html&quot;&gt;C# 已知点和向量，求距离的点&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E7%9F%A9%E5%BD%A2%E5%86%85%E4%B8%80%E4%B8%AA%E5%9D%90%E6%A0%87%E7%9B%B8%E5%AF%B9%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9F%A9%E5%BD%A2%E7%9A%84%E5%9D%90%E6%A0%87.html&quot;&gt;WPF 如何计算矩形内一个坐标相对另一个矩形的坐标&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpf-已知问题&quot;&gt;WPF 已知问题&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E7%AA%97%E5%8F%A3%E5%9C%A8%E5%B1%8F%E5%B9%95%E5%A4%96%E5%88%9B%E5%BB%BA%E5%B0%86%E4%B8%8D%E4%BC%9A%E5%88%B7%E6%96%B0%E6%B8%B2%E6%9F%93.html&quot;&gt;WPF 已知问题 窗口在屏幕外创建将不会刷新渲染&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%85%A8%E5%B1%8F%E9%80%8F%E6%98%8E%E7%AA%97%E5%8F%A3%E5%BC%B9%E5%87%BA%E5%AD%90%E7%AA%97%E5%8F%A3%E4%BC%9A%E9%97%AA%E7%83%81.html&quot;&gt;WPF 已知问题 全屏透明窗口弹出子窗口会闪烁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-BitmapDecoder.Create-%E4%B8%8D%E6%94%AF%E6%8C%81%E4%BC%A0%E5%85%A5-Asynchronous-%E7%9A%84%E6%96%87%E4%BB%B6%E6%B5%81.html&quot;&gt;WPF 已知问题 BitmapDecoder.Create 不支持传入 Asynchronous 的文件流&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/wpf-VisualBrush-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98.html&quot;&gt;wpf VisualBrush 已知问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-Popup-%E5%90%83%E6%8E%89-PreviewMouseDown-%E4%BA%8B%E4%BB%B6.html&quot;&gt;WPF 已知问题 Popup 吃掉 PreviewMouseDown 事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-Popup-%E5%A4%B1%E7%84%A6%E5%90%8E%E5%AF%BC%E8%87%B4-ListBox-%E6%97%A0%E6%B3%95%E7%94%A8-MouseWheel-%E6%BB%9A%E5%8A%A8%E9%97%AE%E9%A2%98%E5%92%8C%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 已知问题 Popup 失焦后导致 ListBox 无法用 MouseWheel 滚动问题和解决方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E8%B5%84%E6%BA%90%E5%AD%97%E5%85%B8%E6%A0%91%E5%BC%95%E7%94%A8%E4%B8%8E%E8%B5%84%E6%BA%90%E5%AF%BB%E6%89%BE%E7%9A%84%E5%9D%91.html&quot;&gt;WPF 已知问题 资源字典树引用与资源寻找的坑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B0%86-StaticResource-%E5%92%8C-ResourceDictionary-%E6%94%BE%E5%9C%A8%E4%B8%80%E8%B5%B7%E7%9A%84%E9%AD%94%E5%B9%BB%E8%A1%8C%E4%B8%BA.html&quot;&gt;WPF 将 StaticResource 和 ResourceDictionary 放在一起的魔幻行为&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8A%A0%E8%BD%BD%E8%AF%A1%E5%BC%82%E7%9A%84%E5%AD%97%E4%BD%93%E6%97%A0%E6%B3%95%E5%B8%83%E5%B1%80.html&quot;&gt;WPF 加载诡异的字体无法布局&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BB%99-Pen-%E7%9A%84-DashStyle-%E8%AE%BE%E7%BD%AE-0-0-%E7%9A%84%E8%99%9A%E7%BA%BF%E6%95%B0%E7%BB%84%E5%B0%86%E4%BC%9A%E8%AE%A9%E6%B8%B2%E6%9F%93%E7%BA%BF%E7%A8%8B%E6%B6%88%E8%80%97%E5%A4%A7%E9%87%8F-CPU-%E8%B5%84%E6%BA%90.html&quot;&gt;WPF 给 Pen 的 DashStyle 设置 0 0 的虚线数组将会让渲染线程消耗大量 CPU 资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%8C%85%E5%90%AB-NaN-%E7%9A%84-Geometry-%E5%87%A0%E4%BD%95%E5%8F%AF%E8%83%BD%E5%AF%BC%E8%87%B4%E6%B8%B2%E6%9F%93%E5%B1%82%E6%8A%9B%E5%87%BA-UCEERR_RENDERTHREADFAILURE-%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 已知问题 包含 NaN 的 Geometry 几何可能导致渲染层抛出 UCEERR_RENDERTHREADFAILURE 异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E6%9F%90%E4%BA%9B%E8%AE%BE%E5%A4%87%E4%B8%8A%E7%9A%84%E5%BA%94%E7%94%A8%E5%9C%A8-WindowChromeWorker-%E6%8A%9B%E5%87%BA-System.OverflowException-%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 已知问题 某些设备上的应用在 WindowChromeWorker 抛出 System.OverflowException 异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BA%94%E7%94%A8%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E5%90%8C%E6%97%B6%E5%90%AF%E5%8A%A8%E5%A4%9A%E4%B8%AA-UI-%E7%BA%BF%E7%A8%8B%E4%B8%94%E8%AE%BF%E9%97%AE-ContentPresenter-%E5%8F%AF%E8%83%BD%E8%AE%A9%E5%A4%9A%E4%B8%AA-UI-%E7%BA%BF%E7%A8%8B%E4%BA%92%E7%AD%89.html&quot;&gt;WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E6%89%A7%E8%A1%8C%E7%AC%A6%E5%90%88%E6%8C%87%E5%AE%9A%E7%9A%84%E7%BB%91%E5%AE%9A%E7%BA%A6%E6%9D%9F%E7%9A%84%E8%B0%83%E7%94%A8%E6%97%B6%E5%BC%95%E5%8F%91%E4%BA%86%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 类型的构造函数执行符合指定的绑定约束的调用时引发了异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win7-%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8-WPF-%E7%A8%8B%E5%BA%8F-D3Dcompiler_47.dll-%E4%B8%A2%E5%A4%B1.html&quot;&gt;win7 无法启动 WPF 程序 D3Dcompiler_47.dll 丢失&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-RenderTargetBitmap-%E5%BF%AB%E9%80%9F%E6%88%AA%E5%9B%BE%E5%87%BA%E7%8E%B0-COMException-%E6%8F%90%E7%A4%BA.html&quot;&gt;WPF 使用 RenderTargetBitmap 快速截图出现 COMException 提示&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%96%B0%E5%BB%BA%E7%94%A8%E6%88%B7%E6%8E%A7%E4%BB%B6%E6%8F%90%E7%A4%BA-Error-MC3000-%E9%A6%96%E4%B8%AA-xaml-%E5%AD%97%E7%AC%A6%E4%B8%8D%E5%90%88%E6%B3%95.html&quot;&gt;WPF 新建用户控件提示 Error MC3000 首个 xaml 字符不合法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8%E7%AA%97%E5%8F%A3%E7%9A%84-Deactivated-%E4%BD%BF%E7%94%A8-Mouse-%E7%9A%84-Capture-%E5%B0%86%E4%BC%9A%E8%AE%A9%E8%BF%9B%E7%A8%8B%E5%A4%B1%E5%8E%BB%E4%BA%A4%E4%BA%92.html&quot;&gt;WPF 在窗口的 Deactivated 使用 Mouse 的 Capture 将会让进程失去交互&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B0%86%E6%8E%A7%E4%BB%B6%E6%94%BE%E5%85%A5%E5%88%B0-UserControl-%E9%87%8C%E8%8E%B7%E5%8F%96-HwndSource-%E4%B8%BA%E7%A9%BA%E7%9A%84%E6%83%85%E5%86%B5.html&quot;&gt;WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3-PathTooLongException-%E8%B7%AF%E5%BE%84%E5%A4%AA%E9%95%BF.html&quot;&gt;WPF 解决 PathTooLongException 路径太长&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE-WS_EX_TRANSPARENT-%E8%A7%A6%E6%91%B8%E5%A4%B1%E6%95%88.html&quot;&gt;WPF 设置 WS_EX_TRANSPARENT 触摸失效&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3-StylusPlugIn-%E7%82%B9%E5%87%BB%E7%A9%BF%E9%80%8F%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 解决 StylusPlugIn 点击穿透问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%BC%80%E5%90%AF-WM_Pointer-%E6%B6%88%E6%81%AF%E4%B9%8B%E5%90%8E-%E8%8E%B7%E5%8F%96%E5%89%AF%E5%B1%8F%E8%A7%A6%E6%91%B8%E6%95%B0%E6%8D%AE%E5%9D%90%E6%A0%87%E5%81%8F%E7%A7%BB.html&quot;&gt;WPF 已知问题 开启 WM_Pointer 消息之后 获取副屏触摸数据坐标偏移&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AD%A6%E6%83%95-StylusPlugIn-%E7%9A%84%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 警惕 StylusPlugIn 的多线程安全问题&lt;/a&gt;
&lt;!-- [WPF 警惕 StylusPlugIn 的多线程安全问题 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19085065 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BD%91%E7%BB%9C-request-%E7%9A%84-read-%E6%96%B9%E6%B3%95%E4%B8%8D%E4%BC%9A%E8%BF%94%E5%9B%9E.html&quot;&gt;WPF 网络 request 的 read 方法不会返回&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%85%89%E6%A0%87%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84%E6%97%B6%E5%80%99-temp-%E6%96%87%E4%BB%B6%E5%A4%B9%E6%BB%A1%E4%BA%86%E6%97%A0%E6%B3%95%E5%88%9B%E5%BB%BA.html&quot;&gt;WPF 光标初始化的时候 temp 文件夹满了无法创建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8B%96%E5%8A%A8%E6%97%B6%E5%87%BA%E7%8E%B0-Invalid-FORMATETC-structure.html&quot;&gt;WPF 拖动时出现 Invalid FORMATETC structure&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-Process.Start-%E5%87%BA%E7%8E%B0-Win32Exception-%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF Process.Start 出现 Win32Exception 异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-InputEventArgs-%E7%9A%84-Timestamp-%E5%B1%9E%E6%80%A7%E6%98%AF%E9%9D%99%E6%80%81%E7%9A%84%E5%AF%BC%E8%87%B4%E4%BA%8B%E4%BB%B6%E4%B9%8B%E9%97%B4%E7%9B%B8%E4%BA%92%E5%BD%B1%E5%93%8D.html&quot;&gt;WPF 已知问题 InputEventArgs 的 Timestamp 属性是静态的导致事件之间相互影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-Frame-%E7%9A%84-DataContext-%E4%B8%8D%E8%83%BD%E8%A2%AB-Page-%E7%BB%A7%E6%89%BF.html&quot;&gt;WPF Frame 的 DataContext 不能被 Page 继承&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-DelegateCommand-%E5%87%BA%E7%8E%B0Specified-cast-is-not-valid.html&quot;&gt;WPF DelegateCommand 出现Specified cast is not valid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-VisualBrush-%E5%9C%A8-4k-%E5%8A%A0-200-DPI-%E8%AE%BE%E5%A4%87%E4%B8%8A%E6%9F%90%E4%BA%9B%E6%96%87%E6%9C%AC%E4%B8%8D%E6%B8%B2%E6%9F%93%E7%9C%8B%E4%B8%8D%E8%A7%81%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 使用 VisualBrush 在 4k 加 200 DPI 设备上某些文本不渲染看不见问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-Win8.1-%E6%9F%90%E5%BA%94%E7%94%A8%E6%B8%B2%E6%9F%93%E6%8A%9B%E5%87%BA-OutOfMemoryException-%E5%BC%82%E5%B8%B8%E5%8F%8A%E4%BF%AE%E5%A4%8D%E6%96%B9%E6%B3%95.html&quot;&gt;记 Win8.1 某应用渲染抛出 OutOfMemoryException 异常及修复方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%95%8C%E9%9D%A2%E6%89%93%E4%B8%8D%E5%BC%80%E6%8F%90%E7%A4%BA-System.ArithmeticException-Overflow-or-underflow-in-the-arithmetic-operation-%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 界面打不开提示 System.ArithmeticException Overflow or underflow in the arithmetic operation 异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AD%A6%E6%83%95%E4%BD%BF%E7%94%A8-Dispatcher.InvokeShutdown-%E6%96%B9%E6%B3%95%E9%80%80%E5%87%BA%E5%BA%94%E7%94%A8-%E5%B0%86%E4%B8%8D%E8%A7%A6%E5%8F%91-Application.Exit-%E4%BA%8B%E4%BB%B6.html&quot;&gt;WPF 警惕使用 Dispatcher.InvokeShutdown 方法退出应用 将不触发 Application.Exit 事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E4%BC%A0%E5%85%A5%E9%94%99%E8%AF%AF%E6%95%B0%E6%8D%AE%E7%BB%99%E5%88%B0-WriteableBitmap-%E5%8F%AF%E8%83%BD%E5%AF%BC%E8%87%B4%E6%B8%B2%E6%9F%93%E7%BA%BF%E7%A8%8B%E9%94%81%E4%BD%8F.html&quot;&gt;WPF 已知问题 传入错误数据给到 WriteableBitmap 可能导致渲染线程锁住&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-Separator-%E6%97%A0%E6%B3%95%E5%BA%94%E7%94%A8-ContextMenu-%E5%AE%9A%E4%B9%89%E7%9A%84%E9%BB%98%E8%AE%A4%E6%A0%B7%E5%BC%8F.html&quot;&gt;WPF 已知问题 Separator 无法应用 ContextMenu 定义的默认样式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E6%B8%85%E7%A9%BA-CollectionView-%E7%9A%84-SortDescriptions-%E5%8F%AF%E8%83%BD%E6%8A%9B%E5%87%BA%E7%A9%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 已知问题 清空 CollectionView 的 SortDescriptions 可能抛出空异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%9C%A8-ObservableCollection-%E7%9A%84-CollectionChanged-%E4%BF%AE%E6%94%B9%E9%9B%86%E5%90%88%E5%86%85%E5%AE%B9%E5%B0%86%E8%AE%A9-UI-%E6%98%BE%E7%A4%BA%E9%94%99%E8%AF%AF.html&quot;&gt;WPF 已知问题 在 ObservableCollection 的 CollectionChanged 修改集合内容将让 UI 显示错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%BC%80%E5%90%AF-IsManipulationEnabled-%E4%B9%8B%E5%90%8E%E8%A7%A6%E6%91%B8%E9%95%BF%E6%8C%89-RepeatButton-%E4%B8%8D%E4%BC%9A%E8%A7%A6%E5%8F%91%E8%BF%9E%E7%BB%AD%E7%9A%84-Click-%E4%BA%8B%E4%BB%B6.html&quot;&gt;WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的 Click 事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%9C%A8-WIC-%E5%B1%82%E5%A4%84%E7%90%86%E5%BC%82%E5%B8%B8%E5%9B%BE%E7%89%87%E6%97%B6-%E5%8F%AF%E8%83%BD%E7%94%B1%E4%BA%8E%E5%87%BA%E7%8E%B0%E6%9C%AA%E5%A4%84%E7%90%86%E5%BC%82%E5%B8%B8%E5%AF%BC%E8%87%B4%E8%BF%9B%E7%A8%8B%E9%80%80%E5%87%BA.html&quot;&gt;WPF 已知问题 在 WIC 层处理异常图片时 可能由于出现未处理异常导致进程退出&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-QEMU-%E8%99%9A%E6%8B%9F%E7%A3%81%E7%9B%98%E8%AE%BE%E5%A4%87%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6%E6%8A%9B%E5%BC%82%E5%B8%B8%E4%BD%86%E5%AE%9E%E9%99%85%E7%A7%BB%E5%8A%A8%E6%88%90%E5%8A%9F.html&quot;&gt;记 QEMU 虚拟磁盘设备移动文件抛异常但实际移动成功&lt;/a&gt;
&lt;!-- [记 QEMU 虚拟磁盘设备移动文件抛异常但实际移动成功 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18547263 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E4%BD%BF%E7%94%A8-WindowChrome-%E5%9C%A8%E5%88%87%E6%8D%A2%E7%B3%BB%E7%BB%9F%E4%B8%BB%E9%A2%98%E8%89%B2%E6%97%B6%E5%AF%BC%E8%87%B4%E7%AA%97%E5%8F%A3%E7%95%8C%E9%9D%A2%E5%81%8F%E7%A7%BB.html&quot;&gt;WPF 已知问题 使用 WindowChrome 在切换系统主题色时导致窗口界面偏移&lt;/a&gt;
&lt;!-- [WPF 已知问题 使用 WindowChrome 在切换系统主题色时导致窗口界面偏移 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19185921 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;其他软件导致的问题&quot;&gt;其他软件导致的问题&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A2%AB%E8%BE%93%E5%85%A5%E6%B3%95%E5%B8%A6%E5%B4%A9%E8%BF%9B%E7%A8%8B.html&quot;&gt;WPF 被输入法带崩进程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%85%A8%E5%B1%8F%E7%AA%97%E5%8F%A3%E5%B0%86%E8%AE%A9-Chrome-97-%E8%A7%86%E9%A2%91%E5%81%9C%E6%AD%A2%E6%92%AD%E6%94%BE.html&quot;&gt;WPF 全屏窗口将让 Chrome 97 视频停止播放&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE%E5%AF%BC%E8%87%B4-WPF-%E5%BA%94%E7%94%A8%E5%8D%A1%E4%BD%8F-%E7%AA%97%E5%8F%A3%E6%97%A0%E6%B3%95%E6%BF%80%E6%B4%BB%E9%97%AE%E9%A2%98.html&quot;&gt;记微信截图导致 WPF 应用卡住 窗口无法激活问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E8%85%BE%E8%AE%AF%E5%BE%AE%E4%BF%A1%E8%BE%93%E5%85%A5%E6%B3%95%E5%AF%BC%E8%87%B4-WPF-%E5%BA%94%E7%94%A8%E5%8D%A1%E4%BD%8F-%E7%AA%97%E5%8F%A3%E6%97%A0%E6%B3%95%E6%BF%80%E6%B4%BB%E5%92%8C%E6%98%BE%E7%A4%BA.html&quot;&gt;记腾讯微信输入法导致 WPF 应用卡住 窗口无法激活和显示&lt;/a&gt;
&lt;!-- [记腾讯微信输入法导致 WPF 应用卡住 窗口无法激活和显示 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18559797 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A2%AB-%E7%81%B5%E6%A0%BC%E6%96%AF%E7%BF%BB%E8%AF%91%E5%AE%98-%E5%8F%96%E8%AF%8D%E5%B8%A6%E5%B4%A9.html&quot;&gt;WPF 被 灵格斯翻译官 取词带崩&lt;/a&gt;
&lt;!-- [WPF 被 灵格斯翻译官 取词带崩 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18555988 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-YKQQClean-%E5%AF%BC%E8%87%B4%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%95%8C%E9%9D%A2%E7%AA%97%E5%8F%A3%E5%BC%B9%E5%87%BA%E5%A4%B1%E8%B4%A5.html&quot;&gt;记 YKQQClean 导致应用程序界面窗口弹出失败&lt;/a&gt;
&lt;!-- [记 YKQQClean 导致应用程序界面窗口弹出失败 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19767237 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Office-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-GROOVEEX.DLL-%E5%B8%A6%E5%B4%A9%E8%BF%9B%E7%A8%8B.html&quot;&gt;Office 已知问题 GROOVEEX.DLL 带崩进程&lt;/a&gt;
&lt;!-- [Office 已知问题 GROOVEEX.DLL 带崩进程 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19244702 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;已知驱动问题&quot;&gt;已知驱动问题&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E5%9B%A0%E4%B8%BA-NVIDIA-%E6%98%BE%E9%A9%B1%E9%94%99%E8%AF%AF%E8%80%8C%E8%AE%A9-WPF-%E5%BA%94%E7%94%A8%E5%90%AF%E5%8A%A8%E9%97%AA%E9%80%80%E9%97%AE%E9%A2%98.html&quot;&gt;记因为 NVIDIA 显驱错误而让 WPF 应用启动闪退问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%9A%84-WriteableBitmap-%E5%9C%A8-Intel-11-%E4%BB%A3-Iris-Xe-Graphics-%E6%A0%B8%E6%98%BE%E8%AE%BE%E5%A4%87%E4%B8%8A%E5%81%9C%E6%AD%A2%E6%B8%B2%E6%9F%93.html&quot;&gt;WPF 的 WriteableBitmap 在 Intel 11 代 Iris Xe Graphics 核显设备上停止渲染&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2379099&quot;&gt;腾讯云&lt;/a&gt;
&lt;!-- [WPF 的 WriteableBitmap 在 Intel 11 代 Iris Xe Graphics 核显设备上停止渲染 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17962054 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%9A%84-Viewport3D-%E7%AD%89-3D-%E6%A8%A1%E5%9D%97%E5%9C%A8%E5%B8%A6-Intel-UHD-770-%E8%AE%BE%E5%A4%87%E4%B8%8A%E6%8A%9B%E5%87%BA%E6%B8%B2%E6%9F%93%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 的 Viewport3D 等 3D 模块在带 Intel UHD 770 设备上抛出渲染异常&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2379510&quot;&gt;腾讯云&lt;/a&gt;
&lt;!-- [WPF 的 Viewport3D 等 3D 模块在带 Intel UHD 770 设备上抛出渲染异常 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17964618 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-Intel-%E7%9A%84-31.0.101.5186-%E7%89%88%E6%9C%AC%E9%A9%B1%E5%8A%A8%E5%B8%A6%E5%B4%A9-WPF-%E7%A8%8B%E5%BA%8F.html&quot;&gt;记 Intel 的 31.0.101.5186 版本驱动带崩 WPF 程序&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;各版本已知问题和新功能&quot;&gt;各版本已知问题和新功能&lt;/h3&gt;

&lt;p&gt;以下的版本记录的是新功能加入的版本，以及发现问题的版本。有些问题会延续多个版本，不代表新版本就没有对应的问题，具体问题修复版本请参阅具体的博客&lt;/p&gt;

&lt;h4 id=&quot;dotnet-core-31&quot;&gt;dotnet core 3.1&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8D%87%E7%BA%A7-.NET-Core-%E7%9A%84%E7%90%86%E7%94%B1.html&quot;&gt;WPF 升级 .NET Core 的理由&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A%E5%88%B0%E9%9D%9E%E5%85%AC%E5%BC%80-set-%E6%96%B9%E6%B3%95%E5%B1%9E%E6%80%A7%E5%9C%A8-NET-45-%E5%92%8C-NET-Core-%E8%A1%8C%E4%B8%BA%E7%9A%84%E4%B8%8D%E5%90%8C.html&quot;&gt;WPF 双向绑定到非公开 set 方法属性在 NET 45 和 NET Core 行为的不同&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E-dotnet-core-3.0-%E7%9A%84%E7%89%B9%E6%80%A7%E8%AE%A9-WPF-%E5%B8%83%E5%B1%80%E5%A4%B1%E6%95%88%E8%AE%A8%E8%AE%BA-API-%E5%85%BC%E5%AE%B9.html&quot;&gt;从 dotnet core 3.0 的特性让 WPF 布局失效讨论 API 兼容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8-.NET-Core-3.1.19-%E7%89%88%E6%9C%AC-%E8%A7%A6%E6%91%B8%E7%AC%94%E8%BF%B9%E5%81%8F%E7%A7%BB%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 在 .NET Core 3.1.19 版本 触摸笔迹偏移问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9C%A8-.NET-Core-3.1.19-%E7%89%88%E6%9C%AC%E6%B2%A1%E6%9C%89%E8%B7%9F%E9%9A%8F-DPI-%E7%BC%A9%E6%94%BE%E6%96%87%E6%9C%AC%E8%BF%87%E5%B0%8F%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 在 .NET Core 3.1.19 版本没有跟随 DPI 缩放文本过小问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-3.1-%E5%B0%86-UWP-%E6%8E%A7%E4%BB%B6%E5%B5%8C%E5%85%A5%E5%88%B0-WPF-%E5%BA%94%E7%94%A8-%E6%94%B6%E5%88%B0-UIA-%E6%B6%88%E6%81%AF%E4%B8%BB%E7%BA%BF%E7%A8%8B%E5%8D%A1%E4%BD%8F.html&quot;&gt;dotnet core 3.1 将 UWP 控件嵌入到 WPF 应用 收到 UIA 消息主线程卡住&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;dotnet-5-1&quot;&gt;dotnet 5&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E-dotnet-core-3-%E5%88%B0-dotnet-5-%E7%9A%84%E5%8F%98%E6%9B%B4.html&quot;&gt;WPF 从 dotnet core 3 到 dotnet 5 的变更&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-5-%E8%AE%A9-WPF-%E8%B0%83%E7%94%A8-WindowsRuntime-%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 5 让 WPF 调用 WindowsRuntime 方法&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;dotnet-6-1&quot;&gt;dotnet 6&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-dotnet-6-%E8%AE%BE%E7%BD%AE-InvariantGlobalization-%E4%B9%8B%E5%90%8E%E5%B0%86%E4%B8%A2%E5%A4%B1%E9%BB%98%E8%AE%A4%E7%BB%91%E5%AE%9A%E8%BD%AC%E6%8D%A2%E5%AF%BC%E8%87%B4-XAML-%E6%8A%9B%E5%87%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF 已知问题 dotnet 6 设置 InvariantGlobalization 之后将丢失默认绑定转换导致 XAML 抛出异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-dotnet-6-%E5%BC%80%E5%90%AF-PM-v2-%E7%9A%84-DPI-%E6%84%9F%E7%9F%A5-%E5%AF%BC%E8%87%B4%E8%A7%A6%E6%91%B8%E7%BA%BF%E7%A8%8B%E8%AE%BF%E9%97%AE-UI-%E5%B1%9E%E6%80%A7%E6%8A%9B%E5%BC%82%E5%B8%B8.html&quot;&gt;WPF dotnet 6 开启 PM v2 的 DPI 感知 导致触摸线程访问 UI 属性抛异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%AE%E5%A4%8D%E5%BC%95%E7%94%A8%E5%BA%93%E6%8A%A5%E9%94%99-%E6%89%80%E4%BD%BF%E7%94%A8%E7%9A%84-PresentationFramework-6.0.2-%E9%AB%98%E4%BA%8E%E6%89%80%E5%BC%95%E7%94%A8%E7%9A%84%E6%A0%87%E8%AF%86%E4%B8%BA-6.0.0-%E7%A8%8B%E5%BA%8F%E9%9B%86.html&quot;&gt;WPF 修复引用库报错 所使用的 PresentationFramework 6.0.2 高于所引用的标识为 6.0.0 程序集&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;dotnet-7-1&quot;&gt;dotnet 7&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-7-WPF-%E7%A0%B4%E5%9D%8F%E6%80%A7%E6%94%B9%E5%8A%A8-%E6%8C%89%E4%B8%8B-F3-%E8%AE%A9-DataGrid-%E8%87%AA%E5%8A%A8%E6%8E%92%E5%BA%8F.html&quot;&gt;dotnet 7 WPF 破坏性改动 按下 F3 让 DataGrid 自动排序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-7-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-WPF-%E7%9A%84-TreeView-%E5%BC%80%E5%90%AF%E8%99%9A%E6%8B%9F%E5%8C%96%E4%B9%8B%E5%90%8E%E5%8F%AA%E6%98%BE%E7%A4%BA%E9%A6%96%E9%A1%B9.html&quot;&gt;dotnet 7 已知问题 WPF 的 TreeView 开启虚拟化之后只显示首项&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;dotnet-8-1&quot;&gt;dotnet 8&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-8-WPF-%E6%94%AF%E6%8C%81%E5%9C%A8-RDP-%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E7%8A%B6%E6%80%81%E4%B8%8B%E5%90%AF%E7%94%A8%E6%B8%B2%E6%9F%93%E7%A1%AC%E4%BB%B6%E5%8A%A0%E9%80%9F.html&quot;&gt;dotnet 8 WPF 支持在 RDP 远程桌面状态下启用渲染硬件加速&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/17756214.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-dotnet-8.0.4-%E4%BF%AE%E5%A4%8D%E7%9A%84-WPF-%E7%9A%84%E8%A7%A6%E6%91%B8%E6%A8%A1%E5%9D%97%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98.html&quot;&gt;记 dotnet 8.0.4 修复的 WPF 的触摸模块安全问题&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;dotnet-9-1&quot;&gt;dotnet 9&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-9-WPF-%E8%BF%9E%E5%AD%97%E7%AC%A6%E6%B8%B2%E6%9F%93%E6%94%AF%E6%8C%81.html&quot;&gt;dotnet 9 WPF 连字符渲染支持&lt;/a&gt;
&lt;!-- [dotnet 9 WPF 连字符渲染支持 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18545166 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-9-WPF-%E6%94%AF%E6%8C%81-Style-%E7%9A%84-Setter-%E5%A1%AB%E5%85%85%E5%86%85%E5%AE%B9%E6%97%B6%E5%8F%AF%E5%BF%BD%E7%95%A5-Value-%E6%A0%87%E7%AD%BE.html&quot;&gt;dotnet 9 WPF 支持 Style 的 Setter 填充内容时可忽略 Value 标签&lt;/a&gt;
&lt;!-- [dotnet 9 WPF 支持 Style 的 Setter 填充内容时可忽略 Value 标签 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18181294 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/mingupupu/p/18277446&quot;&gt;WPF在.NET9中的重大更新：Windows 11 主题 - mingupupup - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-9-WPF-%E9%A1%B9%E7%9B%AE%E7%A6%81%E7%94%A8-IncludePackageReferencesDuringMarkupCompilation-%E5%AF%BC%E8%87%B4%E6%BA%90%E4%BB%A3%E7%A0%81%E5%8C%85-XAML-%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 9 WPF 项目禁用 IncludePackageReferencesDuringMarkupCompilation 导致源代码包 XAML 构建失败&lt;/a&gt;
&lt;!-- [dotnet 9 WPF 项目禁用 IncludePackageReferencesDuringMarkupCompilation 导致源代码包 XAML 构建失败 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18555989 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;dotnet-10&quot;&gt;dotnet 10&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-10-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E6%9E%84%E5%BB%BA-WPF-%E6%97%B6%E6%8F%90%E7%A4%BA-System.Private.Windows.GdiPlus-%E7%A8%8B%E5%BA%8F%E9%9B%86%E6%9C%AA%E6%89%BE%E5%88%B0%E9%94%99%E8%AF%AF.html&quot;&gt;dotnet 10 已知问题 构建 WPF 时提示 System.Private.Windows.GdiPlus 程序集未找到错误&lt;/a&gt;
&lt;!-- [dotnet 10 已知问题 构建 WPF 时提示 System.Private.Windows.GdiPlus 程序集未找到错误 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19224133 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-10-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-WinForms-%E7%9A%84-TargetFramework-%E4%B8%8E-System.Drawing.Common-%E4%B8%8D%E5%8C%B9%E9%85%8D%E5%B0%86%E6%8A%9B%E5%87%BA%E6%89%BE%E4%B8%8D%E5%88%B0%E7%B1%BB%E5%9E%8B%E5%BC%82%E5%B8%B8.html&quot;&gt;dotnet 10 已知问题 WinForms 的 TargetFramework 与 System.Drawing.Common 不匹配将抛出找不到类型异常&lt;/a&gt;
&lt;!-- [dotnet 10 已知问题 WinForms 的 TargetFramework 与 System.Drawing.Common 不匹配将抛出找不到类型异常 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19360020 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;构建发布&quot;&gt;构建发布&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-Windows-Template-Studio-%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%A1%86%E6%9E%B6%E5%92%8C%E4%B8%8A%E6%89%8B%E9%A1%B9%E7%9B%AE.html&quot;&gt;WPF 通过 Windows Template Studio 快速搭建项目框架和上手项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%BC%96%E8%AF%91%E4%B8%BA-AnyCPU-%E5%92%8C-x86-%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB.html&quot;&gt;WPF 编译为 AnyCPU 和 x86 有什么区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-ReadyToRun-%E6%8F%90%E5%8D%87%E6%80%A7%E8%83%BD.html&quot;&gt;WPF 通过 ReadyToRun 提升性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E4%BA%8E-.NET-5-%E6%A1%86%E6%9E%B6%E5%92%8C-.NET-6-%E7%9A%84-SDK-%E8%BF%9B%E8%A1%8C%E5%AE%8C%E5%85%A8%E5%8D%95%E6%96%87%E4%BB%B6%E5%8F%91%E5%B8%83.html&quot;&gt;WPF 基于 .NET 5 框架和 .NET 6 的 SDK 进行完全单文件发布&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BF%AE%E5%A4%8D-dotnet-6-%E4%B8%8E%E6%BA%90%E4%BB%A3%E7%A0%81%E5%8C%85%E5%86%B2%E7%AA%81.html&quot;&gt;WPF 修复 dotnet 6 与源代码包冲突&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%BE%E7%BD%AE-IncludePackageReferencesDuringMarkupCompilation-%E5%B1%9E%E6%80%A7%E5%AF%BC%E8%87%B4%E5%88%86%E6%9E%90%E5%99%A8%E4%B8%8D%E5%B7%A5%E4%BD%9C.html&quot;&gt;WPF 设置 IncludePackageReferencesDuringMarkupCompilation 属性导致分析器不工作&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-dotnet-core-%E5%8F%91%E5%B8%83%E5%8D%95%E6%96%87%E4%BB%B6%E6%97%B6-log4net-%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8.html&quot;&gt;WPF 通过 dotnet core 发布单文件时 log4net 无法使用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%A8%8B%E5%BA%8F%E7%94%9F%E6%88%90%E7%B1%BB%E5%BA%93%E9%94%99%E8%AF%AF.html&quot;&gt;WPF 程序生成类库错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E4%B8%8D%E5%8A%A0-windows-%E7%9A%84%E5%BC%95%E7%94%A8-WPF-%E6%A1%86%E6%9E%B6%E6%96%B9%E5%BC%8F.html&quot;&gt;WPF 项目文件不加 -windows 的引用 WPF 框架方式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-SatelliteResourceLanguages-%E5%87%8F%E5%B0%91-WPF-%E5%8F%91%E5%B8%83%E7%9A%84%E5%A4%9A%E8%AF%AD%E8%A8%80%E6%96%87%E4%BB%B6%E5%A4%B9%E6%95%B0%E9%87%8F.html&quot;&gt;使用 SatelliteResourceLanguages 减少 WPF 发布的多语言文件夹数量&lt;/a&gt;
&lt;!-- [使用 SatelliteResourceLanguages 减少 WPF 发布的多语言文件夹数量 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18932216 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SignTool-%E4%BD%BF%E7%94%A8-SafeNet-eToken-%E7%A1%AC%E8%AF%81%E4%B9%A6%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%A0%81%E7%AD%BE%E5%90%8D.html&quot;&gt;SignTool 使用 SafeNet eToken 硬证书进行代码签名&lt;/a&gt;
&lt;!-- [SignTool 使用 SafeNet eToken 硬证书进行代码签名 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19134167 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;打包-uwp-应用&quot;&gt;打包 UWP 应用&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8D%E5%BA%94%E7%94%A8%E8%A2%AB%E6%89%93%E5%8C%85%E4%B8%BA-UWP-%E8%80%8C%E8%BF%90%E8%A1%8C.html&quot;&gt;WPF 判断当前应用被打包为 UWP 而运行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%95%E7%94%A8-UWP-%E6%8E%A7%E4%BB%B6-%E4%B8%8D%E6%89%93%E5%8C%85%E4%B8%BA-MSIX-%E5%88%86%E5%8F%91%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 引用 UWP 控件 不打包为 MSIX 分发的方法&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpf-调试&quot;&gt;WPF 调试&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BE%9D%E8%B5%96%E5%B1%9E%E6%80%A7%E7%BB%91%E5%AE%9A%E4%B8%8D%E4%B8%8A%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 依赖属性绑定不上调试方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E8%B0%83%E8%AF%95-binding.html&quot;&gt;WPF 如何调试 binding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%B0%83%E8%AF%95%E5%9B%A0%E4%B8%BA%E5%AF%B9%E8%B1%A1%E4%B8%8D%E5%90%8C%E8%80%8C%E7%BB%91%E5%AE%9A%E5%A4%B1%E6%95%88%E9%97%AE%E9%A2%98.html&quot;&gt;WPF 调试因为对象不同而绑定失效问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E4%BA%8E-WER-%E6%B3%A8%E5%86%8C%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A0%E5%93%8D%E5%BA%94%E5%9B%9E%E8%B0%83%E5%92%8C%E9%87%8D%E5%90%AF%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 基于 WER 注册应用崩溃无响应回调和重启方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%B0%83%E8%AF%95-%E8%8E%B7%E5%BE%97%E8%BF%BD%E8%B8%AA%E8%BE%93%E5%87%BA.html&quot;&gt;WPF 调试 获得追踪输出&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%A4%E6%96%AD%E8%B0%83%E7%94%A8%E6%96%B9%E6%B3%95%E5%A0%86%E6%A0%88.html&quot;&gt;WPF 判断调用方法堆栈&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%9F%90%E4%B8%AA%E7%95%8C%E9%9D%A2%E6%88%96%E6%8E%A7%E4%BB%B6%E5%9C%A8%E7%95%8C%E9%9D%A2%E6%89%BE%E4%B8%8D%E5%88%B0%E7%9C%8B%E4%B8%8D%E5%88%B0%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;WPF 某个界面或控件在界面找不到看不到可能的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%8E%B7%E5%8F%96%E6%98%AF%E5%93%AA%E4%B8%AA%E8%BF%9B%E7%A8%8B%E5%8D%A0%E7%94%A8%E4%BA%86%E6%96%87%E4%BB%B6.html&quot;&gt;WPF 获取是哪个进程占用了文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E5%BD%93%E5%89%8D%E6%9C%89%E5%A4%9A%E5%B0%91%E4%B8%AA-DispatcherTimer-%E5%9C%A8%E8%BF%90%E8%A1%8C.html&quot;&gt;WPF 如何知道当前有多少个 DispatcherTimer 在运行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E4%B8%8B%E7%9A%84-WPF-%E5%BC%80%E5%8F%91-%E8%B0%83%E8%AF%95%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%9C%A8%E4%BB%80%E4%B9%88%E6%97%B6%E6%9C%BA%E5%8A%A0%E8%BD%BD%E4%BA%86-Dll-%E6%A8%A1%E5%9D%97.html&quot;&gt;Windows 下的 WPF 开发 调试应用程序在什么时机加载了 Dll 模块&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%9C%A8%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%B0%83%E8%AF%95%E5%90%AF%E5%8A%A8.html&quot;&gt;WPF 如何在应用程序调试启动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E4%BF%9D%E7%95%99-wpftmp.csproj-%E6%96%87%E4%BB%B6%E7%94%A8%E4%BA%8E%E8%B0%83%E8%AF%95.html&quot;&gt;如何保留 wpftmp.csproj 文件用于调试&lt;/a&gt;
&lt;!-- [如何保留 wpftmp.csproj 文件用于调试 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18564012 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;读-wpf-源代码&quot;&gt;读 WPF 源代码&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%BA%90%E4%BB%A3%E7%A0%81-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99%E4%B8%80%E4%B8%AA-UI-%E6%A1%86%E6%9E%B6.html&quot;&gt;WPF 源代码 从零开始写一个 UI 框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E5%B8%83%E5%B1%80%E6%97%B6-Arrange-%E5%A6%82%E4%BD%95%E5%BD%B1%E5%93%8D%E5%85%83%E7%B4%A0%E6%B8%B2%E6%9F%93%E5%9D%90%E6%A0%87.html&quot;&gt;dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84-UserControl-%E7%94%A8%E6%88%B7%E6%8E%A7%E4%BB%B6%E4%B8%8D%E8%83%BD%E8%B7%A8%E7%A8%8B%E5%BA%8F%E9%9B%86%E7%BB%A7%E6%89%BF.html&quot;&gt;dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-WPF-%E6%98%AF%E5%A6%82%E4%BD%95%E5%81%9A%E5%88%B0%E4%B8%80%E5%A5%97%E4%BB%A3%E7%A0%81%E5%85%BC%E5%AE%B9%E5%A4%9A%E4%B8%AA-.NET-Framework-%E7%89%88%E6%9C%AC.html&quot;&gt;dotnet 读 WPF 源代码笔记 WPF 是如何做到一套代码兼容多个 .NET Framework 版本&lt;/a&gt;
&lt;!-- [dotnet 读 WPF 源代码笔记 WPF 是如何做到一套代码兼容多个 .NET Framework 版本 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/16697734.html ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8A%A0%E4%B8%8A-BooleanBoxes-%E7%B1%BB.html&quot;&gt;dotnet 读 WPF 源代码笔记 为什么加上 BooleanBoxes 类&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E6%9C%80%E5%BA%95%E5%B1%82%E6%BA%90%E4%BB%A3%E7%A0%81%E4%BA%86%E8%A7%A3-AllowsTransparency-%E6%80%A7%E8%83%BD%E5%B7%AE%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;WPF 从最底层源代码了解 AllowsTransparency 性能差的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E6%B8%B2%E6%9F%93%E6%94%B6%E9%9B%86%E6%98%AF%E5%A6%82%E4%BD%95%E8%A7%A6%E5%8F%91.html&quot;&gt;dotnet 读 WPF 源代码笔记 渲染收集是如何触发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%90%8E%E5%8F%B0%E7%BA%BF%E7%A8%8B%E5%88%9B%E5%BB%BA-WriteableBitmap-%E9%94%81%E4%BD%8F%E4%B8%BB%E7%BA%BF%E7%A8%8B.html&quot;&gt;dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 后台线程创建 WriteableBitmap 锁住主线程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-WriteableBitmap-%E7%9A%84%E6%B8%B2%E6%9F%93%E5%92%8C%E6%9B%B4%E6%96%B0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0.html&quot;&gt;dotnet 读 WPF 源代码笔记 WriteableBitmap 的渲染和更新是如何实现&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E-WriteableBitmap-%E9%87%8C%E8%8E%B7%E5%8F%96%E5%88%B0%E6%B8%B2%E6%9F%93%E7%BA%BF%E7%A8%8B%E4%BD%BF%E7%94%A8%E7%9A%84-IWICBitmap-%E5%AF%B9%E8%B1%A1.html&quot;&gt;WPF 从 WriteableBitmap 里获取到渲染线程使用的 IWICBitmap 对象&lt;/a&gt;
&lt;!-- [WPF 从 WriteableBitmap 里获取到渲染线程使用的 IWICBitmap 对象 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18843888 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E6%8F%90%E5%8D%87%E8%B0%83%E8%AF%95%E6%95%88%E7%8E%87%E7%9A%84-NamedObject-%E7%B1%BB%E5%9E%8B.html&quot;&gt;dotnet 读 WPF 源代码笔记 提升调试效率的 NamedObject 类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E6%8F%92%E5%85%A5%E8%A7%A6%E6%91%B8%E8%AE%BE%E5%A4%87%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8E%B7%E5%8F%96%E8%AE%BE%E5%A4%87%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet 读 WPF 源代码笔记 插入触摸设备的初始化获取设备信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%BA%86%E8%A7%A3-WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E7%94%A8%E6%88%B7%E8%AE%BE%E5%A4%87%E4%B8%8A%E4%B8%8D%E5%AD%98%E5%9C%A8-Arial-%E5%AD%97%E4%BD%93%E5%B0%86%E5%AF%BC%E8%87%B4%E5%BA%94%E7%94%A8%E9%97%AA%E9%80%80.html&quot;&gt;dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 用户设备上不存在 Arial 字体将导致应用闪退&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E5%88%9B%E5%BB%BA-SolidColorBrush-%E6%80%A7%E8%83%BD%E6%B2%A1%E6%9C%89%E6%83%B3%E8%B1%A1%E9%82%A3%E4%B9%88%E5%B7%AE.html&quot;&gt;dotnet 读 WPF 源代码笔记 创建 SolidColorBrush 性能没有想象那么差&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E9%BB%98%E8%AE%A4%E7%9A%84-Main-%E5%87%BD%E6%95%B0%E6%98%AF%E5%9C%A8%E5%93%AA%E5%88%9B%E5%BB%BA%E7%9A%84.html&quot;&gt;dotnet 读 WPF 源代码笔记 默认的 Main 函数是在哪创建的&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AE%BE%E7%BD%AE%E4%BA%86SplashScreen%E4%BC%9A%E8%AE%A9Application.Current.Activated%E4%BA%8B%E4%BB%B6%E4%B8%8D%E8%A7%A6%E5%8F%91.html&quot;&gt;dotnet 读 WPF 源代码笔记 为什么设置了SplashScreen会让Application.Current.Activated事件不触发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-SafeMILHandleMemoryPressure-%E7%9A%84%E4%BD%9C%E7%94%A8.html&quot;&gt;dotnet 读 WPF 源代码笔记 SafeMILHandleMemoryPressure 的作用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%B8%BA%E4%BB%80%E4%B9%88%E9%BB%98%E8%AE%A4%E7%9A%84%E7%AC%94%E8%BF%B9%E8%A7%A6%E6%91%B8%E7%82%B9%E7%9A%84%E5%8E%8B%E6%84%9F%E6%98%AF-0.5-%E7%9A%84%E5%80%BC.html&quot;&gt;dotnet 读 WPF 源代码笔记 为什么默认的笔迹触摸点的压感是 0.5 的值&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-Stroke-%E7%B1%BB%E5%8F%AF%E8%83%BD%E5%AD%98%E5%9C%A8%E7%9A%84%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2.html&quot;&gt;dotnet 读 WPF 源代码笔记 Stroke 类可能存在的内存泄露&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-XAML-%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 读 WPF 源代码笔记 XAML 创建对象的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E4%BD%BF%E7%94%A8-Win32-%E6%96%B9%E6%B3%95%E4%BF%AE%E6%94%B9%E7%AA%97%E5%8F%A3%E7%9A%84%E5%9D%90%E6%A0%87%E5%92%8C%E5%A4%A7%E5%B0%8F%E5%AF%B9%E7%AA%97%E5%8F%A3%E4%BE%9D%E8%B5%96%E5%B1%9E%E6%80%A7%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;dotnet 读 WPF 源代码笔记 使用 Win32 方法修改窗口的坐标和大小对窗口依赖属性的影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-AppDomainShutdownMonitor-%E7%9A%84%E8%AE%BE%E8%AE%A1.html&quot;&gt;dotnet 读 WPF 源代码笔记 AppDomainShutdownMonitor 的设计&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E5%90%AF%E5%8A%A8%E6%AC%A2%E8%BF%8E%E7%95%8C%E9%9D%A2-SplashScreen-%E7%9A%84%E5%8E%9F%E7%90%86.html&quot;&gt;dotnet 读 WPF 源代码笔记 启动欢迎界面 SplashScreen 的原理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-wpfgfx_cor3.dll-%E6%98%AF%E4%BB%80%E4%B9%88%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 读 WPF 源代码笔记 wpfgfx_cor3.dll 是什么文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-WIC-%E5%A4%9A%E5%AA%92%E4%BD%93%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86%E9%80%9A%E8%BF%87-WindowsCodecs.dll-%E5%AE%9E%E7%8E%B0%E5%8A%9F%E8%83%BD.html&quot;&gt;dotnet 读 WPF 源代码笔记 WIC 多媒体图片处理通过 WindowsCodecs.dll 实现功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Framework-%E6%BA%90%E4%BB%A3%E7%A0%81-Ink.html&quot;&gt;dotnet Framework 源代码 · Ink&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Framework-%E6%BA%90%E4%BB%A3%E7%A0%81-ScrollViewer.html&quot;&gt;dotnet Framework 源代码 · ScrollViewer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81-Popup-%E7%9A%84-StaysOpen-%E4%B8%BA-false-%E5%B0%86%E4%BC%9A%E5%90%83%E6%8E%89%E5%85%B6%E4%BB%96%E7%AA%97%E5%8F%A3%E7%9A%84%E9%A6%96%E6%AC%A1%E6%BF%80%E6%B4%BB.html&quot;&gt;dotnet 读 WPF 源代码 Popup 的 StaysOpen 为 false 将会吃掉其他窗口的首次激活&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81-%E8%81%8A%E8%81%8A-DispatcherTimer-%E7%9A%84%E5%AE%9E%E7%8E%B0.html&quot;&gt;dotnet 读 WPF 源代码 聊聊 DispatcherTimer 的实现&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81-%E5%AD%A6%E4%B9%A0%E4%BD%BF%E7%94%A8-Microsoft.DotNet.Arcade.Sdk-%E5%A4%84%E7%90%86%E4%BB%A3%E7%A0%81%E9%87%8C%E7%9A%84%E5%A4%9A%E8%AF%AD%E8%A8%80.html&quot;&gt;dotnet 读 WPF 源代码 学习使用 Microsoft.DotNet.Arcade.Sdk 处理代码里的多语言&lt;/a&gt;
&lt;!-- [dotnet 读 WPF 源代码 学习使用 Microsoft.DotNet.Arcade.Sdk 处理代码里的多语言 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19198245 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%BA%90%E4%BB%A3%E7%A0%81-%E8%B5%84%E6%BA%90%E5%AD%97%E5%85%B8-ResourceDictionary-%E8%AE%BE%E7%BD%AE-Source-%E5%B1%9E%E6%80%A7%E7%9A%84%E9%80%BB%E8%BE%91.html&quot;&gt;WPF 源代码 资源字典 ResourceDictionary 设置 Source 属性的逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E8%81%8A%E8%81%8A-HwndWrapper.GetGCMemMessage-%E8%B0%83%E8%AF%95%E6%B6%88%E6%81%AF.html&quot;&gt;dotnet 读 WPF 源代码笔记 聊聊 HwndWrapper.GetGCMemMessage 调试消息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%86%B7%E7%9F%A5%E8%AF%86-%E5%AE%9A%E4%B9%89%E4%BE%9D%E8%B5%96%E5%B1%9E%E6%80%A7%E7%9A%84%E6%9C%80%E5%A4%A7%E6%95%B0%E9%87%8F%E6%98%AF-65534-%E4%B8%AA.html&quot;&gt;WPF 冷知识 定义依赖属性的最大数量是 65534 个&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-UncommonField-%E7%B1%BB%E5%9E%8B%E6%98%AF%E4%BB%80%E4%B9%88.html&quot;&gt;WPF UncommonField 类型是什么&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-ColumnDefinition-%E5%92%8C-RowDefinition-%E7%9A%84%E4%BB%A3%E7%A0%81%E5%9C%A8%E5%93%AA.html&quot;&gt;WPF 框架开发 ColumnDefinition 和 RowDefinition 的代码在哪&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%B2%E8%AE%B2-Microsoft.NET.Sdk.WindowsDesktop-%E7%9A%84%E5%8E%9F%E7%90%86.html&quot;&gt;WPF 讲讲 Microsoft.NET.Sdk.WindowsDesktop 的原理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-ShowInTaskbar-%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html&quot;&gt;dotnet 读 WPF 源代码笔记 ShowInTaskbar 的实现原理&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;文本-1&quot;&gt;文本&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E7%AE%80%E5%8D%95%E8%81%8A%E8%81%8A%E6%96%87%E6%9C%AC%E5%B8%83%E5%B1%80%E6%8D%A2%E8%A1%8C%E9%80%BB%E8%BE%91.html&quot;&gt;dotnet 读 WPF 源代码笔记 简单聊聊文本布局换行逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-GlyphRun-%E7%9A%84-DeviceFontName-%E7%9A%84%E5%8A%9F%E8%83%BD%E6%98%AF%E4%BB%80%E4%B9%88.html&quot;&gt;dotnet 读 WPF 源代码笔记 GlyphRun 的 DeviceFontName 的功能是什么&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E6%B8%B2%E6%9F%93%E5%B1%82%E6%98%AF%E5%A6%82%E4%BD%95%E5%B0%86%E5%AD%97%E7%AC%A6-GlyphRun-%E7%94%BB%E5%87%BA%E6%9D%A5%E7%9A%84.html&quot;&gt;dotnet 读 WPF 源代码笔记 渲染层是如何将字符 GlyphRun 画出来的&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81-%E4%BA%86%E8%A7%A3%E8%8E%B7%E5%8F%96-GlyphTypeface-%E7%9A%84-CharacterToGlyphMap-%E7%9A%84%E6%95%B0%E9%87%8F%E8%80%97%E6%97%B6%E5%8E%9F%E5%9B%A0.html&quot;&gt;读 WPF 源代码 了解获取 GlyphTypeface 的 CharacterToGlyphMap 的数量耗时原因&lt;/a&gt;
&lt;!-- [读 WPF 源代码 了解获取 GlyphTypeface 的 CharacterToGlyphMap 的数量耗时原因 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19114691 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AF%BB-WPF-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0-%E8%81%8A%E8%81%8A-OpenType-%E5%AE%9A%E4%B9%89%E7%9A%84%E5%AD%97%E4%BD%93%E7%89%B9%E6%80%A7.html&quot;&gt;dotnet 读 WPF 源代码笔记 聊聊 OpenType 定义的字体特性&lt;/a&gt;
&lt;!-- [dotnet 读 WPF 源代码笔记 聊聊 OpenType 定义的字体特性 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19761702 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpf-框架开发&quot;&gt;WPF 框架开发&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E5%A6%82%E4%BD%95%E6%9E%84%E5%BB%BA-WPF-%E5%AE%98%E6%96%B9%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;手把手教你如何构建 WPF 官方开源框架源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%9E%84%E5%BB%BA-WPF-%E6%A1%86%E6%9E%B6%E7%9A%84%E7%A7%81%E6%9C%89%E7%89%88%E6%9C%AC.html&quot;&gt;手把手教你构建 WPF 框架的私有版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%85%A8%E6%9E%84%E5%BB%BA%E7%8E%AF%E5%A2%83%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%A1%AC%E7%9B%98%E5%88%86%E4%BA%AB.html&quot;&gt;WPF 框架全构建环境虚拟机硬盘分享&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%9C%80%E7%AE%80%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8%E8%87%AA%E5%B7%B1%E5%AE%9A%E5%88%B6%E7%9A%84-WPF-%E6%A1%86%E6%9E%B6.html&quot;&gt;WPF 最简方法使用自己定制的 WPF 框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-WPF-%E7%9A%84%E6%9E%84%E5%BB%BA%E5%9C%A8%E5%93%AA%E4%BD%BF%E7%94%A8%E5%88%B0-Perl-%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 框架开发 WPF 的构建在哪使用到 Perl 工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-%E6%9B%B4%E6%94%B9-API-%E4%B9%8B%E5%90%8E%E8%AE%A9-CI-%E9%87%8D%E6%96%B0%E5%88%9B%E5%BB%BA-API-%E5%85%BC%E5%AE%B9%E6%A3%80%E6%9F%A5%E5%9F%BA%E5%87%86.html&quot;&gt;WPF 框架开发 更改 API 之后让 CI 重新创建 API 兼容检查基准&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-%E5%8A%A0%E5%85%A5-InternalsVisibleToAttribute-%E7%89%B9%E6%80%A7%E8%AE%A9%E5%85%B6%E4%BB%96%E7%A8%8B%E5%BA%8F%E9%9B%86%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AE-internal-%E6%9D%83%E9%99%90%E6%88%90%E5%91%98.html&quot;&gt;WPF 框架开发 加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-%E8%B0%83%E8%AF%95%E5%92%8C%E5%BC%80%E5%8F%91-System.Xaml-%E7%9A%84%E7%8B%AC%E7%AB%8B%E9%A1%B9%E7%9B%AE%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 框架开发 调试和开发 System.Xaml 的独立项目方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-%E8%B0%83%E8%AF%95%E5%92%8C%E5%BC%80%E5%8F%91-XAML-%E6%9E%84%E5%BB%BA%E8%BF%87%E7%A8%8B%E7%9A%84-PresentationBuildTasks-%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 框架开发 调试和开发 XAML 构建过程的 PresentationBuildTasks 方法&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;uwp&quot;&gt;UWP&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0%E5%85%A5%E9%97%A8-Windows-10-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F-UWP-%E5%BC%80%E5%8F%91.html&quot;&gt;从零开始学习入门 Windows 10 应用程序 UWP 开发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%85%A5%E9%97%A8.html&quot;&gt;win10 uwp 入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E5%BC%80%E5%A7%8B%E5%86%99-uwp-%E7%A8%8B%E5%BA%8F.html&quot;&gt;win10 uwp 如何开始写 uwp 程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-WinUI-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E8%B7%AF%E5%BE%84%E7%9F%A2%E9%87%8F%E5%9B%BE%E6%A0%87%E6%8C%89%E9%92%AE%E6%A0%B7%E5%BC%8F%E5%85%A5%E9%97%A8.html&quot;&gt;UWP WinUI 制作一个路径矢量图标按钮样式入门&lt;/a&gt;
&lt;!-- [UWP WinUI 制作一个路径矢量图标按钮样式入门 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18288632 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E5%BC%80%E5%8F%91%E4%B8%AD-%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%841000%E4%B8%AA%E9%97%AE%E9%A2%98.html&quot;&gt;UWP 开发中，需要知道的1000个问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E5%92%8C-WPF-%E5%AF%B9%E6%AF%94.html&quot;&gt;UWP 和 WPF 对比&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%80%89%E6%8B%A9%E6%96%87%E6%9C%AC%E8%BD%AC%E8%AF%AD%E9%9F%B3%E7%9A%84%E6%9C%BA%E5%99%A8%E4%BA%BA.html&quot;&gt;win10 uwp 选择文本转语音的机器人&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%A2%9C%E8%89%B2%E8%BD%AC%E6%8D%A2.html&quot;&gt;win10 uwp 颜色转换&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E4%BD%BF%E7%94%A8-asp-dotnet-core-%E5%81%9A-cs-%E7%A8%8B%E5%BA%8F.html&quot;&gt;win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E6%8E%A7%E4%BB%B6%E5%9C%A8%E6%BB%9A%E5%8A%A8%E6%9D%A1%E7%9A%84%E9%87%8C%E9%9D%A2%E6%98%AF%E7%94%A8%E6%88%B7%E5%8F%AF%E8%A7%81.html&quot;&gt;win10 uwp 如何判断一个控件在滚动条的里面是用户可见&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%88%97%E8%A1%A8%E6%A8%A1%E6%9D%BF%E9%80%89%E6%8B%A9%E5%99%A8.html&quot;&gt;win10 uwp 列表模板选择器&lt;/a&gt;
&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-Controls-by-function.html&quot;&gt;win10 UWP Controls by function&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%8F%90%E7%A4%BA-Cannot-find-a-Resource-with-the-Name-Key-%E6%89%BE%E4%B8%8D%E5%88%B0%E8%B5%84%E6%BA%90.html&quot;&gt;win10 uwp 提示 Cannot find a Resource with the Name Key 找不到资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%84%9A%E6%9C%AC%E5%BC%80%E5%90%AF%E6%97%81%E5%8A%A0%E8%BD%BD.html&quot;&gt;win10 uwp 通过命令行脚本开启旁加载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AE%BF%E9%97%AE%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E6%96%87%E4%BB%B6.html&quot;&gt;win10 uwp 访问解决方案文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BD%95%E5%88%B6%E4%BB%BB%E6%84%8F%E5%BA%94%E7%94%A8%E5%B1%8F%E5%B9%95.html&quot;&gt;win10 uwp 录制任意应用屏幕&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%9D%9Eui%E7%BA%BF%E7%A8%8B%E8%AE%BF%E9%97%AE-ui.html&quot;&gt;win10 uwp 非ui线程访问 ui &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%9D%A1%E7%9C%A0%E5%94%A4%E9%86%92.html&quot;&gt;win10 uwp 睡眠唤醒&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%94%B6%E9%9B%86-DUMP-%E6%96%87%E4%BB%B6.html&quot;&gt;win10 uwp 收集 DUMP 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%9C%AC%E6%96%87%E8%AF%B4%E5%A6%82%E4%BD%95%E6%98%BE%E7%A4%BASVG.html&quot;&gt;本文说如何显示SVG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-how-to-get-the-touch-width.html&quot;&gt;UWP how to get the touch width&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-listView-%E7%BB%91%E5%AE%9A%E5%89%8D%E4%B8%80%E9%A1%B9.html&quot;&gt;win10 uwp listView 绑定前一项&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%AD%97%E7%AC%A6%E6%96%87%E6%9C%AC%E8%BD%AC%E8%AF%AD%E9%9F%B3%E5%A3%B0%E9%9F%B3%E6%96%87%E4%BB%B6%E6%96%B9%E6%B3%95.html&quot;&gt;win10 uwp 字符文本转语音声音文件方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%8D%95%E8%8E%B7%E5%90%8E%E5%8F%B0%E7%BA%BF%E7%A8%8B%E5%BC%82%E5%B8%B8.html&quot;&gt;win10 uwp 捕获后台线程异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%9C%A8-UWP-%E4%BD%BF%E7%94%A8-wpf-%E7%9A%84-Trigger.html&quot;&gt;如何在 UWP 使用 wpf 的 Trigger &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BB%8E-Unity-%E5%88%9B%E5%BB%BA.html&quot;&gt;win10 uwp 从 Unity 创建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win32-%E5%B5%8C%E5%85%A5%E7%AC%AC%E4%B8%89%E6%96%B9-UWP-%E5%BA%94%E7%94%A8%E5%81%9A%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0.html&quot;&gt;win32 嵌入第三方 UWP 应用做开放平台&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E7%BB%99-DropDownButton-%E4%B8%80%E4%B8%AA%E5%BE%88%E5%B0%8F%E7%9A%84%E5%AE%BD%E5%BA%A6.html&quot;&gt;win10 uwp 如何给 DropDownButton 一个很小的宽度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-OCR-%E5%85%89%E5%AD%A6%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB.html&quot;&gt;win10 uwp 使用 OCR 光学字符识别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%9B%B8%E6%9C%BA%E7%9A%84%E5%88%86%E8%BE%A8%E7%8E%87%E8%AE%BE%E7%BD%AE%E6%96%B9%E6%B3%95.html&quot;&gt;win10 uwp 相机的分辨率设置方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9-Flyout-%E7%9A%84%E5%AE%BD%E5%BA%A6%E6%88%96%E9%AB%98%E5%BA%A6.html&quot;&gt;win10 uwp 如何修改 Flyout 的宽度或高度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-XamlTreeDump-%E8%8E%B7%E5%8F%96-XAML-%E6%A0%91%E5%85%83%E7%B4%A0%E5%86%85%E5%AE%B9.html&quot;&gt;win10 uwp 使用 XamlTreeDump 获取 XAML 树元素内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E5%86%99%E5%85%A5%E5%9B%BE%E7%89%87-Exif-%E4%BF%A1%E6%81%AF.html&quot;&gt;UWP 写入图片 Exif 信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%B8%8D%E6%98%BE%E7%A4%BA-SplashScreen-%E6%AC%A2%E8%BF%8E%E7%95%8C%E9%9D%A2%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;win10 uwp 不显示 SplashScreen 欢迎界面的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E7%AD%89%E7%BA%A7%E6%8E%A7%E4%BB%B6.html&quot;&gt;win10 UWP 等级控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%80%9A%E7%9F%A5%E5%88%97%E8%A1%A8.html&quot;&gt;win10 uwp 通知列表&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-asp-dotnet-core-%E5%81%9A%E5%9B%BE%E5%BA%8A%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%A2%E6%88%B7%E7%AB%AF.html&quot;&gt;win10 uwp 使用 asp dotnet core 做图床服务器客户端&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%98%BE%E7%A4%BASVG.html&quot;&gt;win10 uwp 显示SVG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%B1%82%E4%B8%A4%E4%B8%AA%E7%9F%A9%E5%BD%A2%E7%9B%B8%E8%BF%9E%E7%9A%84%E5%87%A0%E4%BD%95.html&quot;&gt;win10 uwp 求两个矩形相连的几何&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%8F%96%E7%AA%97%E5%8F%A3%E7%9A%84%E5%9D%90%E6%A0%87%E5%92%8C%E5%AE%BD%E5%BA%A6%E9%AB%98%E5%BA%A6.html&quot;&gt;win10 uwp 获取窗口的坐标和宽度高度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E5%88%86%E4%BA%AB%E7%94%A8%E9%82%A3%E4%B8%AA%E5%9B%BE%E6%A0%87.html&quot;&gt;UWP 分享用那个图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8DataTemplate.html&quot;&gt;win10 uwp 如何使用DataTemplate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%89%93%E5%8C%85%E7%AC%AC%E4%B8%89%E6%96%B9%E5%AD%97%E4%BD%93%E5%88%B0%E5%BA%94%E7%94%A8.html&quot;&gt;win10 uwp 打包第三方字体到应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8F%B3%E5%87%BB%E6%B5%AE%E5%87%BA%E7%AA%97%E5%9C%A8%E7%82%B9%E5%87%BB%E4%BD%8D%E7%BD%AE.html&quot;&gt;win10 uwp 右击浮出窗在点击位置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AF%BB%E5%8F%96%E4%BF%9D%E5%AD%98WriteableBitmap-BitmapImage.html&quot;&gt;win10 uwp 读取保存WriteableBitmap 、BitmapImage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%B5%84%E6%BA%90%E5%AD%97%E5%85%B8.html&quot;&gt;win10 uwp 资源字典&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%BA%8F%E5%88%97%E5%8C%96.html&quot;&gt;win10 UWP 序列化&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E6%89%93%E5%8C%85Nuget%E7%BB%99%E5%85%B6%E4%BB%96%E4%BA%BA.html&quot;&gt;win10 uwp 如何打包Nuget给其他人&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%8A%A8%E7%94%BB.html&quot;&gt;win10 UWP 动画&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BE%9D%E8%B5%96%E5%B1%9E%E6%80%A7.html&quot;&gt;win10 uwp 依赖属性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-x_Bind-%E6%97%A0%E6%B3%95%E8%8E%B7%E5%BE%97%E8%B5%84%E6%BA%90.html&quot;&gt;win10 uwp x:Bind 无法获得资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A5%BD%E7%9C%8B%E7%9A%84%E6%97%B6%E9%97%B4%E9%80%89%E6%8B%A9%E6%8E%A7%E4%BB%B6.html&quot;&gt;win10 uwp 好看的时间选择控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AF%BB%E5%8F%96%E6%96%87%E6%9C%ACGBK%E9%94%99%E8%AF%AF.html&quot;&gt;win10 uwp 读取文本GBK错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E4%BD%BF%E7%94%A8-MD5%E7%AE%97%E6%B3%95.html&quot;&gt;win10 UWP 使用 MD5算法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%A8%E7%AC%94%E8%BF%B9%E5%BC%80%E5%A7%8B%E4%B9%A6%E5%86%99%E6%8B%BF%E5%88%B0%E4%B9%A6%E5%86%99%E7%A7%BB%E5%8A%A8%E4%BA%8B%E4%BB%B6.html&quot;&gt;win10 uwp 在笔迹开始书写拿到书写移动事件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A4%84%E7%90%86%E7%94%A8%E6%88%B7%E7%82%B9%E5%87%BB%E5%85%B3%E9%97%AD%E6%8C%89%E9%92%AE.html&quot;&gt;win10 uwp 处理用户点击关闭按钮&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%A7%A3%E5%86%B3-SerialDevice.FromIdAsync-%E8%BF%94%E5%9B%9E%E7%A9%BA.html&quot;&gt;win10 uwp 解决 SerialDevice.FromIdAsync 返回空&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%9C%AA%E7%BB%99%E4%BB%BB%E5%8A%A1-GenerateAppxPackageRecipe-%E7%9A%84%E5%BF%85%E9%9C%80%E5%8F%82%E6%95%B0-AppxManifestXml-%E8%B5%8B%E5%80%BC.html&quot;&gt;win10 uwp 未给任务 GenerateAppxPackageRecipe 的必需参数 AppxManifestXml 赋值&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BC%80%E5%8F%91-CSDN-%E8%AE%BF%E9%97%AE%E9%87%8F%E7%BB%9F%E8%AE%A1-%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;win10 uwp 开发 CSDN 访问量统计 源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BA%94%E7%94%A8%E6%94%BE%E5%88%B0%E6%A1%8C%E9%9D%A2.html&quot;&gt;win10 uwp 应用放到桌面&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E8%AE%B0%E6%89%A9%E5%B1%95.html&quot;&gt;win10 uwp 自定义标记扩展&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E5%B0%86%E5%83%8F%E7%B4%A0%E6%95%B0%E7%BB%84%E8%BD%AC-png-%E6%96%87%E4%BB%B6.html&quot;&gt;win10 uwp 如何将像素数组转 png 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89-RichTextBlock-%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95.html&quot;&gt;win10 uwp 如何自定义 RichTextBlock 右键菜单&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%BC%A0%E6%A0%87%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%9B%BE%E7%89%87%E4%B8%8A%E5%88%87%E6%8D%A2%E5%9B%BE%E7%89%87.html&quot;&gt;win10 uwp 鼠标移动到图片上切换图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%B8%B2%E6%9F%93%E5%8E%9F%E7%90%86-DirectComposition-%E6%B8%B2%E6%9F%93.html&quot;&gt;win10 uwp 渲染原理 DirectComposition 渲染&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%A6%82%E4%BD%95%E5%8F%91%E9%80%81%E7%B1%BB%E5%88%B0-asp-dotnet-core-%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0.html&quot;&gt;win10 uwp 客户端如何发送类到 asp dotnet core 作为参数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%A6%81%E7%94%A8-ScrollViewer-%E4%BA%A4%E4%BA%92.html&quot;&gt;win10 uwp 禁用 ScrollViewer 交互&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%A8-xaml-%E8%AE%A9-TextBlock-%E6%8D%A2%E8%A1%8C.html&quot;&gt;win10 uwp 在 xaml 让 TextBlock 换行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BC%82%E6%AD%A5%E8%BD%AC%E5%90%8C%E6%AD%A5.html&quot;&gt;win10 uwp 异步转同步&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6%E5%85%A5%E9%97%A8.html&quot;&gt;win10 uwp 自定义控件入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%89%AA%E8%B4%B4%E6%9D%BF-Clipboard.html&quot;&gt;win10 UWP 剪贴板 Clipboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E6%A0%87%E9%A2%98%E6%A0%8F%E5%90%8E%E9%80%80.html&quot;&gt;win10 UWP 标题栏后退&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%AA%8C%E8%AF%81%E8%BE%93%E5%85%A5-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%94%A8%E6%88%B7%E6%8E%A7%E4%BB%B6.html&quot;&gt;win10 uwp 验证输入 自定义用户控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%87%8D%E5%90%AF%E8%BD%AF%E4%BB%B6.html&quot;&gt;win10 uwp 重启软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%80%80%E5%87%BA%E7%A8%8B%E5%BA%8F.html&quot;&gt;win10 uwp 退出程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%BF%9B%E5%BA%A6%E6%9D%A1-WaveProgressControl.html&quot;&gt;win10 uwp 进度条 WaveProgressControl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%BF%9B%E5%BA%A6%E6%9D%A1-Marquez.html&quot;&gt;win10 uwp 进度条 Marquez &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AF%BB%E5%86%99XML.html&quot;&gt;win10 uwp 读写XML&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%90%A4%E7%81%AB%E8%99%AB%E6%95%88%E6%9E%9C.html&quot;&gt;win10 uwp 萤火虫效果&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%BE%97%E7%BC%A9%E7%95%A5%E5%9B%BE.html&quot;&gt;win10 uwp 获得缩略图&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%BE%97%E5%85%83%E7%B4%A0%E7%BB%9D%E5%AF%B9%E5%9D%90%E6%A0%87.html&quot;&gt;win10 uwp 获得元素绝对坐标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6%E5%A4%B9%E5%87%BA%E9%94%99.html&quot;&gt;win10 uwp 获取文件夹出错&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6%E5%88%9D%E5%A7%8B%E5%8C%96.html&quot;&gt;win10 uwp 自定义控件初始化&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%BB%98%E5%9B%BE-Line-%E6%8E%A7%E4%BB%B6%E4%BD%BF%E7%94%A8.html&quot;&gt;win10 uwp 绘图  Line 控件使用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%BB%91%E5%AE%9A-OneWay-%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8.html&quot;&gt;win10 uwp 绑定 OneWay 无法使用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%BA%BF%E7%A8%8B%E6%B1%A0.html&quot;&gt;win10 uwp 线程池&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%A6%81%E6%AD%A2%E7%BC%96%E8%AF%91%E5%99%A8%E4%BC%98%E5%8C%96%E4%BB%A3%E7%A0%81.html&quot;&gt;win10 uwp 禁止编译器优化代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%B0%94%E6%B3%A1.html&quot;&gt;win10 uwp 气泡&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%AF%9B%E7%8E%BB%E7%92%83.html&quot;&gt;win10 uwp 毛玻璃&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%A8%AA%E5%90%91-AppBarButton.html&quot;&gt;win10 uwp 横向 AppBarButton&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%8C%89%E4%B8%8B%E7%AD%89%E5%BE%85%E6%8C%89%E9%92%AE.html&quot;&gt;win10 uwp 按下等待按钮&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%8B%96%E5%8A%A8%E6%8E%A7%E4%BB%B6.html&quot;&gt;win10 uwp 拖动控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%99%A8%E9%80%89%E6%8B%A9%E6%96%87%E4%BB%B6.html&quot;&gt;win10 uwp 打开文件管理器选择文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E8%AE%A9%E4%B8%80%E4%B8%AA%E9%9B%86%E5%90%88%E6%8C%89%E7%85%A7%E9%9C%80%E8%A6%81%E7%9A%84%E9%A1%BA%E5%BA%8F%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.html&quot;&gt;win10 uwp 如何让一个集合按照需要的顺序进行排序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E5%9C%A8DataTemplate%E7%BB%91%E5%AE%9A%E6%96%B9%E6%B3%95.html&quot;&gt;win10 uwp 如何在DataTemplate绑定方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E5%AF%B9%E8%B1%A1%E8%A2%AB%E7%A7%BB%E9%99%A4.html&quot;&gt;win10 uwp 如何判断一个对象被移除&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%BF%AE%E6%94%B9%E4%BF%9D%E5%AD%98%E4%BD%8D%E5%9B%BE.html&quot;&gt;win10 uwp 如何创建修改保存位图&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-dataGrid.html&quot;&gt;win10 uwp dataGrid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-Window.Current.Dispatcher%E4%B8%ADCurrent%E4%B8%BAnull.html&quot;&gt;win10 uwp Window.Current.Dispatcher中Current为null&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-App-to-app-communication-%E5%BA%94%E7%94%A8%E9%80%9A%E4%BF%A1.html&quot;&gt;win10 uwp App-to-app communication 应用通信&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%B0%83%E7%94%A8-Microsoft.Windows.Photos_8wekyb3d8bbwe-%E5%BA%94%E7%94%A8.html&quot;&gt;win10 uwp 调用 Microsoft.Windows.Photos_8wekyb3d8bbwe 应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%85%A8%E5%B1%8F.html&quot;&gt;win10 UWP 全屏&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8%E6%B2%B9%E5%A2%A8%E8%BE%93%E5%85%A5.html&quot;&gt;win10 uwp 使用油墨输入&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AE%BE%E7%BD%AE-HttpClient-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%A0%87%E8%AF%86.html&quot;&gt;win10 uwp 设置 HttpClient 浏览器标识&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%9F%B3%E9%A2%91.html&quot;&gt;win10 uwp 音频&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AF%BB%E5%86%99csv.html&quot;&gt;win10 uwp 读写csv &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AE%BE%E7%BD%AE%E5%90%AF%E5%8A%A8%E7%AA%97%E5%8F%A3%E5%A4%A7%E5%B0%8F-%E8%8E%B7%E5%8F%96%E7%AA%97%E5%8F%A3%E5%A4%A7%E5%B0%8F.html&quot;&gt;win10 uwp 设置启动窗口大小  获取窗口大小&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%AE%A9%E7%84%A6%E7%82%B9%E5%9C%A8%E7%82%B9%E5%87%BB%E5%9C%A8%E9%A1%B5%E9%9D%A2%E7%A9%BA%E7%99%BD%E5%A4%84%E6%97%B6%E5%9B%9E%E5%88%B0textbox%E4%B8%AD.html&quot;&gt;win10 uwp 让焦点在点击在页面空白处时回到textbox中&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%BE%97Slider%E6%8B%96%E5%8A%A8%E7%BB%93%E6%9D%9F%E7%9A%84%E5%80%BC.html&quot;&gt;win10 uwp 获得Slider拖动结束的值&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%8F%96%E6%8C%89%E9%92%AE%E9%BC%A0%E6%A0%87%E5%B7%A6%E9%94%AE%E6%8C%89%E4%B8%8B.html&quot;&gt;win10 uwp 获取按钮鼠标左键按下&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%8F%96%E6%8C%87%E5%AE%9A%E7%9A%84%E6%96%87%E4%BB%B6-AQS.html&quot;&gt;win10 uwp 获取指定的文件 AQS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6-SplitViewItem.html&quot;&gt;win10 uwp 自定义控件 SplitViewItem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.html&quot;&gt;win10 uwp 网络编程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%BB%91%E5%AE%9A%E9%9D%99%E6%80%81%E5%B1%9E%E6%80%A7.html&quot;&gt;win10 uwp 绑定静态属性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%BB%91%E5%AE%9A%E5%AF%86%E7%A0%81.html&quot;&gt;win10 uwp 绑定密码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%AE%80%E5%8D%95MasterDetail.html&quot;&gt;win10 uwp 简单MasterDetail&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%B4%BB%E5%8A%A8%E7%A3%81%E8%B4%B4.html&quot;&gt;win10 uwp 活动磁贴&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%A8%A1%E6%8B%9F%E7%BD%91%E9%A1%B5%E8%BE%93%E5%85%A5.html&quot;&gt;win10 uwp 模拟网页输入&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%94%B9%E5%8F%98%E9%BC%A0%E6%A0%87.html&quot;&gt;win10 uwp 改变鼠标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%89%8B%E5%8A%A8%E9%94%81Bitlocker.html&quot;&gt;win10 uwp 手动锁Bitlocker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BC%82%E6%AD%A5%E8%BF%9B%E5%BA%A6%E6%9D%A1.html&quot;&gt;win10 uwp 异步进度条&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E8%AE%A9WebView%E6%A0%87%E8%AF%86win10%E6%89%8B%E6%9C%BA.html&quot;&gt;win10 uwp 如何让WebView标识win10手机&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E8%AE%A9-Page-%E7%BB%A7%E6%89%BF%E6%B3%9B%E5%9E%8B%E7%B1%BB.html&quot;&gt;win10 uwp 如何让 Page 继承泛型类&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%A6%82%E4%BD%95%E6%8B%96%E5%8A%A8%E4%B8%80%E4%B8%AATextBlock%E7%9A%84%E6%96%87%E5%AD%97%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AATextBlock.html&quot;&gt;win10 uwp 如何拖动一个TextBlock的文字到另一个TextBlock &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%86%E8%A7%92%E6%8C%89%E9%92%AE.html&quot;&gt;win10 uwp 圆角按钮&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%88%A4%E6%96%AD%E6%96%87%E4%BB%B6%E5%AD%98%E5%9C%A8.html&quot;&gt;win10 uwp 判断文件存在&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%88%86%E6%B2%BB%E6%B3%95.html&quot;&gt;win10 uwp 分治法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BB%8EType%E4%BD%BF%E7%94%A8%E6%9E%84%E9%80%A0.html&quot;&gt;win10 uwp 从Type使用构造&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BB%8EStorageFile%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F.html&quot;&gt;win10 uwp 从StorageFile获取文件大小&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%B8%8A%E4%BC%A0Nuget-%E8%AE%A9%E5%88%AB%E4%BA%BA%E7%94%A8%E6%88%91%E4%BB%AC%E7%9A%84%E5%BA%93.html&quot;&gt;win10 uwp 上传Nuget 让别人用我们的库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-iot.html&quot;&gt;win10 uwp iot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-InkCanvas%E6%8E%A7%E4%BB%B6%E6%95%B0%E6%8D%AE%E7%BB%91%E5%AE%9A.html&quot;&gt;win10 uwp InkCanvas控件数据绑定&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-HttpClient-post%E9%94%99%E8%AF%AF.html&quot;&gt;win10 uwp HttpClient post错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-ContentDialog-%E7%82%B9%E7%A1%AE%E5%AE%9A%E4%B8%8D%E5%85%B3%E9%97%AD.html&quot;&gt;win10 uwp ContentDialog 点确定不关闭&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-BadgeLogo-%E9%A2%9C%E8%89%B2.html&quot;&gt;win10 uwp BadgeLogo 颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%BA%94%E7%94%A8%E8%AE%BE%E7%BD%AE.html&quot;&gt;win10 UWP 应用设置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95.html&quot;&gt;win10 UWP 单元测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-MessageDialog-%E5%92%8C-ContentDialog.html&quot;&gt;win10 UWP MessageDialog 和 ContentDialog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-Hmac.html&quot;&gt;win10 UWP Hmac&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win-10-UWP-%E6%A0%87%E7%AD%BE.html&quot;&gt;win 10 UWP 标签&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Win10-UWP-Intro-to-controls-and-events.html&quot;&gt;Win10 UWP Intro to controls and events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8F%82%E8%80%83.html&quot;&gt;win10 uwp 参考&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BF%AE%E6%94%B9CalendarDatePicker%E5%9B%BE%E6%A0%87%E9%A2%9C%E8%89%B2.html&quot;&gt;win10 uwp 修改CalendarDatePicker图标颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%85%B3%E8%81%94%E6%96%87%E4%BB%B6.html&quot;&gt;win10 uwp 关联文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8F%91%E5%B8%83%E6%97%81%E5%8A%A0%E8%BD%BD%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0.html&quot;&gt;win10 uwp 发布旁加载自动更新&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%A8-Grid-%E6%8E%A5%E6%94%B6%E9%94%AE%E7%9B%98%E6%B6%88%E6%81%AF.html&quot;&gt;win10 uwp 在 Grid 接收键盘消息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%88%87%E6%8D%A2%E4%B8%BB%E9%A2%98.html&quot;&gt;win10 uwp 切换主题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-Microsoft.Graph-%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6.html&quot;&gt;win10 uwp 使用 Microsoft.Graph 发送邮件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8A%A8%E7%94%BB%E7%A7%BB%E5%8A%A8%E6%BB%91%E5%8A%A8%E6%9D%A1%E7%9A%84%E6%BB%91%E5%9D%97.html&quot;&gt;win10 uwp 动画移动滑动条的滑块&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E4%BB%8E%E6%96%87%E4%BB%B6-StorageFile-%E8%BD%AC-SoftwareBitmap-%E5%9B%BE%E7%89%87%E6%96%B9%E6%B3%95.html&quot;&gt;UWP 从文件 StorageFile 转 SoftwareBitmap 图片方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BF%AE%E6%94%B9%E5%9B%BE%E7%89%87%E8%B4%A8%E9%87%8F%E5%8E%8B%E7%BC%A9%E5%9B%BE%E7%89%87.html&quot;&gt;win10 uwp 修改图片质量压缩图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%A8-ItemsPanelTemplate-%E9%87%8C%E9%9D%A2%E9%80%9A%E8%BF%87%E6%A0%B7%E5%BC%8F%E7%BB%91%E5%AE%9A-Orientation-%E6%98%BE%E7%A4%BA%E6%96%B9%E5%90%91.html&quot;&gt;win10 uwp 在 ItemsPanelTemplate 里面通过样式绑定 Orientation 显示方向&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/uwp-ScrollViewer-content-out-of-panel-when-set-the-long-width.html&quot;&gt;uwp ScrollViewer content out of panel when set the long width&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-ScaleTransform-%E6%94%BE%E5%A4%A7%E6%9F%90%E4%B8%AA%E5%85%83%E7%B4%A0.html&quot;&gt;win10 uwp 使用 ScaleTransform 放大某个元素&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%B8%80%E5%BC%A0%E5%9B%BE%E8%AF%B4%E6%98%8E%E6%B0%B4%E5%B9%B3%E5%AF%B9%E9%BD%90%E5%92%8C%E5%9E%82%E7%9B%B4%E5%AF%B9%E9%BD%90.html&quot;&gt;win10 uwp 一张图说明水平对齐和垂直对齐&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-LayoutTransformer.html&quot;&gt;win10 uwp 使用 LayoutTransformer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8E%BB%E6%8E%89-Flyout-%E8%BE%B9%E6%A1%86.html&quot;&gt;win10 uwp 去掉 Flyout 边框&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-release-%E5%9B%A0%E4%B8%BA-Entry-Point-Not-Found-%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8.html&quot;&gt;win10 uwp release 因为 Entry Point Not Found 无法启动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-Matrix3DProjection-%E8%BF%9B%E8%A1%8C-3d-%E6%8A%95%E5%BD%B1.html&quot;&gt;win10 uwp 使用 Matrix3DProjection 进行 3d 投影&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%8E%A7%E4%BB%B6.html&quot;&gt;控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%89%E7%A7%8D%E6%96%B9%E5%BC%8F%E8%AE%BE%E7%BD%AE%E7%89%B9%E5%AE%9A%E8%AE%BE%E5%A4%87UWP-XAML-view.html&quot;&gt;三种方式设置特定设备UWP XAML view&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%A8-Canvas-%E6%94%BE%E4%B8%80%E4%B8%AA%E8%B6%85%E8%BF%87%E5%A4%A7%E5%B0%8F%E7%9A%84%E5%85%83%E7%B4%A0%E4%BC%9A%E4%B8%8D%E4%BC%9A%E8%A2%AB%E8%A3%81%E5%89%AA.html&quot;&gt;win10 uwp 在 Canvas 放一个超过大小的元素会不会被裁剪&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%90%8E%E5%8F%B0%E8%8E%B7%E5%8F%96%E8%B5%84%E6%BA%90.html&quot;&gt;win10 uwp 后台获取资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8F%8D%E5%B0%84.html&quot;&gt;win10 uwp 反射&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BF%AE%E6%94%B9Pivot-Header-%E9%A2%9C%E8%89%B2.html&quot;&gt;win10 uwp 修改Pivot Header 颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8%E8%B5%84%E6%BA%90%E5%9C%A8%E5%90%8E%E5%8F%B0%E5%88%9B%E5%BB%BA%E6%8E%A7%E4%BB%B6.html&quot;&gt;win10 uwp 使用资源在后台创建控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8%E5%8A%A8%E7%94%BB%E4%BF%AE%E6%94%B9-Grid-column-%E7%9A%84%E5%AE%BD%E5%BA%A6.html&quot;&gt;win10 uwp 使用动画修改 Grid column 的宽度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-Geometry-resources-%E5%9C%A8-xaml.html&quot;&gt;win10 uwp 使用 Geometry resources 在 xaml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-slider-%E9%9A%90%E8%97%8F%E6%98%BE%E7%A4%BA%E6%95%B0%E5%80%BC.html&quot;&gt;win10 uwp slider 隐藏显示数值&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-ping.html&quot;&gt;win10 uwp ping&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-json.html&quot;&gt;win10 uwp json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-httpClient-%E7%99%BB%E9%99%86CSDN.html&quot;&gt;win10 uwp httpClient 登陆CSDN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-MetroLog-%E5%85%A5%E9%97%A8.html&quot;&gt;win10 uwp MetroLog 入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-MVVM-%E8%AF%AD%E4%B9%89%E8%80%A6%E5%90%88.html&quot;&gt;win10 uwp MVVM 语义耦合&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-DataContext.html&quot;&gt;win10 uwp DataContext &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-ApplicationView.html&quot;&gt;win10 uwp ApplicationView&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-sdk-%E6%98%AF%E5%90%A6%E5%90%91%E4%B8%8B%E5%85%BC%E5%AE%B9.html&quot;&gt;win10 sdk 是否向下兼容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E8%AE%BF%E9%97%AE%E7%BD%91%E9%A1%B5.html&quot;&gt;win10 UWP 访问网页&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E7%94%A8Path%E7%94%BB%E5%9B%BE.html&quot;&gt;win10 UWP 用Path画图&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%9C%86%E5%BD%A2%E7%AD%89%E5%BE%85.html&quot;&gt;win10 UWP 圆形等待&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%8F%91%E9%82%AE%E4%BB%B6.html&quot;&gt;win10 UWP 发邮件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81%E6%A1%86%E6%96%87%E5%AD%97%E6%B0%B4%E5%B9%B3.html&quot;&gt;win10 UWP 修改密码框文字水平&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-button.html&quot;&gt;win10 UWP button&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-ListView.html&quot;&gt;win10 UWP ListView &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-xaml-%E5%85%BC%E5%AE%B9%E5%A4%9A%E4%B8%AA%E7%89%88%E6%9C%AC%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91.html&quot;&gt;win10 uwp xaml 兼容多个版本条件编译&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-url-encode.html&quot;&gt;win10 uwp url encode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-Border-%E5%B8%83%E5%B1%80.html&quot;&gt;win10 uwp 使用 Border 布局&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-xaml-%E7%BB%91%E5%AE%9A%E6%8E%A5%E5%8F%A3.html&quot;&gt;win10 uwp xaml 绑定接口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8A%A8%E6%80%81%E4%BF%AE%E6%94%B9ListView%E5%85%83%E7%B4%A0%E5%B8%83%E5%B1%80.html&quot;&gt;win10 uwp 动态修改ListView元素布局&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9B%BE%E6%A0%87%E5%88%B6%E4%BD%9C%E5%99%A8.html&quot;&gt;win10 uwp 图标制作器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8F%B3%E5%87%BB%E9%80%89%E6%8B%A9-GridViewItem.html&quot;&gt;win10 uwp 右击选择 GridViewItem &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%88%A4%E6%96%AD%E8%AE%BE%E5%A4%87%E7%B1%BB%E5%9E%8B.html&quot;&gt;win10 uwp 判断设备类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-unix-timestamp-%E6%97%B6%E9%97%B4%E6%88%B3-%E8%BD%AC-DateTime.html&quot;&gt;win10 uwp unix timestamp 时间戳 转 DateTime&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-hashcash.html&quot;&gt;win10 uwp hashcash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E6%98%BE%E7%A4%BA%E5%9C%B0%E5%9B%BE.html&quot;&gt;win10 UWP 显示地图&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E4%BD%A0%E5%86%99%E6%88%91%E8%AF%BB.html&quot;&gt;win10 UWP 你写我读&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E4%B9%9D%E5%B9%BD%E7%99%BB%E5%BD%95.html&quot;&gt;win10 UWP 九幽登录&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E4%B9%9D%E5%B9%BD%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90.html&quot;&gt;win10 UWP 九幽数据分析&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-Markdown-%E5%90%AB%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;win10 UWP Markdown 含源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-ListView-%E6%A8%A1%E4%BB%BF%E5%BC%80%E5%A7%8B%E8%8F%9C%E5%8D%95.html&quot;&gt;win10 UWP ListView 模仿开始菜单&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E8%9C%98%E8%9B%9B%E7%BD%91%E6%95%88%E6%9E%9C.html&quot;&gt;win10 UWP  蜘蛛网效果&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Win10-%E4%BD%BF%E7%94%A8-GHO-%E5%AE%89%E8%A3%85%E5%87%BA%E7%8E%B0-UWP-%E8%BD%AF%E4%BB%B6%E6%89%93%E5%BC%80%E9%97%AA%E9%80%80-%E5%BA%94%E7%94%A8%E5%95%86%E5%BA%97%E6%97%A0%E6%B3%95%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6.html&quot;&gt;Win10 使用 GHO 安装出现 UWP 软件打开闪退 应用商店无法安装软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-WPF-%E8%A7%A3%E5%86%B3-xaml-%E8%AE%BE%E8%AE%A1%E6%98%BE%E7%A4%BA%E5%BC%82%E5%B8%B8.html&quot;&gt;UWP WPF 解决 xaml 设计显示异常&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%9A%90%E7%A7%81%E5%A3%B0%E6%98%8E.html&quot;&gt;win10 uwp 隐私声明&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%9A%8F%E7%9D%80%E6%95%B0%E5%AD%97%E5%8F%98%E5%8C%96%E9%A2%9C%E8%89%B2%E6%8E%A7%E4%BB%B6.html&quot;&gt;win10 uwp 随着数字变化颜色控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%BD%A6%E8%A1%A8%E7%9B%98-%E5%BE%84%E5%90%91%E8%A7%84.html&quot;&gt;win10 uwp 车表盘 径向规&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%8E%B7%E5%BE%97%E7%84%A6%E7%82%B9%E6%94%B9%E5%8F%98.html&quot;&gt;win10 uwp 获得焦点改变&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%A0%87%E9%A2%98%E6%A0%8F.html&quot;&gt;win10 uwp 标题栏&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%89%93%E7%94%B5%E8%AF%9D.html&quot;&gt;win10 uwp 打电话&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%88%AA%E5%9B%BE-%E8%8E%B7%E5%8F%96%E5%B1%8F%E5%B9%95%E6%98%BE%E7%A4%BA%E7%95%8C%E9%9D%A2%E4%BF%9D%E5%AD%98%E5%9B%BE%E7%89%87.html&quot;&gt;win10 uwp 截图 获取屏幕显示界面保存图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E8%BD%AC%E6%8D%A2-IBuffer-%E5%92%8C%E5%85%B6%E4%BB%96%E7%B1%BB%E5%9E%8B.html&quot;&gt;UWP 转换 IBuffer 和其他类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/How-to-use-code-to-exit-the-application-in-UWP.html&quot;&gt;How to use code to exit the application in UWP&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-How-to-custom-RichTextBlock-right-click-menu.html&quot;&gt;UWP How to custom RichTextBlock right click menu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-IRandomAccessStream-%E4%B8%8E-Stream-%E4%BA%92%E8%BD%AC.html&quot;&gt;UWP IRandomAccessStream 与 Stream 互转&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BC%B9%E8%B5%B7%E9%94%AE%E7%9B%98%E4%B8%8D%E9%9A%90%E8%97%8F%E7%95%8C%E9%9D%A2%E5%85%83%E7%B4%A0.html&quot;&gt;win10 uwp 弹起键盘不隐藏界面元素&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BA%94%E7%94%A8%E8%BD%AC%E5%90%8E%E5%8F%B0%E6%B8%85%E7%90%86%E5%86%85%E5%AD%98.html&quot;&gt;win10 uwp 应用转后台清理内存&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%B8%83%E5%B1%80.html&quot;&gt;win10 uwp 布局&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%AD%98%E6%94%BE%E7%BD%91%E7%BB%9C%E5%9B%BE%E7%89%87%E5%88%B0%E6%9C%AC%E5%9C%B0.html&quot;&gt;win10 uwp 存放网络图片到本地&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%88%87%E6%8D%A2%E4%B8%BB%E9%A2%98.html&quot;&gt;win10 uwp 切换主题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%85%B4%E8%B6%A3%E7%BA%BF.html&quot;&gt;win10 uwp 兴趣线&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BF%9D%E5%AD%98%E7%94%A8%E6%88%B7%E9%80%89%E6%8B%A9%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;win10 uwp 保存用户选择文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%B9%9D%E5%B9%BD%E5%9B%BE%E5%BA%8A.html&quot;&gt;win10 uwp 九幽图床&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-Markdown.html&quot;&gt;win10 uwp Markdown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E7%94%A8%E5%B9%BF%E5%91%8A%E8%B5%9A%E9%92%B1.html&quot;&gt;win10 uwp 用广告赚钱&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-Fluent-Design-System-%E5%AE%9E%E8%B7%B5.html&quot;&gt;win10 uwp Fluent Design System 实践&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-smms%E5%9B%BE%E5%BA%8A.html&quot;&gt;win10 uwp smms图床&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-WinUI3-%E4%BC%A0%E5%85%A5-AddHandler-%E7%9A%84-RoutedEventHandler-%E7%B1%BB%E5%9E%8B%E4%B8%8E%E4%BA%8B%E4%BB%B6%E6%89%80%E9%9C%80%E4%B8%8D%E5%8C%B9%E9%85%8D%E5%B0%86%E6%8A%9B%E5%87%BA%E5%8F%82%E6%95%B0%E5%BC%82%E5%B8%B8.html&quot;&gt;UWP WinUI3 传入 AddHandler 的 RoutedEventHandler 类型与事件所需不匹配将抛出参数异常&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;mvvm&quot;&gt;MVVM&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-MvvmLight%E5%85%A5%E9%97%A8.html&quot;&gt;win10 UWP MvvmLight入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-MVVM%E5%85%A5%E9%97%A8.html&quot;&gt;win10 uwp MVVM入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-MVVM-%E8%BD%BB%E9%87%8F%E6%A1%86%E6%9E%B6.html&quot;&gt;win10 uwp MVVM 轻量框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%BD%BB%E9%87%8F%E7%BA%A7-MVVM-%E6%A1%86%E6%9E%B6%E5%85%A5%E9%97%A8-2.1.5.3199.html&quot;&gt;win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;构建部署&quot;&gt;构建部署&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%8F%91%E5%B8%83%E7%9A%84%E6%97%B6%E5%80%99-ILC-%E7%BC%96%E8%AF%91%E4%B8%8D%E9%80%9A%E8%BF%87.html&quot;&gt;win10 uwp 发布的时候 ILC 编译不通过&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E9%83%A8%E7%BD%B2%E5%A4%B1%E8%B4%A5-DEP0700-0x80073CF0-%E9%94%99%E8%AF%AF-0x800701C0-%E4%BB%8E%E4%BD%8D%E7%BD%AE-AppxManifest.xml-%E4%B8%AD%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%E5%A4%B1%E8%B4%A5.html&quot;&gt;UWP 部署失败 DEP0700 0x80073CF0 错误 0x800701C0 从位置 AppxManifest.xml 中打开文件失败&lt;/a&gt;
&lt;!-- [UWP 部署失败 DEP0700 0x80073CF0 错误 0x800701C0 从位置 AppxManifest.xml 中打开文件失败 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18676067 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-AppCenter-%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA.html&quot;&gt;win10 uwp 使用 AppCenter 自动构建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-Azure-DevOps-%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA.html&quot;&gt;win10 uwp 使用 Azure DevOps 自动构建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%A8-VisualStudio-%E9%83%A8%E7%BD%B2%E5%A4%B1%E8%B4%A5-%E6%89%BE%E4%B8%8D%E5%88%B0-Windows-Phone-%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;win10 uwp 在 VisualStudio 部署失败，找不到 Windows Phone 可能的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E6%89%93%E5%8C%85-win32-%E5%BA%94%E7%94%A8-%E6%B7%BB%E5%8A%A0%E9%98%B2%E7%81%AB%E5%A2%99%E4%BE%8B%E5%A4%96.html&quot;&gt;UWP 打包 win32 应用 添加防火墙例外&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%89%93%E5%8C%85%E4%B8%BA-UWP-%E5%BA%94%E7%94%A8%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5-MSB3270-%E4%B8%8D%E5%8C%B9%E9%85%8D-AMD64-%E6%9E%B6%E6%9E%84.html&quot;&gt;WPF 打包为 UWP 应用构建失败 MSB3270 不匹配 AMD64 架构&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-msbuild-%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%BC%96%E8%AF%91-UWP-%E7%A8%8B%E5%BA%8F.html&quot;&gt;win10 uwp 使用 msbuild 命令行编译 UWP 程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%AE%E5%A4%8D-WPF-%E5%AE%89%E8%A3%85-WindowsAppSDK-%E5%BA%93%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5-NETSDK1082-%E5%92%8C-NETSDK1112-%E6%89%BE%E4%B8%8D%E5%88%B0-win10-arm-%E5%A4%B1%E8%B4%A5.html&quot;&gt;修复 WPF 安装 WindowsAppSDK 库构建失败 NETSDK1082 和 NETSDK1112 找不到 win10-arm 失败&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;发布&quot;&gt;发布&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%9B%BD%E5%86%85%E5%8F%91%E5%B8%83-UWP-%E5%BA%94%E7%94%A8.html&quot;&gt;如何在国内发布 UWP 应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%8A%A0%E5%BC%BA%E7%89%88%E5%9C%A8%E5%9B%BD%E5%86%85%E5%88%86%E5%8F%91-UWP-%E5%BA%94%E7%94%A8%E6%AD%A3%E7%A1%AE%E6%96%B9%E5%BC%8F-%E9%80%9A%E8%BF%87win32%E5%AE%89%E8%A3%85UWP%E5%BA%94%E7%94%A8.html&quot;&gt;加强版在国内分发 UWP 应用正确方式 通过win32安装UWP应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UWP-%E4%B8%8A%E6%9E%B6%E5%A4%B1%E8%B4%A5%E5%9B%A0%E4%B8%BA%E6%B2%A1%E6%9C%89%E6%B7%BB%E5%8A%A0%E9%9A%90%E7%A7%81%E7%AD%96%E7%95%A5.html&quot;&gt;UWP 上架失败因为没有添加隐私策略&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%9C%A8-VisualStudio-%E6%89%93%E5%8C%85%E6%B5%8B%E8%AF%95%E5%AE%8C%E6%88%90%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E5%88%B0%E5%BA%94%E7%94%A8%E5%95%86%E5%BA%97.html&quot;&gt;win10 uwp 在 VisualStudio 打包测试完成自动上传到应用商店&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%BA%94%E7%94%A8%E5%8C%85%E4%B8%8A%E4%BC%A0%E5%A4%B1%E8%B4%A5%E6%97%A0%E6%95%88%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%B3%BB%E5%88%97%E5%90%8D%E7%A7%B0.html&quot;&gt;win10 uwp 应用包上传失败无效的软件包系列名称&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%AE%89%E8%A3%85%E6%96%87%E4%BB%B6-appinstaller-%E6%A0%BC%E5%BC%8F.html&quot;&gt;win10 uwp 安装文件 appinstaller 格式&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;调试&quot;&gt;调试&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%B0%83%E8%AF%95%E8%BD%AF%E4%BB%B6%E5%90%AF%E5%8A%A8.html&quot;&gt;win10 uwp 调试软件启动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%9A%90%E8%97%8F%E5%AE%9E%E6%97%B6%E5%8F%AF%E8%A7%86%E5%8C%96.html&quot;&gt;win10 uwp 隐藏实时可视化&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E6%97%A0%E6%B3%95%E9%99%84%E5%8A%A0%E5%88%B0CoreCLR.html&quot;&gt;win10 uwp 无法附加到CoreCLR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E4%BD%BF%E7%94%A8-WinDbg-%E8%B0%83%E8%AF%95.html&quot;&gt;win10 uwp 使用 WinDbg 调试&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;应用开发&quot;&gt;应用开发&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%84%E7%BD%97%E6%96%AF%E6%96%B9%E5%9D%97.html&quot;&gt;俄罗斯方块&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%95%86%E4%B8%9A%E6%B8%B8%E6%88%8F.html&quot;&gt;win10 uwp 商业游戏 &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%95%86%E4%B8%9A%E6%B8%B8%E6%88%8F-1.1.5.html&quot;&gt;win10 uwp 商业游戏 1.1.5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E5%95%86%E4%B8%9A%E6%B8%B8%E6%88%8F-1.2.1.html&quot;&gt;win10 uwp 商业游戏 1.2.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E8%A3%85%E6%9C%BA%E5%BF%85%E5%A4%87%E5%BA%94%E7%94%A8-%E5%90%AB%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;win10 uwp 装机必备应用 含源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-RSS%E9%98%85%E8%AF%BB%E5%99%A8.html&quot;&gt;win10 UWP RSS阅读器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-csdn-%E5%8D%9A%E5%AE%A2%E9%98%85%E8%AF%BB%E5%99%A8.html&quot;&gt;win10 uwp csdn 博客阅读器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A7%81%E5%AF%86%E5%AF%86%E7%A0%81%E6%9C%AC-2.1-%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;私密密码本 2.1 源代码&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;win2d&quot;&gt;Win2D&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-win2d-%E5%85%A5%E9%97%A8-%E7%9C%8B%E8%BF%99%E4%B8%80%E7%AF%87%E5%B0%B1%E5%A4%9F%E4%BA%86.html&quot;&gt;win10 uwp win2d 入门 看这一篇就够了&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-win2d-%E7%A6%BB%E5%B1%8F%E6%B8%B2%E6%9F%93.html&quot;&gt;win10 uwp win2d 离屏渲染&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win2d-CanvasRenderTarget-vs-CanvasBitmap.html&quot;&gt;win2d CanvasRenderTarget vs CanvasBitmap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-win2d-%E4%BD%BF%E7%94%A8-Path-%E7%BB%98%E5%88%B6%E7%95%8C%E9%9D%A2.html&quot;&gt;win10 uwp win2d 使用 Path 绘制界面&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-win2d-CanvasVirtualControl-%E4%B8%8E-CanvasAnimatedControl.html&quot;&gt;win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%80%9A%E8%BF%87-win2d-%E7%94%BB%E5%87%BA%E7%AC%94%E8%BF%B9.html&quot;&gt;win10 uwp 通过 win2d 画出笔迹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-%E9%80%9A%E8%BF%87-Win2d-%E5%AE%8C%E5%85%A8%E6%8E%A7%E5%88%B6%E7%AC%94%E8%BF%B9%E7%BB%98%E5%88%B6%E9%80%BB%E8%BE%91.html&quot;&gt;win10 uwp 通过 Win2d 完全控制笔迹绘制逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-uwp-win2d-%E7%89%B9%E6%95%88.html&quot;&gt;win10 uwp win2d 特效&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win2d-%E9%80%9A%E8%BF%87-CanvasActiveLayer-%E7%94%BB%E5%87%BA%E9%80%8F%E6%98%8E%E5%BA%A6%E5%92%8C%E8%A3%81%E5%89%AA.html&quot;&gt;win2d 通过 CanvasActiveLayer 画出透明度和裁剪&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win2d-%E5%9B%BE%E7%89%87%E6%B0%B4%E5%8D%B0.html&quot;&gt;win2d 图片水印&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win2d-CanvasCommandList-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html&quot;&gt;win2d CanvasCommandList 使用方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win2d-%E7%94%BB%E5%87%BA%E5%A5%BD%E7%9C%8B%E7%9A%84%E5%9B%BE%E5%BD%A2.html&quot;&gt;win2d 画出好看的图形&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win2d-%E6%B8%90%E5%8F%98%E9%A2%9C%E8%89%B2.html&quot;&gt;win2d 渐变颜色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-WinUI3-Win2D-%E7%BF%BB%E8%BD%AC%E5%9B%BE%E7%89%87.html&quot;&gt;dotnet WinUI3 Win2D 翻转图片&lt;/a&gt;
&lt;!-- [dotnet WinUI3 Win2D 翻转图片 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18288633 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BB%8E%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%BC%80%E5%A7%8B-%E5%85%B3%E8%81%94-Win2D-%E5%92%8C-WinUI-3-%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet C# 从控制台开始 关联 Win2D 和 WinUI 3 应用&lt;/a&gt;
&lt;!-- [dotnet C# 从控制台开始 关联 Win2D 和 WinUI 3 应用 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18378612 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;winui-3&quot;&gt;WinUI 3&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E4%BB%8E%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%88%9B%E5%BB%BA-WinUI-3-%E5%BA%94%E7%94%A8.html&quot;&gt;C# 从控制台创建 WinUI 3 应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WinUI-3-%E4%BF%AE%E5%A4%8D%E9%9D%9E%E6%89%93%E5%8C%85%E5%BA%94%E7%94%A8%E8%BF%90%E8%A1%8C%E6%8F%90%E7%A4%BA%E7%BC%BA%E5%B0%91-Windows-App-Runtime-%E7%8E%AF%E5%A2%83.html&quot;&gt;WinUI 3 修复非打包应用运行提示缺少 Windows App Runtime 环境&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-WinUI-3-%E4%BF%AE%E5%A4%8D%E9%9D%9E%E6%89%93%E5%8C%85%E5%BA%94%E7%94%A8%E8%BF%90%E8%A1%8C%E6%8F%90%E7%A4%BA-Microsoft.ui.xaml.dll-%E6%89%BE%E4%B8%8D%E5%88%B0.html&quot;&gt;dotnet WinUI 3 修复非打包应用运行提示 Microsoft.ui.xaml.dll 找不到&lt;/a&gt;
&lt;!-- [dotnet WinUI 3 修复非打包应用运行提示 Microsoft.ui.xaml.dll 找不到 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18381793 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%AE%80%E5%8D%95%E5%9C%A8-WinUI-%E4%BB%BF%E9%80%A0-WPF-%E7%9A%84-ColumnDefinition-SharedSizeGroup-%E5%85%B1%E4%BA%AB%E5%88%97%E5%AE%BD%E5%8A%9F%E8%83%BD.html&quot;&gt;简单在 WinUI 仿造 WPF 的 ColumnDefinition SharedSizeGroup 共享列宽功能&lt;/a&gt;
&lt;!-- [简单在 WinUI 仿造 WPF 的 ColumnDefinition SharedSizeGroup 共享列宽功能 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18353046 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-WinUI3-Win2D-%E7%BF%BB%E8%BD%AC%E5%9B%BE%E7%89%87.html&quot;&gt;dotnet WinUI3 Win2D 翻转图片&lt;/a&gt;
&lt;!-- [dotnet WinUI3 Win2D 翻转图片 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18288633 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BB%8E%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%BC%80%E5%A7%8B-%E5%85%B3%E8%81%94-Win2D-%E5%92%8C-WinUI-3-%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet C# 从控制台开始 关联 Win2D 和 WinUI 3 应用&lt;/a&gt;
&lt;!-- [dotnet C# 从控制台开始 关联 Win2D 和 WinUI 3 应用 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18378612 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;winforms&quot;&gt;WinForms&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WinForms-%E4%BD%BF%E7%94%A8-Image-%E7%9A%84-FromFile-%E6%96%B9%E6%B3%95%E5%8A%A0%E8%BD%BD%E6%96%87%E4%BB%B6%E5%92%8C%E4%BD%BF%E7%94%A8-Bitmap-%E6%9C%89%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C.html&quot;&gt;WinForms 使用 Image 的 FromFile 方法加载文件和使用 Bitmap 有什么不同&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WinForms-%E4%B8%8B%E7%9A%84%E9%AB%98%E6%80%A7%E8%83%BD%E7%AC%94%E8%BF%B9%E6%96%B9%E6%B3%95.html&quot;&gt;WinForms 下的高性能笔迹方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Winforms-%E5%8F%AF%E8%83%BD%E9%81%87%E5%88%B0%E7%9A%84-1000-%E4%B8%AA%E9%97%AE%E9%A2%98.html&quot;&gt;Winforms 可能遇到的 1000 个问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-winforms-%E8%BE%93%E5%85%A5%E9%A2%9C%E8%89%B2%E8%BD%AC%E6%8D%A2%E9%A2%9C%E8%89%B2%E5%90%8D.html&quot;&gt;C# winforms 输入颜色转换颜色名&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;maui&quot;&gt;MAUI&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Multi-platform-App-UI-%E5%A4%9A%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8-UI-%E6%A1%86%E6%9E%B6%E7%AE%80%E4%BB%8B.html&quot;&gt;dotnet Multi-platform App UI 多平台应用 UI 框架简介&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/MAUI-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%98%E5%9B%BE%E5%85%A5%E9%97%A8.html&quot;&gt;MAUI 自定义绘图入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-MAUI-%E7%9A%84%E8%87%AA%E7%BB%98%E5%88%B6%E9%80%BB%E8%BE%91.html&quot;&gt;WPF 使用 MAUI 的自绘制逻辑&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/16395472.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%8E%A7%E5%88%B6%E5%8F%B0-%E4%BD%BF%E7%94%A8-Microsoft.Maui.Graphics-%E9%85%8D%E5%90%88-Skia-%E8%BF%9B%E8%A1%8C%E7%BB%98%E5%9B%BE%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet 控制台 使用 Microsoft.Maui.Graphics 配合 Skia 进行绘图入门&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/16433320.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Microsoft.Maui.Graphics.Skia-%E4%BD%BF%E7%94%A8-DrawString-%E7%BB%98%E5%88%B6%E6%96%87%E6%9C%AC%E7%9A%84%E5%9D%90%E6%A0%87%E9%97%AE%E9%A2%98.html&quot;&gt;Microsoft.Maui.Graphics.Skia 使用 DrawString 绘制文本的坐标问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/zh7791/p/15594282.html&quot;&gt;MAUI中使用Maui.Graphics.Controls绘制控件 - 痕迹g - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-OpenXML-%E4%BD%BF%E7%94%A8-MAUI-%E6%B8%B2%E6%9F%93-PPT-%E7%9A%84%E9%9D%A2%E7%A7%AF%E5%9B%BE%E5%9B%BE%E8%A1%A8.html&quot;&gt;dotnet OpenXML 使用 MAUI 渲染 PPT 的面积图图表&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/16671495.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/MAUI-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-PathFigureCollectionConverter-%E9%9D%9E%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8.html&quot;&gt;MAUI 已知问题 PathFigureCollectionConverter 非线程安全&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;maui-框架开发&quot;&gt;MAUI 框架开发&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/MAUI-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-%E5%B0%86-MAUI-%E5%B5%8C%E5%85%A5%E5%88%B0-WPF-%E6%8E%A7%E4%BB%B6%E9%87%8C.html&quot;&gt;MAUI 框架开发 将 MAUI 嵌入到 WPF 控件里&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB-MAUI-%E6%BA%90%E4%BB%A3%E7%A0%81-%E7%90%86%E8%A7%A3%E5%8F%AF%E7%BB%91%E5%AE%9A%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%8F%AF%E7%BB%91%E5%AE%9A%E5%B1%9E%E6%80%A7%E7%9A%84%E5%AD%98%E5%82%A8%E6%9C%BA%E5%88%B6.html&quot;&gt;读 MAUI 源代码 理解可绑定对象和可绑定属性的存储机制&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;xamarin&quot;&gt;Xamarin&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin.Forms-%E9%80%89%E5%8F%96%E6%96%87%E4%BB%B6-%E8%AE%A9%E7%94%A8%E6%88%B7%E9%80%89%E6%8B%A9%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6.html&quot;&gt;Xamarin.Forms 选取文件 让用户选择本地文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-iOS-%E9%83%A8%E7%BD%B2%E5%BA%94%E7%94%A8%E6%8F%90%E7%A4%BA-iOS-code-signing-key-%E5%A4%B1%E8%B4%A5.html&quot;&gt;Xamarin iOS 部署应用提示 iOS code signing key 失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-%E5%92%8C-WPF-%E7%9A%84%E6%8E%A7%E4%BB%B6%E5%92%8C%E5%B1%9E%E6%80%A7%E7%9A%84%E6%9B%BF%E6%8D%A2.html&quot;&gt;Xamarin 和 WPF 的控件和属性的替换&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-%E6%9E%84%E5%BB%BA%E5%AE%89%E5%8D%93%E5%A4%B1%E8%B4%A5-%E5%9B%A0%E4%B8%BA%E8%B7%AF%E5%BE%84%E5%A4%AA%E9%95%BF.html&quot;&gt;Xamarin 构建安卓失败 因为路径太长&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-%E6%9E%84%E5%BB%BA%E6%8F%90%E7%A4%BA-error-APT2260-resource-%E6%89%BE%E4%B8%8D%E5%88%B0%E8%B5%84%E6%BA%90.html&quot;&gt;Xamarin 构建提示 error APT2260 resource 找不到资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-iOS-%E5%88%87%E6%8D%A2%E5%BC%80%E5%8F%91%E8%80%85%E8%B4%A6%E5%8F%B7%E4%B9%8B%E5%90%8E%E7%9A%84%E7%AD%BE%E5%90%8D%E6%A0%87%E8%AF%86%E5%92%8C%E9%A2%84%E9%85%8D%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%9B%B4%E6%96%B0%E6%96%B9%E6%B3%95.html&quot;&gt;Xamarin iOS 切换开发者账号之后的签名标识和预配配置文件更新方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin.Forms-%E6%8C%89%E9%92%AE%E6%A0%B7%E5%BC%8F-%E5%9C%86%E8%A7%92%E6%8C%89%E9%92%AE.html&quot;&gt;Xamarin.Forms 按钮样式 圆角按钮&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-%E8%A7%A3%E5%86%B3%E5%88%9B%E5%BB%BA%E7%A9%BA%E7%99%BD%E9%A1%B9%E7%9B%AE%E7%BC%96%E8%AF%91%E6%8F%90%E7%A4%BA-linking-references-%E6%89%BE%E4%B8%8D%E5%88%B0%E8%B5%84%E6%BA%90.html&quot;&gt;Xamarin 解决创建空白项目编译提示 linking references 找不到资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-Forms-WPF-%E5%B9%B2%E6%8E%89%E9%BB%98%E8%AE%A4%E7%9A%84%E7%AA%97%E5%8F%A3%E5%AF%BC%E8%88%AA%E6%9D%A1.html&quot;&gt;Xamarin Forms WPF 干掉默认的窗口导航条&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-iOS-%E9%83%A8%E7%BD%B2%E7%89%88%E6%9C%AC%E5%A4%A7%E4%BA%8E%E6%89%8B%E6%9C%BA%E7%9A%84%E7%B3%BB%E7%BB%9F%E7%89%88%E6%9C%AC.html&quot;&gt;Xamarin iOS 部署版本大于手机的系统版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-iOS-%E9%83%A8%E7%BD%B2%E9%A1%B9%E7%9B%AE%E6%8F%90%E7%A4%BA-Failed-to-register-bundle-identifier-%E5%A4%B1%E8%B4%A5.html&quot;&gt;Xamarin iOS 部署项目提示 Failed to register bundle identifier 失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-XamlCTask-%E4%BB%BB%E5%8A%A1%E4%B8%8D%E6%94%AF%E6%8C%81-ValidateOnly-%E5%8F%82%E6%95%B0.html&quot;&gt;Xamarin XamlCTask 任务不支持 ValidateOnly 参数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-%E4%BD%BF%E7%94%A8-GTK-%E6%8F%90%E7%A4%BA%E6%89%BE%E4%B8%8D%E5%88%B0-libglib-2.0-0.dll-%E6%89%BE%E4%B8%8D%E5%88%B0.html&quot;&gt;Xamarin 使用 GTK 提示找不到 libglib-2.0-0.dll 找不到&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E9%83%A8%E7%BD%B2-iOS-%E4%B8%8A%E7%9A%84-Walterlv.CloudKeyboard-%E5%BA%94%E7%94%A8.html&quot;&gt;Xamarin 从零开始部署 iOS 上的 Walterlv.CloudKeyboard 应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-Forms-%E8%BF%9B%E5%BA%A6%E6%9D%A1%E6%8E%A7%E4%BB%B6.html&quot;&gt;Xamarin Forms 进度条控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-Forms-4.7-%E6%94%AF%E6%8C%81%E6%9B%B4%E7%AE%80%E5%8C%96%E7%9A%84-Grid-%E8%A1%8C%E5%88%97%E5%B8%83%E5%B1%80%E5%86%99%E6%B3%95.html&quot;&gt;Xamarin Forms 4.7 支持更简化的 Grid 行列布局写法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Xamarin-Forms-%E6%9E%84%E5%BB%BA-WPF-%E7%89%88%E9%A1%B9%E7%9B%AE%E5%A4%B1%E8%B4%A5%E6%8F%90%E7%A4%BA-XamlC-error-XFC0000-%E9%94%99%E8%AF%AF.html&quot;&gt;Xamarin Forms 构建 WPF 版项目失败提示 XamlC error XFC0000 错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E9%9B%B6%E6%89%8B%E5%8A%A8%E5%88%9B%E5%BB%BA%E6%89%BF%E8%BD%BD-Xamarin-Forms-%E9%A1%B9%E7%9B%AE.html&quot;&gt;WPF 从零手动创建承载 Xamarin Forms 项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Mac-%E5%8D%87%E7%BA%A7%E5%88%B0-dotnet-5-%E6%9E%84%E5%BB%BA-Xamarin-%E5%BA%94%E7%94%A8%E5%A4%B1%E8%B4%A5-error-MSB4186-%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8%E8%AF%AD%E6%B3%95%E6%97%A0%E6%95%88.html&quot;&gt;Mac 升级到 dotnet 5 构建 Xamarin 应用失败 error MSB4186 静态方法调用语法无效&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;unity3d&quot;&gt;Unity3D&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3d-%E5%85%A5%E9%97%A8-%E6%8E%A7%E5%88%B6%E7%9B%B8%E6%9C%BA%E7%A7%BB%E5%8A%A8.html&quot;&gt;Unity3d 入门 控制相机移动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-%E7%94%A8%E5%AF%B9%E8%B1%A1%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1.html&quot;&gt;Unity3D 用对象创建对象&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-%E5%88%A4%E6%96%AD%E7%82%B9%E5%87%BB%E5%91%BD%E4%B8%AD%E7%89%A9%E4%BD%93%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%91%BD%E4%B8%AD%E7%8E%AF%E5%A2%83.html&quot;&gt;Unity3D 判断点击命中物体对象和命中环境&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3d-%E4%BF%AE%E6%94%B9%E7%BC%96%E8%BE%91%E7%95%8C%E9%9D%A2%E6%8E%A7%E5%88%B6%E5%9B%BE%E6%A0%87%E5%A4%A7%E5%B0%8F-%E4%BF%AE%E6%94%B9%E7%9B%B8%E6%9C%BA%E5%9B%BE%E6%A0%87%E6%98%BE%E7%A4%BA%E5%A4%A7%E5%B0%8F.html&quot;&gt;Unity3d 修改编辑界面控制图标大小 修改相机图标显示大小&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3d-%E8%BF%9E%E7%BB%AD%E6%8C%89%E9%94%AE%E5%A4%84%E7%90%86%E5%92%8C%E5%8D%95%E6%AC%A1%E6%8C%89%E9%94%AE%E5%A4%84%E7%90%86.html&quot;&gt;Unity3d 连续按键处理和单次按键处理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3d-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E7%AB%8B%E4%BD%93%E6%97%8B%E8%BD%AC%E7%9B%B8%E5%86%8C.html&quot;&gt;Unity3d 制作一个立体旋转相册&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-2019-%E8%AE%BE%E7%BD%AE%E7%9A%84-Playmode-tint-%E6%9C%89%E4%BD%95%E4%BD%9C%E7%94%A8.html&quot;&gt;Unity3D 2019 设置的 Playmode tint 有何作用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3d-2019.3-%E9%80%9A%E8%BF%87-Ctrl-%E9%94%AE%E8%AE%A9%E7%A7%BB%E5%8A%A8%E6%98%AF%E5%9B%BA%E5%AE%9A%E6%AD%A5%E8%B7%9D.html&quot;&gt;Unity3d 2019.3 通过 Ctrl 键让移动是固定步距&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity-2019.3-%E5%B0%86-RenderTexture-%E7%BB%91%E5%AE%9A%E5%88%B0%E7%9B%B8%E6%9C%BA%E5%92%8C%E7%89%A9%E4%BD%93%E4%BD%9C%E5%87%BA%E9%95%9C%E5%AD%90%E6%95%88%E6%9E%9C.html&quot;&gt;Unity 2019.3 将 RenderTexture 绑定到相机和物体作出镜子效果&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;vr&quot;&gt;VR&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-OpenVR-SteamVR-%E5%9C%A8%E5%A4%B4%E7%9B%94%E8%A7%86%E8%A7%89%E5%89%8D%E9%9D%A2%E5%B8%B8%E9%A9%BB%E6%96%87%E6%9C%AC.html&quot;&gt;Unity3D OpenVR SteamVR 在头盔视觉前面常驻文本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-OpenVR-SteamVR-%E7%82%B9%E5%87%BB%E8%8F%9C%E5%8D%95%E5%88%87%E6%8D%A2%E5%9C%BA%E6%99%AF.html&quot;&gt;Unity3D OpenVR SteamVR 点击菜单切换场景&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-OpenVR-SteamVR-%E8%8E%B7%E5%8F%96%E8%BE%93%E5%85%A5%E5%8A%A8%E4%BD%9C%E6%8C%89%E9%94%AE-%E4%BA%A4%E4%BA%92%E8%AE%BE%E5%A4%87%E6%95%B0%E6%8D%AE%E6%96%B9%E6%B3%95.html&quot;&gt;Unity3D OpenVR SteamVR 获取输入动作按键 交互设备数据方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-OpenVR-SteamVR-Input-Action-%E5%8A%A8%E4%BD%9C.html&quot;&gt;Unity3D OpenVR SteamVR Input Action 动作&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Unity3D-OpenVR-%E8%99%9A%E6%8B%9F%E7%8E%B0%E5%AE%9E-%E4%BF%9D%E9%BE%84%E7%90%83%E6%89%93%E7%A0%96%E5%9D%97%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91.html&quot;&gt;Unity3D OpenVR 虚拟现实 保龄球打砖块游戏开发&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;ai&quot;&gt;AI&lt;/h2&gt;

&lt;h3 id=&quot;microsoft-agent-framework&quot;&gt;Microsoft Agent Framework&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Microsoft-Agent-Framework-%E4%B8%8E-DeepSeek-%E5%AF%B9%E6%8E%A5.html&quot;&gt;Microsoft Agent Framework 与 DeepSeek 对接&lt;/a&gt;
&lt;!-- [Microsoft Agent Framework 与 DeepSeek 对接 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19413475 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-Microsoft-Agent-Framework-%E4%B8%8E-%E8%B1%86%E5%8C%85-%E5%AF%B9%E6%8E%A5.html&quot;&gt;C# Microsoft Agent Framework 与 豆包 对接&lt;/a&gt;
&lt;!-- [C# Microsoft Agent Framework 与 豆包 对接 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19494917 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Microsoft-Agent-Framework-%E5%8F%96%E5%87%BA-DeepSeek-%E6%80%9D%E8%80%83%E5%86%85%E5%AE%B9.html&quot;&gt;Microsoft Agent Framework 取出 DeepSeek 思考内容&lt;/a&gt;
&lt;!-- [Microsoft Agent Framework 取出 DeepSeek 思考内容 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19635618 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AF%B9%E6%8E%A5-DeepSeek-%E6%A8%A1%E5%9E%8B%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8%E6%97%B6-400-%E9%94%99%E8%AF%AF.html&quot;&gt;dotnet 对接 DeepSeek 模型工具调用时 400 错误&lt;/a&gt;
&lt;!-- [dotnet 对接 DeepSeek 模型工具调用时 400 错误 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19983717 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Microsoft-Agent-Framework-%E6%B5%8B%E8%AF%95%E8%B1%86%E5%8C%85%E7%9A%84%E6%A0%B9%E6%8D%AE%E5%9B%BE%E7%89%87%E7%94%9F%E6%88%90%E7%9F%A2%E9%87%8F%E5%9B%BE%E7%9A%84%E8%83%BD%E5%8A%9B.html&quot;&gt;Microsoft Agent Framework 测试豆包的根据图片生成矢量图的能力&lt;/a&gt;
&lt;!-- [Microsoft Agent Framework 测试豆包的根据图片生成矢量图的能力 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19727344 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AF%B9%E6%8E%A5%E8%B1%86%E5%8C%85%E6%A8%A1%E5%9E%8B%E6%97%B6%E5%A6%82%E4%BD%95%E6%8E%A7%E5%88%B6%E6%98%AF%E5%90%A6%E8%BF%9B%E5%85%A5%E6%80%9D%E8%80%83%E6%A8%A1%E5%BC%8F.html&quot;&gt;dotnet 对接豆包模型时如何控制是否进入思考模式&lt;/a&gt;
&lt;!-- [dotnet 对接豆包模型时如何控制是否进入思考模式 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19761701 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Microsoft-Agent-Framework-%E9%85%8D%E7%BD%AE%E8%B0%83%E7%94%A8%E5%B7%A5%E5%85%B7%E5%90%8E%E9%80%80%E5%87%BA%E5%AF%B9%E8%AF%9D.html&quot;&gt;dotnet Microsoft Agent Framework 配置调用工具后退出对话&lt;/a&gt;
&lt;!-- [dotnet Microsoft Agent Framework 配置调用工具后退出对话 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19773412 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%80%9A%E8%BF%87-OllamaSharp-%E5%AF%B9%E6%8E%A5-Microsoft-Agent-Framework-%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;通过 OllamaSharp 对接 Microsoft Agent Framework 的方法&lt;/a&gt;
&lt;!-- [通过 OllamaSharp 对接 Microsoft Agent Framework 的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19912560 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8-Microsoft-Agent-Framework-%E5%AF%B9%E6%8E%A5%E8%B1%86%E5%8C%85%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%AE%9E%E7%8E%B0AI%E8%87%AA%E5%8A%A8%E7%8E%A9-%E8%B0%81%E6%98%AF%E5%8D%A7%E5%BA%95-%E6%B8%B8%E6%88%8F.html&quot;&gt;用 Microsoft Agent Framework 对接豆包大模型实现AI自动玩「谁是卧底」游戏&lt;/a&gt;
&lt;!-- [用 Microsoft Agent Framework 对接豆包大模型实现AI自动玩「谁是卧底」游戏 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19741764 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-OpenILink.SDK-%E5%88%B6%E4%BD%9C%E5%BE%AE%E4%BF%A1%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%AF%B9%E6%8E%A5%E8%B1%86%E5%8C%85%E5%A4%A7%E6%A8%A1%E5%9E%8B.html&quot;&gt;dotnet 使用 OpenILink.SDK 制作微信聊天机器人对接豆包大模型&lt;/a&gt;
&lt;!-- [dotnet 使用 OpenILink.SDK 制作微信聊天机器人对接豆包大模型 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19857475 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/HyperAgent-%E6%80%9D%E6%83%B3%E7%9A%84%E5%AE%9E%E8%B7%B5-%E5%88%B6%E4%BD%9C-PPT-%E6%96%87%E6%A1%A3%E5%86%85%E5%AE%B9%E5%88%86%E6%9E%90%E6%8F%90%E7%A4%BA%E8%AF%8D.html&quot;&gt;HyperAgent 思想的实践 制作 PPT 文档内容分析提示词&lt;/a&gt;
&lt;!-- [HyperAgent 思想的实践 制作 PPT 文档内容分析提示词 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19919368 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%8E%A2%E7%B4%A2%E7%94%A8-SlideML-%E8%AE%A9%E5%A4%A7%E6%A8%A1%E5%9E%8B%E7%94%9F%E6%88%90-PPT-%E7%9A%84%E5%AE%9E%E9%AA%8C%E6%96%B9%E6%B3%95.html&quot;&gt;探索用 SlideML 让大模型生成 PPT 的实验方法&lt;/a&gt;
&lt;!-- [探索用 SlideML 让大模型生成 PPT 的实验方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20365587 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Microsoft-Agent-Framework-%E4%B8%AD-RequirePerServiceCallChatHistoryPersistence-%E5%AF%B9-ReduceAsync-%E8%B0%83%E7%94%A8%E6%97%B6%E6%9C%BA%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;Microsoft Agent Framework 中 RequirePerServiceCallChatHistoryPersistence 对 ReduceAsync 调用时机的影响&lt;/a&gt;
&lt;!-- [Microsoft Agent Framework 中 RequirePerServiceCallChatHistoryPersistence 对 ReduceAsync 调用时机的影响 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20278934 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;semantickernel-1&quot;&gt;SemanticKernel&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-SemanticKernel-%E5%85%A5%E9%97%A8-%E5%BC%80%E7%AF%87.html&quot;&gt;dotnet SemanticKernel 入门 开篇&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-SemanticKernel-%E5%85%A5%E9%97%A8-%E8%B0%83%E7%94%A8%E5%8E%9F%E7%94%9F%E6%9C%AC%E6%9C%BA%E6%8A%80%E8%83%BD.html&quot;&gt;dotnet SemanticKernel 入门 调用原生本机技能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-SemanticKernel-%E5%85%A5%E9%97%A8-%E5%B0%86%E6%8A%80%E8%83%BD%E5%AF%BC%E5%85%A5%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet SemanticKernel 入门 将技能导入框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-SemanticKernel-%E5%85%A5%E9%97%A8-%E6%B3%A8%E5%85%A5%E6%97%A5%E5%BF%97.html&quot;&gt;dotnet SemanticKernel 入门 注入日志&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-SemanticKernel-%E5%85%A5%E9%97%A8-%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8F%98%E9%87%8F%E5%92%8C%E6%8A%80%E8%83%BD.html&quot;&gt;dotnet SemanticKernel 入门 自定义变量和技能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%AE%80%E5%8D%95%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8-KernelMemory-%E5%90%91%E9%87%8F%E5%8C%96%E6%96%87%E6%9C%AC%E5%B5%8C%E5%85%A5%E7%94%9F%E6%88%90%E5%92%8C%E6%9F%A5%E8%AF%A2.html&quot;&gt;dotnet 简单控制台使用 KernelMemory 向量化文本嵌入生成和查询&lt;/a&gt;
&lt;!-- [dotnet 简单控制台使用 KernelMemory 向量化文本嵌入生成和查询 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18250173 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B0%86%E6%9C%AC%E5%9C%B0%E7%9A%84-Phi-3-%E6%A8%A1%E5%9E%8B%E4%B8%8E-SemanticKernel-%E8%BF%9B%E8%A1%8C%E5%AF%B9%E6%8E%A5.html&quot;&gt;dotnet 将本地的 Phi-3 模型与 SemanticKernel 进行对接&lt;/a&gt;
&lt;!-- [dotnet 将本地的 Phi-3 模型与 SemanticKernel 进行对接 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18257888 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;应用&quot;&gt;应用&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SemanticKernel-%E5%B0%86-LLM-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%87%BD%E6%95%B0%E5%92%8C%E4%BC%A0%E7%BB%9F%E7%BC%96%E7%A8%8B%E8%9E%8D%E5%90%88%E5%88%B0%E4%B8%80%E8%B5%B7.html&quot;&gt;SemanticKernel 将 LLM 自然语言函数和传统编程融合到一起&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;原理&quot;&gt;原理&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%8E%A2%E7%A9%B6-SemanticKernel-%E7%9A%84-planner-%E7%9A%84%E5%8E%9F%E7%90%86.html&quot;&gt;dotnet 探究 SemanticKernel 的 planner 的原理&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/17810633.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;directml&quot;&gt;DirectML&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9F%BA%E4%BA%8E-DirectML-%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BF%90%E8%A1%8C-Phi-3-%E6%A8%A1%E5%9E%8B.html&quot;&gt;dotnet 基于 DirectML 控制台运行 Phi-3 模型&lt;/a&gt;
&lt;!-- [dotnet 基于 DirectML 控制台运行 Phi-3 模型 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18245125 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;mcp&quot;&gt;MCP&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-MCP-%E6%97%A0%E9%AD%94%E6%B3%95-%E6%9C%AC%E5%9C%B0%E8%BF%9B%E7%A8%8B%E5%86%85%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%B0%83%E7%94%A8%E5%92%8C%E9%80%9A%E8%AE%AF%E7%A4%BA%E4%BE%8B.html&quot;&gt;dotnet MCP 无魔法 本地进程内服务端客户端调用和通讯示例&lt;/a&gt;
&lt;!-- [dotnet MCP 无魔法 本地进程内服务端客户端调用和通讯示例 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18869179 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;aspnet-core&quot;&gt;ASP.NET Core&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA-WebApi-%E6%9C%8D%E5%8A%A1.html&quot;&gt;asp dotnet core 从零开始创建一个 WebApi 服务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%89%E5%8F%A5%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%88%9B%E5%BB%BA%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA-web-%E6%9C%8D%E5%8A%A1%E7%A8%8B%E5%BA%8F.html&quot;&gt;dotnet 三句命令行创建运行一个 web 服务程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E9%99%90%E5%88%B6%E6%8E%A5%E5%8F%A3%E5%8F%AA%E8%83%BD%E6%9C%AC%E6%9C%BA%E8%AE%BF%E9%97%AE%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;asp dotnet core 限制接口只能本机访问的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E5%9F%BA%E4%BA%8E-TestServer-%E5%81%9A%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95.html&quot;&gt;asp dotnet core 基于 TestServer 做集成测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E5%BC%95%E7%94%A8%E5%85%B6%E4%BB%96%E7%A8%8B%E5%BA%8F%E9%9B%86%E9%A1%B9%E7%9B%AE%E9%87%8C%E9%9D%A2%E7%9A%84-Controller-%E6%8E%A7%E5%88%B6%E5%99%A8.html&quot;&gt;ASP.NET Core 引用其他程序集项目里面的 Controller 控制器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E5%B0%86%E6%96%87%E4%BB%B6%E5%A4%B9%E5%86%85%E5%AE%B9%E8%BE%93%E5%87%BA%E4%B8%BA%E5%8E%8B%E7%BC%A9%E5%8C%85%E6%96%87%E4%BB%B6%E6%96%B9%E6%B3%95.html&quot;&gt;ASP.NET Core 将文件夹内容输出为压缩包文件方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E5%9B%A0%E4%B8%BA-Nginx-%E9%85%8D%E7%BD%AE-Connection-%E4%B8%BA-Upgrade-%E5%AF%BC%E8%87%B4-Kestrel-%E8%BF%94%E5%9B%9E-400-%E9%94%99%E8%AF%AF.html&quot;&gt;ASP.NET Core 因为 Nginx 配置 Connection 为 Upgrade 导致 Kestrel 返回 400 错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E8%AD%A6%E6%83%95%E5%8F%AF%E7%A9%BA%E7%B1%BB%E5%9E%8B%E5%BC%80%E5%90%AF%E4%B9%8B%E5%90%8E%E6%A8%A1%E5%9E%8B%E6%A0%A1%E9%AA%8C%E5%A4%B1%E8%B4%A5.html&quot;&gt;ASP.NET Core 警惕可空类型开启之后模型校验失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-3.0-%E6%8E%A5%E5%8F%A3%E8%BF%94%E5%9B%9E-json-%E4%BD%BF%E7%94%A8-PascalCase-%E6%A0%BC%E5%BC%8F.html&quot;&gt;asp dotnet core 3.0 接口返回 json 使用 PascalCase 格式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E4%B8%8D%E6%AD%A3%E7%BB%8F%E7%9A%84%E6%8F%90%E5%8D%87%E6%95%88%E7%8E%87%E7%9A%84%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%96%B9%E6%B3%95.html&quot;&gt;asp dotnet core 不正经的提升效率的单元测试方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%BA%94%E7%94%A8%E6%8B%92%E7%BB%9D%E5%93%8D%E5%BA%94%E8%B0%83%E8%AF%95-%E5%BC%80%E5%90%AF%E7%BA%BF%E7%A8%8B%E7%AD%89%E5%BE%85%E5%90%8C%E6%AD%A5%E7%94%A8%E5%85%89%E7%BA%BF%E7%A8%8B%E6%B1%A0.html&quot;&gt;asp dotnet core 记一次应用拒绝响应调试 开启线程等待同步用光线程池&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E6%8F%90%E4%BE%9B%E5%A4%A7%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD%E7%9A%84%E6%B5%8B%E8%AF%95.html&quot;&gt;asp dotnet core 提供大文件下载的测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[ASP.NET Core 解决控制台输出日志内容前面&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E8%A7%A3%E5%86%B3%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BE%93%E5%87%BA%E6%97%A5%E5%BF%97%E5%86%85%E5%AE%B9%E5%89%8D%E9%9D%A2-40m%E7%AD%89%E4%B9%B1%E7%A0%81%E5%AD%97%E7%AC%A6.html&quot;&gt;40m等乱码字符&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E6%8F%90%E7%A4%BA-Cannot-access-a-disposed-object-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html&quot;&gt;asp dotnet core 提示 Cannot access a disposed object 解决方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%92%8C-ASP.NET-Core-%E9%80%9A%E8%BF%87-elastic-APM-%E4%B8%8A%E6%8A%A5%E4%BF%A1%E6%81%AF.html&quot;&gt;WPF 和 ASP.NET Core 通过 elastic APM 上报信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BD%93-ASP.NET-Core-%E9%93%BE%E6%8E%A5%E6%89%BE%E4%B8%8D%E5%88%B0%E6%97%B6%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;当 ASP.NET Core 链接找不到时可能的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E4%BB%8E-Frp-%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E7%9C%9F%E5%AE%9E-IP-%E5%9C%B0%E5%9D%80.html&quot;&gt;asp dotnet core 从 Frp 获取用户真实 IP 地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%91%E9%80%81%E4%BA%8B%E4%BB%B6-Server-Sent-Events-%E7%AE%80%E5%8D%95%E6%96%B9%E5%BC%8F.html&quot;&gt;asp dotnet core 实现服务器发送事件 Server-Sent Events 简单方式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E9%80%9A%E8%BF%87%E5%9B%BE%E7%89%87%E7%BB%9F%E8%AE%A1-csdn-%E7%94%A8%E6%88%B7%E8%AE%BF%E9%97%AE.html&quot;&gt;asp dotnet core 通过图片统计 csdn 用户访问&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E7%AE%80%E5%8D%95%E5%BC%80%E5%8F%91P2P%E4%B8%AD%E5%A4%AE%E6%9C%8D%E5%8A%A1%E5%99%A8.html&quot;&gt;asp dotnet core 简单开发P2P中央服务器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E6%94%AF%E6%8C%81%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6.html&quot;&gt;asp dotnet core 支持客户端上传文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-6-%E6%B5%85%E6%9E%90%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%B8%8E%E9%85%8D%E7%BD%AE%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7.html&quot;&gt;ASP.NET Core 6 浅析环境变量与配置的优先级&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E5%9B%BE%E7%89%87%E5%9C%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B2%A1%E8%AE%BF%E9%97%AE%E5%8F%AF%E8%83%BD%E5%8E%9F%E5%9B%A0.html&quot;&gt;asp dotnet core 图片在浏览器没访问可能原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E5%BC%80%E5%90%AF%E5%90%8E%E5%8F%B0%E4%BB%BB%E5%8A%A1.html&quot;&gt;ASP.NET Core 开启后台任务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E5%86%99%E4%B8%80%E4%B8%AA%E8%83%BD%E5%A4%9F%E6%8E%A5%E6%94%B6%E6%89%80%E6%9C%89%E8%AF%B7%E6%B1%82%E8%B7%AF%E5%BE%84%E7%9A%84%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1.html&quot;&gt;ASP.NET Core 写一个能够接收所有请求路径的测试服务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%BB%99MatterMost%E8%AE%A2%E9%98%85RSS%E5%8D%9A%E5%AE%A2.html&quot;&gt;dotnet 给MatterMost订阅RSS博客&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E7%AE%80%E5%8D%95%E7%BB%99-Phi-%E6%A8%A1%E5%9E%8B%E5%B0%81%E8%A3%85%E4%B8%80%E4%B8%AA%E6%9C%8D%E5%8A%A1.html&quot;&gt;ASP.NET Core 简单给 Phi 模型封装一个服务&lt;/a&gt;
&lt;!-- [ASP.NET Core 简单给 Phi 模型封装一个服务 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18592966 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E4%BD%8E%E8%B5%84%E6%BA%90%E5%8D%A0%E7%94%A8%E7%9A%84%E6%94%AF%E6%8C%81%E8%B6%85%E5%A4%A7%E6%96%87%E4%BB%B6%E8%A1%A8%E5%8D%95%E4%B8%8A%E4%BC%A0%E7%9A%84%E6%9C%8D%E5%8A%A1.html&quot;&gt;ASP.NET Core 制作一个低资源占用的支持超大文件表单上传的服务&lt;/a&gt;
&lt;!-- [ASP.NET Core 制作一个低资源占用的支持超大文件表单上传的服务 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19192031 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;blazor&quot;&gt;Blazor&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/.NET-Core-%E7%94%A8-Blazor-%E5%81%9A-jmeter-%E7%B3%BB%E5%88%97%E8%A7%86%E9%A2%91.html&quot;&gt;.NET Core 用 Blazor 做 jmeter 系列视频&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Blazor-%E7%94%A8-C-%E6%8E%A7%E5%88%B6%E7%95%8C%E9%9D%A2%E8%A1%8C%E4%B8%BA.html&quot;&gt;dotnet Blazor 用 C# 控制界面行为&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Blazor-%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E7%9A%84-Url-%E9%93%BE%E6%8E%A5.html&quot;&gt;Blazor 获取当前的 Url 链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Blazor-%E7%9A%84-NavLink-%E7%9A%84-NavLinkMatch.Prefix-%E6%9C%89%E5%95%A5%E4%BD%9C%E7%94%A8.html&quot;&gt;Blazor 的 NavLink 的 NavLinkMatch.Prefix 有啥作用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Blazor-%E7%9A%84-NavLink-%E6%8F%90%E7%A4%BA-RZ9986-%E4%B8%8D%E6%94%AF%E6%8C%81%E5%A4%8D%E6%9D%82%E5%86%85%E5%AE%B9.html&quot;&gt;Blazor 的 NavLink 提示 RZ9986 不支持复杂内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Blazor-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%A0%81%E8%B7%B3%E8%BD%AC%E9%93%BE%E6%8E%A5.html&quot;&gt;Blazor 如何使用代码跳转链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B0%86C-%E7%BC%96%E8%AF%91%E4%B8%BAwasm%E8%AE%A9%E5%89%8D%E7%AB%AFhtml%E4%BD%BF%E7%94%A8.html&quot;&gt;dotnet 将C#编译为wasm让前端html使用&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;渲染-1&quot;&gt;渲染&lt;/h2&gt;

&lt;h3 id=&quot;sharpdx&quot;&gt;SharpDx&lt;/h3&gt;

&lt;p&gt;渲染部分，关于 SharpDx 使用，包括入门级教程，请参阅：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-SharpDx-%E6%B8%B2%E6%9F%93%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;WPF 使用 SharpDx 渲染博客导航&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.lindexi.com/post/sharpdx.html&quot;&gt;SharpDX 系列&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;现在 SharpDx 已经不维护了，如果还需要在 C# 使用 Dx 相关技术，可以使用 &lt;a href=&quot;https://blog.lindexi.com/post/SharpDx-%E7%9A%84%E4%BB%A3%E6%9B%BF%E9%A1%B9%E7%9B%AE.html&quot;&gt;SharpDx 的代替项目&lt;/a&gt; 列出的替代项目&lt;/p&gt;

&lt;h3 id=&quot;vortice&quot;&gt;Vortice&lt;/h3&gt;

&lt;p&gt;由于 SharpDx 已经不维护了，可使用 Vortice 替换，以下是 Vortice 的博客&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/DirectX-%E4%BD%BF%E7%94%A8-Vortice-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%88%9B%E5%BB%BA-Direct2D1-%E7%AA%97%E5%8F%A3%E4%BF%AE%E6%94%B9%E9%A2%9C%E8%89%B2.html&quot;&gt;DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-DirectX-%E9%80%9A%E8%BF%87-Vortice-%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8-ID2D1DeviceContext-%E7%BB%98%E5%88%B6%E7%94%BB%E9%9D%A2.html&quot;&gt;dotnet DirectX 通过 Vortice 控制台使用 ID2D1DeviceContext 绘制画面&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-Vortice-%E6%94%AF%E6%8C%81-Direct2D1-%E7%A6%BB%E5%B1%8F%E6%B8%B2%E6%9F%93.html&quot;&gt;dotnet C# 使用 Vortice 支持 Direct2D1 离屏渲染&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-Vortice-%E5%88%9B%E5%BB%BA-Direct2D1-%E7%9A%84-ID2D1SolidColorBrush-%E7%BA%AF%E8%89%B2%E7%94%BB%E5%88%B7.html&quot;&gt;dotnet C# 使用 Vortice 创建 Direct2D1 的 ID2D1SolidColorBrush 纯色画刷&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Vortice-%E4%BD%BF%E7%94%A8-DirectComposition-%E6%98%BE%E7%A4%BA%E9%80%8F%E6%98%8E%E7%AA%97%E5%8F%A3.html&quot;&gt;Vortice 使用 DirectComposition 显示透明窗口&lt;/a&gt;
&lt;!-- [Vortice 使用 DirectComposition 显示透明窗口 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19541356 ) --&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Vortice-%E6%97%A0%E9%9C%80%E4%BA%A4%E6%8D%A2%E9%93%BE%E4%B8%8E-DirectComposition-%E5%AF%B9%E6%8E%A5%E6%B8%B2%E6%9F%93%E5%B1%82.html&quot;&gt;dotnet Vortice 无需交换链与 DirectComposition 对接渲染层&lt;/a&gt;
&lt;!-- [dotnet Vortice 无需交换链与 DirectComposition 对接渲染层 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19597758 ) --&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Vortice-%E5%9C%A8-D3DImage-%E6%98%BE%E7%A4%BA-D2D-%E5%86%85%E5%AE%B9.html&quot;&gt;WPF 使用 Vortice 在 D3DImage 显示 D2D 内容&lt;/a&gt;
&lt;!-- [WPF 使用 Vortice 在 D3DImage 显示 D2D 内容 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19541357 ) --&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%AF%B9%E6%8E%A5-Vortice-%E8%B0%83%E7%94%A8-D2D-%E4%BD%BF%E7%94%A8-IWICBitmap-%E7%A6%BB%E5%B1%8F%E6%B8%B2%E6%9F%93.html&quot;&gt;WPF 对接 Vortice 调用 D2D 使用 IWICBitmap 离屏渲染&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/16774416.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%AF%B9%E6%8E%A5-Vortice-%E8%B0%83%E7%94%A8-WIC-%E5%8A%A0%E8%BD%BD%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 对接 Vortice 调用 WIC 加载图片&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%AF%B9%E6%8E%A5-Vortice-%E5%9C%A8-Direct2D-%E7%BB%98%E5%88%B6%E4%BB%8E-WIC-%E5%8A%A0%E8%BD%BD%E7%9A%84%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 对接 Vortice 在 Direct2D 绘制从 WIC 加载的图片&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E9%80%9A%E8%BF%87-Vortice-%E4%BD%BF%E7%94%A8-Direct2D-%E7%89%B9%E6%95%88%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet C# 通过 Vortice 使用 Direct2D 特效入门&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E9%80%9A%E8%BF%87-Vortice-%E4%BD%BF%E7%94%A8-Direct2D-%E7%9A%84-ID2D1CommandList-%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet C# 通过 Vortice 使用 Direct2D 的 ID2D1CommandList 入门&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E9%80%9A%E8%BF%87-Vortice-%E5%B0%86-ID2D1CommandList-%E4%BD%9C%E4%B8%BA%E7%89%B9%E6%95%88%E7%9A%84%E8%BE%93%E5%85%A5%E6%BA%90.html&quot;&gt;dotnet C# 通过 Vortice 将 ID2D1CommandList 作为特效的输入源&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%86%E4%BA%AB%E4%B8%80%E4%B8%AA%E5%9C%A8-dotnet-%E9%87%8C%E4%BD%BF%E7%94%A8-D2D-%E9%85%8D%E5%90%88-AOT-%E5%BC%80%E5%8F%91%E5%B0%8F%E8%80%8C%E7%BE%8E%E7%9A%84%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E7%BB%8F%E9%AA%8C.html&quot;&gt;分享一个在 dotnet 里使用 D2D 配合 AOT 开发小而美的应用开发经验&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-DirectX-%E5%81%9A%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%BB%98%E5%88%B6%E6%8A%98%E7%BA%BF%E7%AC%94%E8%BF%B9%E7%9A%84-D2D-%E5%BA%94%E7%94%A8.html&quot;&gt;dotnet DirectX 做一个简单绘制折线笔迹的 D2D 应用&lt;/a&gt;
&lt;!-- [dotnet DirectX 做一个简单绘制折线笔迹的 D2D 应用 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18468855 ) --&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-DirectX-%E9%80%9A%E8%BF%87%E5%8F%AF%E7%AD%89%E5%BE%85%E4%BA%A4%E6%8D%A2%E9%93%BE%E9%99%8D%E4%BD%8E%E8%BE%93%E5%85%A5%E6%B8%B2%E6%9F%93%E5%BB%B6%E8%BF%9F.html&quot;&gt;dotnet DirectX 通过可等待交换链降低输入渲染延迟&lt;/a&gt;
&lt;!-- [dotnet DirectX 通过可等待交换链降低输入渲染延迟 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19643684 ) --&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Vortice-%E9%80%9A%E8%BF%87-Angle-%E5%B0%86-Skia-%E5%92%8C-DirectX-%E5%AF%B9%E6%8E%A5.html&quot;&gt;dotnet Vortice 通过 Angle 将 Skia 和 DirectX 对接&lt;/a&gt;
&lt;!-- [dotnet Vortice 通过 Angle 将 Skia 和 DirectX 对接 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19593476 ) --&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;更多关于 DirectX 相关，请参阅 DirectX 官方博客： &lt;a href=&quot;https://devblogs.microsoft.com/directx/landing-page/&quot;&gt;DirectX Landing Page - DirectX Developer Blog&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;skia&quot;&gt;Skia&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D%E5%9C%A8-Linux-%E4%B8%8A%E4%BD%BF%E7%94%A8-SkiaSharp-%E6%8F%90%E7%A4%BA%E6%89%BE%E4%B8%8D%E5%88%B0-liblibSkiaSharp-%E5%BA%93.html&quot;&gt;dotnet 修复在 Linux 上使用 SkiaSharp 提示找不到 liblibSkiaSharp 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%A7%A3%E5%86%B3-Skia-%E5%9B%A0%E4%B8%BA%E6%89%BE%E4%B8%8D%E5%88%B0%E5%AD%97%E4%BD%93%E8%80%8C%E7%BB%98%E5%88%B6%E4%B8%8D%E5%87%BA%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6.html&quot;&gt;WPF 解决 Skia 因为找不到字体而绘制不出中文字符&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8E%A2%E7%B4%A2-Skia-%E7%9A%84%E7%AB%96%E6%8E%92%E6%96%87%E6%9C%AC%E6%B8%B2%E6%9F%93%E7%9A%84%E5%AD%97%E7%AC%A6%E9%AB%98%E5%BA%A6.html&quot;&gt;WPF 探索 Skia 的竖排文本渲染的字符高度&lt;/a&gt;
&lt;!-- [WPF 探索 Skia 的竖排文本渲染的字符高度 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18815810 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Skia-%E7%BB%98%E5%88%B6-WriteableBitmap-%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 使用 Skia 绘制 WriteableBitmap 图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%87%AA%E5%B7%B1%E5%B0%81%E8%A3%85-Skia-%E5%B7%AE%E9%87%8F%E7%BB%98%E5%88%B6%E6%8E%A7%E4%BB%B6.html&quot;&gt;WPF 自己封装 Skia 差量绘制控件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Skia-%E8%A7%A3%E6%9E%90%E7%BB%98%E5%88%B6-SVG-%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 使用 Skia 解析绘制 SVG 图片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%8E%A7%E5%88%B6%E5%8F%B0-%E4%BD%BF%E7%94%A8-Microsoft.Maui.Graphics-%E9%85%8D%E5%90%88-Skia-%E8%BF%9B%E8%A1%8C%E7%BB%98%E5%9B%BE%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet 控制台 使用 Microsoft.Maui.Graphics 配合 Skia 进行绘图入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Microsoft.Maui.Graphics.Skia-%E4%BD%BF%E7%94%A8-DrawString-%E7%BB%98%E5%88%B6%E6%96%87%E6%9C%AC%E7%9A%84%E5%9D%90%E6%A0%87%E9%97%AE%E9%A2%98.html&quot;&gt;Microsoft.Maui.Graphics.Skia 使用 DrawString 绘制文本的坐标问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SkiaSharp-%E6%B8%B2%E6%9F%93%E8%BE%93%E5%87%BA-SVG-%E6%96%87%E4%BB%B6.html&quot;&gt;SkiaSharp 渲染输出 SVG 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/sunnytrudeau/p/15515080.html&quot;&gt;SkiaSharp跨平台绘图研究1-WPF桌面应用 - SunnyTrudeau - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/sunnytrudeau/p/15515282.html&quot;&gt;SkiaSharp跨平台绘图研究2-Xamarin.Forms移动应用 - SunnyTrudeau - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/sunnytrudeau/p/15563443.html&quot;&gt;SkiaSharp跨平台绘图研究3-Asp.Net Core网站 - SunnyTrudeau - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/sunnytrudeau/p/15570085.html&quot;&gt;SkiaSharp跨平台绘图研究4-在PDF上绘图 - SunnyTrudeau - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/sunnytrudeau/p/15574467.html&quot;&gt;SkiaSharp跨平台绘图研究5-Blazor WebAssembly网页绘图 - SunnyTrudeau - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/yycelsu/p/14048859.html&quot;&gt;Docker环境下使用SkiaSharp的2种方式 - 从零开始-DotNET技术 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%AE%80%E5%8D%95%E8%81%8A%E8%81%8A-Skia-%E9%87%8C%E7%9A%84-SKFontMetrics-%E7%9A%84%E5%90%84%E9%A1%B9%E5%B1%9E%E6%80%A7%E4%BD%9C%E7%94%A8.html&quot;&gt;dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用&lt;/a&gt;
&lt;!-- [dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18621674 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SkiaSharp-%E4%BD%BF%E7%94%A8-HarfBuzz-%E4%BF%AE%E5%A4%8D%E6%89%BE%E4%B8%8D%E5%88%B0-Symbol-%E5%AD%97%E5%BD%A2.html&quot;&gt;SkiaSharp 使用 HarfBuzz 修复找不到 Symbol 字形&lt;/a&gt;
&lt;!-- [SkiaSharp 使用 HarfBuzz 修复找不到 Symbol 字形 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19014430 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Skia-%E5%9C%A8%E9%BE%99%E8%8A%AF%E6%90%AD%E6%99%AF%E5%98%89%E5%BE%AE%E6%98%BE%E5%8D%A1%E8%AE%BE%E5%A4%87-%E6%9F%90%E4%BA%9B%E5%AD%97%E4%BD%93%E4%BC%9A%E6%B8%B2%E6%9F%93%E7%9B%B8%E4%BA%92%E8%A6%86%E7%9B%96.html&quot;&gt;Skia 在龙芯搭景嘉微显卡设备 某些字体会渲染相互覆盖&lt;/a&gt;
&lt;!-- [Skia 在龙芯搭景嘉微显卡设备 某些字体会渲染相互覆盖 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19212117 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpf-渲染相关&quot;&gt;WPF 渲染相关&lt;/h3&gt;

&lt;p&gt;我写了一些关于 WPF 底层渲染和渲染定制以及 WPF 与其他渲染库对接的博客，请参阅： &lt;a href=&quot;https://blog.csdn.net/lindexi_gd/category_9276313.html?spm=1001.2014.3001.5482&quot;&gt;WPF 底层渲染_lindexi_gd的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%B8%B2%E6%9F%93%E5%8E%9F%E7%90%86.html&quot;&gt;WPF 渲染原理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-SharpDx-%E6%B8%B2%E6%9F%93%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;WPF 使用 SharpDx 渲染博客导航&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E-DX-%E5%B1%82%E9%9D%A2%E8%AE%B2-WPF-%E6%B8%B2%E6%9F%93%E5%8D%A1%E9%A1%BF.html&quot;&gt;从 DX 层面讲 WPF 渲染卡顿&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E6%A0%B8%E5%BF%83%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0-Direct2D-%E6%AF%94-GDI-%E5%BF%AB%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86.html&quot;&gt;Windows 核心编程笔记 Direct2D 比 GDI 快的一部分&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-SharpDX-%E5%9C%A8-D3DImage-%E6%98%BE%E7%A4%BA.html&quot;&gt;WPF 使用 SharpDX 在 D3DImage 显示&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;silknet&quot;&gt;Silk.NET&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Silk.NET-%E8%BF%9B%E8%A1%8C-DirectX-%E6%B8%B2%E6%9F%93%E5%85%A5%E9%97%A8.html&quot;&gt;WPF 使用 Silk.NET 进行 DirectX 渲染入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Silk.NET-%E8%BF%9B%E8%A1%8C-Direct2D-%E6%B8%B2%E6%9F%93%E5%85%A5%E9%97%A8.html&quot;&gt;WPF 使用 Silk.NET 进行 Direct2D 渲染入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-Silk.NET-%E5%88%9B%E5%BB%BA-OpenGL-%E7%A9%BA%E7%AA%97%E5%8F%A3%E9%A1%B9%E7%9B%AE%E4%BE%8B%E5%AD%90.html&quot;&gt;使用 Silk.NET 创建 OpenGL 空窗口项目例子&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-Silk.NET-%E8%B0%83%E7%94%A8-DirectWrite-%E8%8E%B7%E5%8F%96%E5%AD%97%E4%BD%93-Font-Metrics-%E4%BF%A1%E6%81%AF.html&quot;&gt;使用 Silk.NET 调用 DirectWrite 获取字体 Font Metrics 信息&lt;/a&gt;
&lt;!-- [使用 Silk.NET 调用 DirectWrite 获取字体 Font Metrics 信息 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19001918 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;opentk-1&quot;&gt;OpenTK&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/OpenTK-%E5%85%A5%E9%97%A8-%E5%88%9D%E5%A7%8B%E5%8C%96%E7%AA%97%E5%8F%A3.html&quot;&gt;OpenTK 入门 初始化窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/OpenTK-%E5%85%A5%E9%97%A8-Vsync-%E5%9E%82%E7%9B%B4%E5%90%8C%E6%AD%A5%E5%AF%B9%E5%88%B7%E6%96%B0%E7%8E%87%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;OpenTK 入门 Vsync 垂直同步对刷新率的影响&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;directwrite&quot;&gt;DirectWrite&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-Silk.NET-%E8%B0%83%E7%94%A8-DirectWrite-%E8%8E%B7%E5%8F%96%E5%AD%97%E4%BD%93-Font-Metrics-%E4%BF%A1%E6%81%AF.html&quot;&gt;使用 Silk.NET 调用 DirectWrite 获取字体 Font Metrics 信息&lt;/a&gt;
&lt;!-- [使用 Silk.NET 调用 DirectWrite 获取字体 Font Metrics 信息 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19001918 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/DirectWrite-%E9%80%9A%E8%BF%87-GetUnicodeRanges-%E8%8E%B7%E5%8F%96%E5%AD%97%E4%BD%93%E8%83%BD%E6%94%AF%E6%8C%81%E7%9A%84%E5%AD%97%E7%AC%A6%E8%8C%83%E5%9B%B4.html&quot;&gt;DirectWrite 通过 GetUnicodeRanges 获取字体能支持的字符范围&lt;/a&gt;
&lt;!-- [DirectWrite 通过 GetUnicodeRanges 获取字体能支持的字符范围 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19360019 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;openxml&quot;&gt;OpenXML&lt;/h2&gt;

&lt;p&gt;使用 OpenXML 可以对 Office 文档进行底层的处理，相关博客比较多，请参阅：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Office-%E4%BD%BF%E7%94%A8-OpenXML-SDK-%E8%A7%A3%E6%9E%90%E6%96%87%E6%A1%A3%E5%8D%9A%E5%AE%A2%E7%9B%AE%E5%BD%95.html&quot;&gt;Office 使用 OpenXML SDK 解析文档博客目录&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;调试-1&quot;&gt;调试&lt;/h2&gt;

&lt;p&gt;代码的调试方法，常用的套路和经验&lt;/p&gt;

&lt;p&gt;入门的大博客： &lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BB%A3%E7%A0%81%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 代码调试方法&lt;/a&gt;
&lt;!-- [dotnet 代码调试方法-腾讯云开发者社区-腾讯云](https://cloud.tencent.com/developer/article/1446477 ) --&gt;
&lt;!-- [dotnet 代码调试方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18960345 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7%E8%AF%BE%E7%A8%8B.html&quot;&gt;Windows 调试工具课程&lt;/a&gt;
&lt;!-- [Windows 调试工具课程 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18421353 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%B0%83%E8%AF%95%E5%BA%94%E7%94%A8%E5%90%AF%E5%8A%A8%E9%97%AA%E9%80%80%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 调试应用启动闪退的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E5%9B%A0%E4%B8%BA-NVIDIA-%E6%98%BE%E9%A9%B1%E9%94%99%E8%AF%AF%E8%80%8C%E8%AE%A9-WPF-%E5%BA%94%E7%94%A8%E5%90%AF%E5%8A%A8%E9%97%AA%E9%80%80%E9%97%AE%E9%A2%98.html&quot;&gt;记因为 NVIDIA 显驱错误而让 WPF 应用启动闪退问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E4%B8%80%E6%AC%A1%E8%B0%83%E8%AF%95%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86%E5%99%A8%E6%9C%AA%E5%93%8D%E5%BA%94%E7%BB%8F%E9%AA%8C.html&quot;&gt;记一次调试资源管理器未响应经验&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E8%B0%83%E8%AF%95-RX-Explorer-WAS-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%99%A8-UI-%E6%9C%AA%E5%93%8D%E5%BA%94%E9%97%AE%E9%A2%98.html&quot;&gt;记调试 RX-Explorer-WAS 文件管理器 UI 未响应问题&lt;/a&gt;
&lt;!-- [记调试 RX-Explorer-WAS 文件管理器 UI 未响应问题 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19606611 ) --&gt;
&lt;!-- [记调试 RX-Explorer-WAS 文件管理器 UI 未响应问题-腾讯云开发者社区-腾讯云](https://cloud.tencent.com/developer/article/2629642 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E8%B0%83%E8%AF%95%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%96%B9%E6%B3%95.html&quot;&gt;VisualStudio 调试内存泄漏方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%BC%80%E5%90%AF%E4%BB%85%E6%88%91%E4%BB%A3%E7%A0%81%E8%B0%83%E8%AF%95.html&quot;&gt;VisualStudio 开启仅我代码调试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WinDbg-%E5%8A%A0%E8%BD%BD-dotnet-core-%E7%9A%84-sos.dll-%E8%BE%85%E5%8A%A9%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95.html&quot;&gt;WinDbg 加载 dotnet core 的 sos.dll 辅助调试方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-windbg-%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E6%96%B9%E5%BC%8F%E8%87%AA%E5%8A%A8%E6%89%B9%E9%87%8F%E8%B0%83%E8%AF%95%E5%A4%84%E7%90%86-dump-%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 使用 windbg 运行脚本方式自动批量调试处理 dump 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WinDbg-%E8%AE%BE%E7%BD%AE%E5%9C%A8%E5%8A%A0%E8%BD%BD%E5%88%B0%E6%9F%90%E4%B8%AA-DLL-%E8%BF%9B%E5%85%A5%E6%96%AD%E7%82%B9.html&quot;&gt;WinDbg 设置在加载到某个 DLL 进入断点&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BC%98%E9%9B%85%E8%B0%83%E8%AF%95-REST-API-%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;优雅调试 REST API 的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%B0%83%E8%AF%95%E6%97%B6%E9%99%90%E5%88%B6%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8-CPU-%E6%A0%B8%E5%BF%83%E6%95%B0%E6%A8%A1%E6%8B%9F%E4%BD%8E%E7%AB%AF%E8%AE%BE%E5%A4%87.html&quot;&gt;调试时限制程序使用 CPU 核心数模拟低端设备&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95-Windows-%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;断点调试 Windows 源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-Windows-%E4%B8%8B%E9%82%A3%E4%BA%9B%E5%A5%BD%E7%94%A8%E7%9A%84%E8%B0%83%E8%AF%95%E8%BD%AF%E4%BB%B6.html&quot;&gt;在 Windows 下那些好用的调试软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%B0%83%E8%AF%95-ms-%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;调试 ms 源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E8%B0%83%E8%AF%95%E6%9F%90%E4%B8%AA%E6%96%87%E4%BB%B6%E6%98%AF%E5%93%AA%E4%B8%AA%E4%BB%A3%E7%A0%81%E5%88%9B%E5%BB%BA.html&quot;&gt;dotnet 如何调试某个文件是哪个代码创建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E8%BE%93%E5%87%BA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF%E5%88%B0-DebugView-%E8%BD%AF%E4%BB%B6.html&quot;&gt;dotnet core 输出调试信息到 DebugView 软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E4%BD%BF%E7%94%A8-FastTunnel-%E8%BE%85%E5%8A%A9%E6%90%AD%E5%BB%BA%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83.html&quot;&gt;VisualStudio 使用 FastTunnel 辅助搭建远程调试环境&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E5%86%85%E5%AD%98%E6%9D%A1%E7%A1%AC%E4%BB%B6%E6%8D%9F%E5%9D%8F%E8%93%9D%E5%B1%8F%E7%9A%84-dump-%E6%96%87%E4%BB%B6%E5%88%86%E6%9E%90.html&quot;&gt;记内存条硬件损坏蓝屏的 dump 文件分析&lt;/a&gt;
&lt;!-- [记内存条硬件损坏蓝屏的 dump 文件分析 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18293074 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;windows&quot;&gt;Windows&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E9%80%9A%E8%BF%87%E7%BC%96%E8%BE%91%E6%B3%A8%E5%86%8C%E8%A1%A8%E8%AE%BE%E7%BD%AE%E5%B7%A6%E5%8F%B3%E6%89%8B%E4%BD%BF%E7%94%A8%E4%B9%A0%E6%83%AF%E6%9B%B4%E6%94%B9-Popup-%E5%BC%B9%E5%87%BA%E4%BD%8D%E7%BD%AE.html&quot;&gt;Windows 通过编辑注册表设置左右手使用习惯更改 Popup 弹出位置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-%E5%AE%89%E8%A3%85Mpi.html&quot;&gt;win10 安装Mpi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BD%B1%E5%AD%90%E7%B3%BB%E7%BB%9F%E8%AE%A9-C++-%E7%A8%8B%E5%BA%8F%E6%97%A0%E6%B3%95%E8%BF%90%E8%A1%8C.html&quot;&gt;影子系统让 C++ 程序无法运行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%89%E8%A3%85-Sureface-Hub-%E7%B3%BB%E7%BB%9F-Windows-10-team-PPIPro-%E7%B3%BB%E7%BB%9F.html&quot;&gt;安装 Sureface Hub 系统 Windows 10 team PPIPro 系统&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%9C%A8-Windows-10-%E4%B8%AD%E7%A7%BB%E9%99%A4-Internet-Explorer-%E6%B5%8F%E8%A7%88%E5%99%A8.html&quot;&gt;如何在 Windows 10 中移除 Internet Explorer 浏览器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%81%A2%E5%A4%8D-U-%E7%9B%98%E9%9A%90%E8%97%8F%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;恢复 U 盘隐藏文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9B%BD%E5%86%85%E5%A5%BD%E7%94%A8%E7%9A%84-DNS-%E5%88%97%E8%A1%A8.html&quot;&gt;国内好用的 DNS 列表&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/windows-10%E9%A2%84%E8%A7%88%E7%89%88%E5%8D%87%E7%BA%A7win10-7%E6%9C%8829-10240.16384.html&quot;&gt;windows 10预览版升级win10 7月29 10240.16384&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/windows-10-%E8%AE%BE%E7%BD%AE-%E5%BA%94%E7%94%A8%E5%AE%8C%E6%95%B4ms-settings%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F%E6%B1%87%E6%80%BB.md.html&quot;&gt;windows-10「设置」应用完整ms-settings快捷方式汇总.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-%E6%9C%AC%E5%9C%B0%E9%80%82%E9%85%8D%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E9%87%8D%E8%A6%81%E7%9A%84%E4%BD%8E%E8%83%BD%E8%80%97%E6%8E%A7%E5%88%B6%E5%99%A8%E7%8A%B6%E6%80%81.html&quot;&gt;win10 本地适配器不支持重要的低能耗控制器状态&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-%E4%BD%BF%E7%94%A8-SMB-v1.html&quot;&gt;win10 使用 SMB v1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/windows-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%9C%A8%E5%85%B3%E6%9C%BA%E6%97%B6%E7%9A%84%E9%80%80%E5%87%BA%E4%BB%A3%E5%8F%B7.html&quot;&gt;windows 应用程序在关机时的退出代号&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win7-%E5%8D%87%E7%BA%A7%E5%88%B0-win10-%E8%A1%A5%E4%B8%81.html&quot;&gt;win7 升级到 win10 补丁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-10-16251-%E6%B7%BB%E5%8A%A0%E7%9A%84-api.html&quot;&gt;Windows 10 16251 添加的 api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3-Win10-UWP-%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8-ss-%E8%BF%9E%E6%8E%A5.html&quot;&gt;解决 Win10 UWP 无法使用 ss 连接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BE%AE%E8%BD%AF%E5%90%84%E7%89%88%E6%9C%AC%E7%B3%BB%E7%BB%9F%E4%B8%8D%E5%86%8D%E7%BB%B4%E6%8A%A4%E6%97%B6%E9%97%B4.html&quot;&gt;微软各版本系统不再维护时间&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E8%AE%A9-USB-%E8%AE%BE%E5%A4%87%E4%B8%8D%E6%98%BE%E7%A4%BA%E5%AE%89%E5%85%A8%E5%88%A0%E9%99%A4%E7%A1%AC%E4%BB%B6%E5%BC%B9%E5%87%BA%E9%80%89%E9%A1%B9.html&quot;&gt;如何让 USB 设备不显示安全删除硬件弹出选项&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%89%8B%E6%9C%BA1520-win8.1%E5%8D%87%E7%BA%A7win10.html&quot;&gt;手机1520 win8.1升级win10&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E5%AF%B9%E5%85%A8%E5%B1%8F%E5%BA%94%E7%94%A8%E7%9A%84%E4%BC%98%E5%8C%96.html&quot;&gt;Windows 对全屏应用的优化&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-DISM-%E5%AE%89%E5%85%A8%E6%B8%85%E7%90%86-C-%E7%9B%98-WinSxS-%E6%96%87%E4%BB%B6%E5%A4%B9%E7%A9%BA%E9%97%B4.html&quot;&gt;使用 DISM 安全清理 C 盘 WinSxS 文件夹空间&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.ithome.com/0/563/541.htm&quot;&gt;Win10 Win11 如何真正获取 Trustedinstaller 权限（非修改所有者及权限） - IT之家&lt;/a&gt;
&lt;!-- 
Import-Module NtObjectManager
sc.exe start TrustedInstaller
Set-NtTokenPrivilege SeDebugPrivilege 
$p = Get-NtProcess -Name TrustedInstaller.exe
$proc = New-Win32Process cmd.exe -CreationFlags NewConsole -ParentProcess $p
 --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows/win32/fileio/filesystem-functionality-comparison&quot;&gt;文件系统功能比较 NTFS、exFAT、UDF 和 FAT32 的功能和功能支持比较 - Win32 apps - Microsoft Learn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E8%AE%BE%E7%BD%AE-Windows-%E5%AE%89%E5%85%A8%E4%B8%AD%E5%BF%83%E7%99%BD%E5%90%8D%E5%8D%95%E6%8E%92%E9%99%A4%E9%A1%B9.html&quot;&gt;PowerShell 设置 Windows 安全中心白名单排除项&lt;/a&gt;
&lt;!-- [PowerShell 设置 Windows 安全中心白名单排除项 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19424072 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;windows-编程&quot;&gt;Windows 编程&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-17025-%E8%A7%A6%E6%91%B8bug.html&quot;&gt;win10 17025 触摸bug&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/d3dcompiler_47.dll-%E6%97%A0%E6%B3%95%E5%AE%9A%E4%BD%8D%E7%A8%8B%E5%BA%8F%E8%BE%93%E5%85%A5%E7%82%B9__CxxFrameHandler4%E4%BA%8E%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93.html&quot;&gt;d3dcompiler_47.dll 无法定位程序输入点__CxxFrameHandler4于动态链接库&lt;/a&gt;
&lt;!-- [d3dcompiler_47.dll 无法定位程序输入点__CxxFrameHandler4于动态链接库 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18845817 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E7%AA%97%E5%8F%A3%E6%A0%B7%E5%BC%8F-%E4%BB%80%E4%B9%88%E6%98%AF-WS_EX_NOREDIRECTIONBITMAP-%E6%A0%B7%E5%BC%8F.html&quot;&gt;Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8-SetWindowPos-%E6%96%B9%E6%B3%95%E8%AE%BE%E7%BD%AE%E4%B8%80%E4%B8%AA%E5%81%9C%E6%AD%A2%E5%93%8D%E5%BA%94%E7%9A%84%E7%AA%97%E5%8F%A3%E5%B0%86%E5%8D%A1%E8%B0%83%E7%94%A8%E6%96%B9.html&quot;&gt;用 SetWindowPos 方法设置一个停止响应的窗口将卡调用方&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E7%9A%84-Pen-%E5%8D%8F%E8%AE%AE.html&quot;&gt;Windows 的 Pen 协议&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/XP-%E6%BA%90%E4%BB%A3%E7%A0%81-%E5%A6%82%E4%BD%95%E5%9C%A8%E6%B8%85%E7%A9%BA%E5%9B%9E%E6%94%B6%E7%AB%99%E6%97%B6%E4%BF%AE%E6%94%B9%E5%9B%9E%E6%94%B6%E7%AB%99%E5%9B%BE%E6%A0%87.html&quot;&gt;XP 源代码 如何在清空回收站时修改回收站图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E6%A0%B8%E5%BF%83%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0-Direct2D-%E6%AF%94-GDI-%E5%BF%AB%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86.html&quot;&gt;Windows 核心编程笔记 Direct2D 比 GDI 快的一部分&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E8%AE%A9%E8%BD%AF%E4%BB%B6%E4%BB%A5-System-%E6%9D%83%E9%99%90%E8%BF%90%E8%A1%8C.html&quot;&gt;如何让软件以 System 权限运行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%A0%E9%99%A4%E8%87%AA%E8%BA%AB%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 删除自身程序的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%A4%E6%96%AD%E7%A8%8B%E5%BA%8F%E5%BD%93%E5%89%8D%E4%BD%BF%E7%94%A8%E7%AE%A1%E7%90%86%E5%91%98%E8%BF%90%E8%A1%8C%E9%99%8D%E4%BD%8E%E6%9D%83%E4%BD%BF%E7%94%A8%E6%99%AE%E9%80%9A%E6%9D%83%E9%99%90%E8%BF%90%E8%A1%8C.html&quot;&gt;dotnet 判断程序当前使用管理员运行降低权使用普通权限运行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E9%80%9A%E8%BF%87%E7%BC%96%E7%A8%8B%E7%9A%84%E6%96%B9%E6%B3%95%E5%9C%A8%E6%A1%8C%E9%9D%A2%E5%88%9B%E5%BB%BA%E5%9B%9E%E6%94%B6%E7%AB%99%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F.html&quot;&gt;C# 通过编程的方法在桌面创建回收站快捷方式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E5%AF%BC%E5%87%BA-COM-%E7%BB%84%E4%BB%B6.html&quot;&gt;dotnet core 导出 COM 组件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%88%A4%E6%96%AD%E7%B3%BB%E7%BB%9F%E7%89%88%E6%9C%AC.html&quot;&gt;C# 判断系统版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Win32-%E4%BD%BF%E7%94%A8-CreateProcess-%E6%96%B9%E6%B3%95%E8%AE%A9%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8%E9%87%8C%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8D%E6%98%BE%E7%A4%BA%E5%BA%94%E7%94%A8%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84.html&quot;&gt;Win32 使用 CreateProcess 方法让任务管理器里的命令行不显示应用文件路径&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E6%9B%BF%E6%8D%A2%E4%B8%80%E4%B8%AA-exe-%E7%9A%84%E5%9B%BE%E6%A0%87.html&quot;&gt;如何替换一个 exe 的图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win-%E6%B6%88%E6%81%AF.html&quot;&gt;win 消息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%89%AA%E8%B4%B4%E6%9D%BF%E8%A2%AB%E5%8D%A0%E7%94%A8%E5%AF%BC%E8%87%B4%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E5%89%AA%E8%B4%B4%E6%9D%BF%E6%8B%B7%E8%B4%9D%E5%86%85%E5%AE%B9%E5%A4%B1%E8%B4%A5%E6%8A%9B%E5%87%BA-COMException-0x800401D0-%E9%94%99%E8%AF%AF.html&quot;&gt;剪贴板被占用导致应用使用剪贴板拷贝内容失败抛出 COMException 0x800401D0 错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/kybs0/p/17985128&quot;&gt;C# 息屏操作出现闪屏 - 唐宋元明清2188 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-Win32-%E5%87%BD%E6%95%B0%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E8%B7%AF%E5%BE%84%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet C# 使用 Win32 函数获取用户下载文件夹的路径的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win32-%E4%BD%8E%E5%86%85%E5%AD%98%E9%80%9A%E7%9F%A5%E4%BA%8B%E4%BB%B6.html&quot;&gt;win32 低内存通知事件&lt;/a&gt;
&lt;!-- [win32 低内存通知事件 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18263040 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/kybs0/p/18192224&quot;&gt;Windows 设置应用禁用卸载 - 唐宋元明清2188 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/kybs0/p/18330811#5293467&quot;&gt;.NET 窗口/屏幕录制 - 唐宋元明清2188 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-SHFileOperation-%E8%B0%83%E7%94%A8-Win32-%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%AF%B9%E8%AF%9D%E6%A1%86.html&quot;&gt;dotnet C# 使用 SHFileOperation 调用 Win32 的文件复制对话框&lt;/a&gt;
&lt;!-- [dotnet C# 使用 SHFileOperation 调用 Win32 的文件复制对话框 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18351897 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/czwy/p/17915333.html&quot;&gt;.NET中如何实现高精度定时器 - czwy - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.gkarch.com/2015/09/high-resolution-timer.html&quot;&gt;高精度定时器实现 - GKarch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%BC%80%E5%8F%91%E6%9C%89%E5%93%AA%E4%BA%9B%E9%9C%80%E6%B1%82.html&quot;&gt;Windows 客户端软件自动更新服务的开发有哪些需求&lt;/a&gt;
&lt;!-- [Windows 客户端软件自动更新服务的开发有哪些需求 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18426258 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0-QEMU-%E8%99%9A%E6%8B%9F%E7%A3%81%E7%9B%98%E8%AE%BE%E5%A4%87%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6%E6%8A%9B%E5%BC%82%E5%B8%B8%E4%BD%86%E5%AE%9E%E9%99%85%E7%A7%BB%E5%8A%A8%E6%88%90%E5%8A%9F.html&quot;&gt;记 QEMU 虚拟磁盘设备移动文件抛异常但实际移动成功&lt;/a&gt;
&lt;!-- [记 QEMU 虚拟磁盘设备移动文件抛异常但实际移动成功 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18547263 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E8%A1%8C%E4%B8%BA%E6%B5%8B%E8%AF%95-%E5%88%A0%E9%99%A4-FileStream-%E6%AD%A3%E5%9C%A8%E8%AF%BB%E5%86%99%E6%96%87%E4%BB%B6%E5%8F%AF%E4%BB%A5%E7%BB%A7%E7%BB%AD%E8%AF%BB%E5%86%99.html&quot;&gt;Windows 行为测试 删除 FileStream 正在读写文件可以继续读写&lt;/a&gt;
&lt;!-- [Windows 行为测试 删除 FileStream 正在读写文件可以继续读写 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18672096 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%AE%80%E5%8D%95%E9%80%9A%E8%BF%87-EnumDisplayDevices-%E8%8E%B7%E5%8F%96%E6%98%BE%E7%A4%BA%E8%AE%BE%E5%A4%87%E4%BF%A1%E6%81%AF.html&quot;&gt;dotnet 简单通过 EnumDisplayDevices 获取显示设备信息&lt;/a&gt;
&lt;!-- [dotnet 简单通过 EnumDisplayDevices 获取显示设备信息 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18856299 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%A9%E7%94%A8-Windows-%E6%B3%A8%E5%86%8C%E8%A1%A8%E5%AE%9E%E7%8E%B0%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8.html&quot;&gt;dotnet 利用 Windows 注册表实现开机自动启动&lt;/a&gt;
&lt;!-- [dotnet 利用 Windows 注册表实现开机自动启动 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19154026 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-IShellLinkW-%E5%88%9B%E5%BB%BA-URL-%E7%BD%91%E5%9D%80%E8%B6%85%E9%93%BE%E6%8E%A5%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F.html&quot;&gt;使用 IShellLinkW 创建 URL 网址超链接快捷方式&lt;/a&gt;
&lt;!-- [使用 IShellLinkW 创建 URL 网址超链接快捷方式 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19407307 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Win32-%E4%BD%BF%E7%94%A8-MoveFileEx-%E5%BB%B6%E8%BF%9F%E5%88%B0%E9%87%8D%E5%90%AF%E5%90%8E%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6.html&quot;&gt;Win32 使用 MoveFileEx 延迟到重启后删除文件&lt;/a&gt;
&lt;!-- [Win32 使用 MoveFileEx 延迟到重启后删除文件 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19572306 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%B0%83%E7%94%A8-Windows.Graphics-%E5%AE%9E%E7%8E%B0%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD.html&quot;&gt;dotnet 控制台调用 Windows.Graphics 实现屏幕截图功能&lt;/a&gt;
&lt;!-- [dotnet 控制台调用 Windows.Graphics 实现屏幕截图功能 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19919369 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;wic&quot;&gt;WIC&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-Windows-%E7%B3%BB%E7%BB%9F%E4%B8%8A%E4%BD%BF%E7%94%A8-stakx-%E7%9A%84-WIC-%E5%BA%93.html&quot;&gt;dotnet 在 Windows 系统上使用 stakx 的 WIC 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-win32-%E4%BD%BF%E7%94%A8-WIC-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E7%BC%96%E8%A7%A3%E7%A0%81%E5%99%A8.html&quot;&gt;dotnet win32 使用 WIC 获取系统编解码器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-GifBitmapDecoder-%E8%B0%83%E7%94%A8-WIC-%E8%A7%A3%E6%9E%90-Gif-%E5%92%8C%E8%BF%9B%E8%A1%8C%E5%8A%A8%E7%94%BB%E6%92%AD%E6%94%BE%E7%9A%84%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 通过 GifBitmapDecoder 调用 WIC 解析 Gif 和进行动画播放的简单方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%AF%B9%E6%8E%A5-Vortice-%E8%B0%83%E7%94%A8-WIC-%E5%8A%A0%E8%BD%BD%E5%9B%BE%E7%89%87.html&quot;&gt;WPF 对接 Vortice 调用 WIC 加载图片&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;uia&quot;&gt;UIA&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/pandefu/p/17536281.html&quot;&gt;UI自动化 — 微软UI Automation - NiueryDiary - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/pandefu/p/17536282.html&quot;&gt;UI自动化 — UI Automation 基础详解 - NiueryDiary - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;测试&quot;&gt;测试&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%B3%A8%E5%85%A5%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99.html&quot;&gt;dotnet 单元测试注入文件读写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E5%9C%A8-dotnet-test-%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%8E%A7%E5%88%B6%E5%8F%B0%E9%87%8C%E8%BE%93%E5%87%BA%E6%97%A5%E5%BF%97%E5%86%85%E5%AE%B9.html&quot;&gt;dotnet 如何在 dotnet test 单元测试控制台里输出日志内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95-Mock-%E8%AE%A9%E4%B8%80%E4%B8%AA%E5%AF%B9%E8%B1%A1%E7%BB%A7%E6%89%BF%E5%A4%9A%E4%B8%AA%E6%8E%A5%E5%8F%A3.html&quot;&gt;dotnet 单元测试 Mock 让一个对象继承多个接口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/win10-UWP-%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95.html&quot;&gt;win10 UWP 单元测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95-SmartSql-%E5%AD%98%E5%9C%A8%E9%9D%99%E6%80%81%E9%87%8F%E5%AF%BC%E8%87%B4%E5%A4%9A%E4%B8%AA%E4%B8%BB%E6%9C%BA%E5%90%AF%E5%8A%A8%E6%8F%90%E7%A4%BA-Alias-%E5%B7%B2%E5%AD%98%E5%9C%A8.html&quot;&gt;dotnet 集成测试 SmartSql 存在静态量导致多个主机启动提示 Alias 已存在&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E6%8F%90%E4%BE%9B%E5%A4%A7%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD%E7%9A%84%E6%B5%8B%E8%AF%95.html&quot;&gt;asp dotnet core 提供大文件下载的测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E4%B8%8D%E6%AD%A3%E7%BB%8F%E7%9A%84%E6%8F%90%E5%8D%87%E6%95%88%E7%8E%87%E7%9A%84%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%96%B9%E6%B3%95.html&quot;&gt;asp dotnet core 不正经的提升效率的单元测试方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/asp-dotnet-core-%E5%9F%BA%E4%BA%8E-TestServer-%E5%81%9A%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95.html&quot;&gt;asp dotnet core 基于 TestServer 做集成测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-MSTestRunner-%E5%B0%86%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E5%88%B6%E4%BD%9C%E4%B8%BA%E7%8B%AC%E7%AB%8B%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 使用 MSTestRunner 将单元测试制作为独立可执行文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%9A%E5%88%B6-MSTest-%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6-%E8%AE%A9%E4%B8%80%E4%B8%AA-TestMethod-%E5%8C%85%E5%90%AB%E5%A4%9A%E4%B8%AA%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B.html&quot;&gt;定制 MSTest 单元测试框架 让一个 TestMethod 包含多个测试用例&lt;/a&gt;
&lt;!-- [定制 MSTest 单元测试框架 让一个 TestMethod 包含多个测试用例 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18993616 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;性能测试&quot;&gt;性能测试&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%A0%87%E5%87%86%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html&quot;&gt;C# 标准性能测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%A0%87%E5%87%86%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95.html&quot;&gt;C# 标准性能测试高级用法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-6-%E6%95%B0%E7%BB%84%E6%8B%B7%E8%B4%9D%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94.html&quot;&gt;dotnet 6 数组拷贝性能对比&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%AD%97%E5%85%B8-Dictionary-%E5%92%8C-Hashtable-%E7%9A%84%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94.html&quot;&gt;dotnet C# 字典 Dictionary 和 Hashtable 的性能对比&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-5-%E9%9D%99%E6%80%81%E5%AD%97%E6%AE%B5%E5%92%8C%E5%B1%9E%E6%80%A7%E7%9A%84%E5%8F%8D%E5%B0%84%E8%8E%B7%E5%8F%96-%E6%B2%A1%E6%9C%89%E6%83%B3%E8%B1%A1%E4%B8%AD%E9%82%A3%E4%B9%88%E4%BC%A4%E6%80%A7%E8%83%BD.html&quot;&gt;dotnet 5 静态字段和属性的反射获取 没有想象中那么伤性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E9%93%BE%E8%A1%A8%E5%92%8C%E5%AD%97%E5%85%B8%E7%9A%84%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94.html&quot;&gt;dotnet C# 链表和字典的性能对比&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E7%A8%8B%E5%BA%8F%E9%9B%86%E6%95%B0%E9%87%8F%E5%AF%B9%E8%BD%AF%E4%BB%B6%E5%90%AF%E5%8A%A8%E6%80%A7%E8%83%BD%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;C# 程序集数量对软件启动性能的影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E7%9B%B4%E6%8E%A5%E5%88%9B%E5%BB%BA%E5%A4%9A%E4%B8%AA%E7%B1%BB%E5%92%8C%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%B0%84%E5%88%9B%E5%BB%BA%E7%B1%BB%E7%9A%84%E6%80%A7%E8%83%BD.html&quot;&gt;C# 直接创建多个类和使用反射创建类的性能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90-%E5%8F%8D%E5%B0%84-VS-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6-VS-%E9%A2%84%E7%BC%96%E8%AF%91.html&quot;&gt;C# 性能分析 反射 VS 配置文件 VS 预编译&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E7%A8%8B%E5%BA%8F%E5%86%85%E7%9A%84%E7%B1%BB%E6%95%B0%E9%87%8F%E5%AF%B9%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E7%9A%84%E5%BD%B1%E5%93%8D.html&quot;&gt;C# 程序内的类数量对程序启动的影响&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%AD%98%E5%82%A8-%E5%90%84%E7%A7%8D%E5%BA%8F%E5%88%97%E5%8C%96%E7%AE%97%E6%B3%95%E6%80%A7%E8%83%BD%E6%AF%94%E8%BE%83.html&quot;&gt;C# 配置文件存储 各种序列化算法性能比较&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%AD%97%E5%85%B8-Dictionary-%E7%9A%84-TryGetValue-%E4%B8%8E%E5%85%88%E5%88%A4%E6%96%AD-ContainsKey-%E7%84%B6%E5%90%8E-Get-%E7%9A%84%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94.html&quot;&gt;C# 字典 Dictionary 的 TryGetValue 与先判断 ContainsKey 然后 Get 的性能对比&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-ConcurrentDictionary-%E7%9A%84-GetOrAdd-%E6%80%A7%E8%83%BD%E6%AF%94-TryGetValue-%E5%8A%A0-TryAdd-%E4%BD%8E.html&quot;&gt;dotnet ConcurrentDictionary 的 GetOrAdd 性能比 TryGetValue 加 TryAdd 低&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%BA%94%E7%94%A8-%E4%B8%80%E5%8D%83%E4%B8%AA%E5%8D%8A%E9%80%8F%E6%98%8E%E7%9F%A9%E5%BD%A2%E5%81%9A%E5%8A%A8%E7%94%BB.html&quot;&gt;WPF 动画性能测试应用 一千个半透明矩形做动画&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E6%9C%BA%E5%99%A8-CPU-%E5%9E%8B%E5%8F%B7%E4%B8%8A%E7%9A%84%E5%9F%BA%E5%87%86%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html&quot;&gt;dotnet C# 在不同的机器 CPU 型号上的基准性能测试&lt;/a&gt;
&lt;!-- [dotnet C# 在不同的机器 CPU 型号上的基准性能测试 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18674065 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%AF%B9%E4%B8%80%E4%BA%9B-Win32-%E6%96%B9%E6%B3%95%E8%BF%9B%E8%A1%8C-Benchmark-%E5%9F%BA%E5%87%86%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html&quot;&gt;dotnet 对一些 Win32 方法进行 Benchmark 基准性能测试&lt;/a&gt;
&lt;!-- [dotnet 对一些 Win32 方法进行 Benchmark 基准性能测试 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18674064 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;测试工具&quot;&gt;测试工具&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E8%87%AA%E5%8A%A8%E7%BF%BB%E9%A1%B5-PPT-%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC.html&quot;&gt;C# 自动翻页 PPT 测试脚本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E5%8D%A0%E7%94%A8%E6%96%87%E4%BB%B6%E7%9A%84%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 制作一个占用文件的测试工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GitHub-%E7%9A%84-Action-%E6%8E%A5%E5%85%A5-Stryker.NET-%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E9%B2%81%E6%A3%92%E6%80%A7.html&quot;&gt;GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;测试框架&quot;&gt;测试框架&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnetCampus.UITest.WPF-%E4%B8%80%E4%B8%AA%E6%94%AF%E6%8C%81%E4%B8%AD%E6%96%87%E7%94%A8%E4%BE%8B%E7%9A%84%E7%95%8C%E9%9D%A2%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnetCampus.UITest.WPF 一个支持中文用例的界面单元测试框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E5%9C%A8-Mock-%E6%A8%A1%E6%8B%9F-Func-%E5%88%A4%E6%96%AD%E8%B0%83%E7%94%A8%E6%AC%A1%E6%95%B0.html&quot;&gt;dotnet 如何在 Mock 模拟 Func 判断调用次数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Moq%E5%9F%BA%E7%A1%80-%E5%88%A4%E6%96%AD%E6%96%B9%E6%B3%95%E8%A2%AB%E6%89%A7%E8%A1%8C.html&quot;&gt;Moq基础 判断方法被执行&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;autofac-集成测试&quot;&gt;Autofac 集成测试&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Autofac-%E9%80%9A%E8%BF%87-PreserveExistingDefaults-%E8%A7%A3%E5%86%B3%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95-Fake-%E5%AF%B9%E8%B1%A1%E8%A2%AB%E8%A6%86%E7%9B%96.html&quot;&gt;Autofac 通过 PreserveExistingDefaults 解决单元测试 Fake 对象被覆盖&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Autofac-%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95-%E5%9C%A8-ConfigureContainer-%E4%B9%8B%E5%90%8E%E8%BF%9B%E8%A1%8C-Mock-%E6%B3%A8%E5%85%A5.html&quot;&gt;Autofac 集成测试 在 ConfigureContainer 之后进行 Mock 注入&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;打包构建&quot;&gt;打包构建&lt;/h2&gt;

&lt;h3 id=&quot;编译器&quot;&gt;编译器&lt;/h3&gt;

&lt;p&gt;我写了很多关于 Roslyn 相关的博客，请参阅：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/roslyn.html&quot;&gt;手把手教你写 Roslyn 修改编译博客导航&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;前置知识&quot;&gt;前置知识&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/understand-the-csproj&quot;&gt;理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/hez2010/p/a-brand-new-look-at-msbuild-1.html&quot;&gt;重新认识 MSBuild - 1 - hez2010 - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;构建的基础知识&quot;&gt;构建的基础知识&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%A6%82%E4%BD%95%E4%BA%86%E8%A7%A3%E6%9F%90%E4%B8%AA%E9%A1%B9%E7%9B%AE%E5%9C%A8-msbuild-%E4%B8%AD%E6%89%80%E6%9C%89%E7%94%A8%E5%88%B0%E7%9A%84%E5%B1%9E%E6%80%A7%E4%BB%A5%E5%8F%8A%E6%9E%84%E5%BB%BA%E8%BF%87%E7%A8%8B.html&quot;&gt;Roslyn 如何了解某个项目在 msbuild 中所有用到的属性以及构建过程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E4%BD%BF%E7%94%A8-Directory.Build.props-%E6%96%87%E4%BB%B6%E5%AE%9A%E4%B9%89%E7%BC%96%E8%AF%91.html&quot;&gt;Roslyn 使用 Directory.Build.props 文件定义编译&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E4%BD%BF%E7%94%A8-Directory.Build.props-%E7%AE%A1%E7%90%86%E5%A4%9A%E4%B8%AA%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE.html&quot;&gt;Roslyn 使用 Directory.Build.props 管理多个项目配置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/known-properties-in-csproj.html&quot;&gt;项目文件中的已知属性（知道了这些，就不会随便在 csproj 中写死常量啦） - walterlv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-nuget-%E7%BB%9F%E4%B8%80%E7%AE%A1%E7%90%86%E4%BF%A1%E6%81%AF.html&quot;&gt;Roslyn 通过 nuget 统一管理信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/msbuild-%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E5%B8%B8%E7%94%A8%E5%88%A4%E6%96%AD%E6%9D%A1%E4%BB%B6.html&quot;&gt;msbuild 项目文件常用判断条件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%9C%A8%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD.html&quot;&gt;Roslyn 在项目文件使用条件判断&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8D%E4%BD%BF%E7%94%A8-dotnet-core-%E7%BC%96%E8%AF%91%E5%99%A8%E8%BF%9B%E8%A1%8C%E7%BC%96%E8%AF%91.html&quot;&gt;Roslyn 判断当前使用 dotnet core 编译器进行编译&lt;/a&gt;&lt;/p&gt;

&lt;h5 id=&quot;分析器入门知识&quot;&gt;分析器入门知识&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%99%A8%E5%88%86%E6%9E%90%E5%99%A8%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet 源代码生成器分析器入门&lt;/a&gt;
&lt;!-- [dotnet 源代码生成器分析器入门 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18786647 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/roslyn-syntax-visualizer&quot;&gt;Roslyn 入门：使用 Visual Studio 的语法可视化（Syntax Visualizer）窗格查看和了解代码的语法树 - walterlv&lt;/a&gt;
&lt;!-- [Roslyn 入门：使用 Visual Studio 的语法可视化窗格查看和了解代码的语法树 - walterlv - 博客园](https://www.cnblogs.com/walterlv/p/10236479.html ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/compile-and-invoke-code-using-roslyn.html&quot;&gt;Roslyn 入门：使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码 - walterlv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/analysis-code-of-existed-projects-using-roslyn.html&quot;&gt;Roslyn 入门：使用 Roslyn 静态分析现有项目中的代码（语法分析） - walterlv&lt;/a&gt;
&lt;!-- [Roslyn 入门：使用 Roslyn 静态分析现有项目中的代码 - walterlv - 博客园](https://www.cnblogs.com/walterlv/p/10236480.html ) --&gt;&lt;/p&gt;

&lt;h5 id=&quot;roslyn-基础知识&quot;&gt;Roslyn 基础知识&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-NameSyntax-%E7%9A%84-ToString-%E5%92%8C-ToFullString-%E7%9A%84%E5%8C%BA%E5%88%AB.html&quot;&gt;Roslyn NameSyntax 的 ToString 和 ToFullString 的区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E8%8A%82%E7%82%B9%E7%9A%84-Span-%E5%92%8C-FullSpan-%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB.html&quot;&gt;Roslyn 节点的 Span 和 FullSpan 有什么区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%88%86%E6%9E%90%E5%99%A8-EnforceExtendedAnalyzerRules-%E5%B1%9E%E6%80%A7%E7%9A%84%E4%BD%9C%E7%94%A8.html&quot;&gt;Roslyn 分析器 EnforceExtendedAnalyzerRules 属性的作用&lt;/a&gt;
&lt;!-- [Roslyn 分析器 EnforceExtendedAnalyzerRules 属性的作用 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17678673.html ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Roslyn-%E9%80%9A%E8%BF%87%E8%AF%BB%E5%8F%96-suo-%E6%96%87%E4%BB%B6%E8%8E%B7%E5%8F%96%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E7%9A%84%E5%90%AF%E5%8A%A8%E9%A1%B9%E7%9B%AE.html&quot;&gt;dotnet Roslyn 通过读取 suo 文件获取解决方案的启动项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%9D%99%E6%80%81%E5%88%86%E6%9E%90.html&quot;&gt;Roslyn 静态分析&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%A6%82%E4%BD%95%E8%8E%B7%E5%BE%97%E4%B8%80%E4%B8%AA%E7%B1%BB%E7%9A%84%E5%BC%95%E7%94%A8.html&quot;&gt;Roslyn 如何获得一个类的引用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%E6%99%BA%E8%83%BD%E6%8F%90%E7%A4%BA%E8%A1%A5%E5%85%A8%E5%8A%9F%E8%83%BD.html&quot;&gt;Roslyn 简单实现代码智能提示补全功能&lt;/a&gt;
&lt;!-- [Roslyn 简单实现代码智能提示补全功能 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18365261 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%99%A8-SourceGenerator-%E8%8E%B7%E5%8F%96%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6%E7%9A%84%E6%9C%AC%E5%9C%B0%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84.html&quot;&gt;Roslyn 源代码生成器 SourceGenerator 获取代码文件的本地绝对路径&lt;/a&gt;
&lt;!-- [Roslyn 源代码生成器 SourceGenerator 获取代码文件的本地绝对路径 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18705712 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%88%86%E6%9E%90%E5%99%A8-INamedTypeSymbol-%E7%9A%84-AllInterfaces-%E5%8C%85%E5%90%AB%E7%B1%BB%E5%9E%8B%E5%85%A8%E9%83%A8%E7%BB%A7%E6%89%BF%E6%8E%A5%E5%8F%A3.html&quot;&gt;Roslyn 分析器 INamedTypeSymbol 的 AllInterfaces 包含类型全部继承接口&lt;/a&gt;
&lt;!-- [Roslyn 分析器 INamedTypeSymbol 的 AllInterfaces 包含类型全部继承接口 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18826021 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;构建编排&quot;&gt;构建编排&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/write-msbuild-target.html&quot;&gt;如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target（附各种自带的 Task） - walterlv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-Target-%E4%BF%AE%E6%94%B9%E7%BC%96%E8%AF%91%E7%9A%84%E6%96%87%E4%BB%B6.html&quot;&gt;Roslyn 通过 Target 修改编译的文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E8%AE%A9%E7%BC%96%E8%AF%91%E6%97%B6%E5%80%99-Message-%E5%86%85%E5%AE%B9%E9%BB%98%E8%AE%A4%E8%BE%93%E5%87%BA.html&quot;&gt;Roslyn 让编译时候 Message 内容默认输出&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E7%90%86%E8%A7%A3-msbuild-%E7%9A%84%E6%B8%85%E7%90%86%E8%BF%87%E7%A8%8B.html&quot;&gt;Roslyn 理解 msbuild 的清理过程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E8%8E%B7%E5%BE%97-sln-%E6%96%87%E4%BB%B6%E6%89%80%E5%9C%A8%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;Roslyn 获得 sln 文件所在的文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-MSBuild-Copy-%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6.html&quot;&gt;Roslyn 如何使用 MSBuild Copy 复制文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-MSBuild-MakeDir-%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;Roslyn 如何使用 MSBuild MakeDir 创建文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E4%BD%BF%E7%94%A8-Target-%E6%9B%BF%E6%8D%A2%E5%8D%A0%E4%BD%8D%E7%AC%A6%E6%96%B9%E5%BC%8F%E7%94%9F%E6%88%90-nuget-%E6%89%93%E5%8C%85.html&quot;&gt;Roslyn 使用 Target 替换占位符方式生成 nuget 打包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%9C%A8%E5%A4%9A%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6%E8%AE%A9-msbuild-%E7%9A%84-Target-%E4%BB%85%E8%BF%90%E8%A1%8C%E4%B8%80%E6%AC%A1.html&quot;&gt;Roslyn 在多开发框架让 msbuild 的 Target 仅运行一次&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%A6%82%E4%BD%95%E5%9C%A8-Target-%E5%BC%95%E7%94%A8-xaml-%E9%98%B2%E6%AD%A2%E6%96%87%E4%BB%B6%E6%B2%A1%E6%9C%89%E7%BC%96%E8%AF%91.html&quot;&gt;Roslyn 如何在 Target 引用 xaml 防止文件没有编译&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E7%A6%81%E6%AD%A2-sdk-style-csproj-%E9%BB%98%E8%AE%A4%E5%BC%95%E7%94%A8-Compile-%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6.html&quot;&gt;Roslyn 禁止 sdk style csproj 默认引用 Compile 代码文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E4%BD%BF%E7%94%A8-WriteLinesToFile-%E8%A7%A3%E5%86%B3%E5%8F%82%E6%95%B0%E8%BF%87%E9%95%BF%E6%97%A0%E6%B3%95%E4%BC%A0%E5%85%A5.html&quot;&gt;Roslyn 使用 WriteLinesToFile 解决参数过长无法传入&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;定制构建&quot;&gt;定制构建&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87%E5%BC%95%E7%94%A8-msbuild-%E7%A8%8B%E5%BA%8F%E9%9B%86%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%B7%B1%E5%AE%9A%E5%88%B6%E7%BC%96%E8%AF%91%E5%99%A8.html&quot;&gt;dotnet 通过引用 msbuild 程序集实现自己定制编译器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E9%80%9A%E8%BF%87%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E5%A4%B4%E7%9A%84%E6%96%B9%E5%BC%8F%E9%9A%90%E8%97%8F%E6%8E%A7%E5%88%B6%E5%8F%B0%E7%AA%97%E5%8F%A3.html&quot;&gt;dotnet core 通过修改文件头的方式隐藏控制台窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%A1%86%E6%9E%B6%E5%BC%80%E5%8F%91-%E8%B0%83%E8%AF%95%E5%92%8C%E5%BC%80%E5%8F%91-XAML-%E6%9E%84%E5%BB%BA%E8%BF%87%E7%A8%8B%E7%9A%84-PresentationBuildTasks-%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 框架开发 调试和开发 XAML 构建过程的 PresentationBuildTasks 方法&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;roslyn-应用&quot;&gt;Roslyn 应用&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-MSBuild-%E5%9C%A8%E6%9E%84%E5%BB%BA%E5%AE%8C%E6%88%90%E4%B9%8B%E5%90%8E-%E5%B0%86%E6%9E%84%E5%BB%BA%E6%97%B6%E9%97%B4%E5%86%99%E5%85%A5%E5%88%B0%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6.html&quot;&gt;Roslyn MSBuild 在构建完成之后 将构建时间写入到输出文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%B0%86%E8%BF%99%E4%B8%AA%E6%96%87%E4%BB%B6%E6%94%BE%E5%9C%A8%E4%BD%A0%E7%9A%84%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E5%A4%B9-%E6%97%A0%E8%AE%BA%E5%93%AA%E4%B8%AA%E6%8E%A7%E5%88%B6%E5%8F%B0%E9%A1%B9%E7%9B%AE%E9%83%BD%E4%BC%9A%E8%BE%93%E5%87%BA%E6%9E%97%E5%BE%B7%E7%86%99%E6%98%AF%E9%80%97%E6%AF%94.html&quot;&gt;Roslyn 将这个文件放在你的项目文件夹，无论哪个控制台项目都会输出林德熙是逗比&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;已知问题-1&quot;&gt;已知问题&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-Nuget-%E5%BC%95%E7%94%A8%E6%BA%90%E4%BB%A3%E7%A0%81-%E5%9C%A8-VS-%E6%99%BA%E8%83%BD%E6%8F%90%E7%A4%BA%E6%AD%A3%E5%B8%B8%E4%BD%86%E6%98%AF%E6%97%A0%E6%B3%95%E7%BC%96%E8%AF%91.html&quot;&gt;Roslyn 通过 Nuget 引用源代码 在 VS 智能提示正常但是无法编译&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%88%86%E6%9E%90%E5%99%A8%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E4%BC%A0%E9%80%92%E9%A1%B9%E7%9B%AE%E5%B1%9E%E6%80%A7%E6%97%B6%E5%B0%86%E5%BF%BD%E7%95%A5%E5%88%86%E5%8F%B7%E4%B9%8B%E5%90%8E%E7%9A%84%E5%86%85%E5%AE%B9.html&quot;&gt;Roslyn 分析器已知问题 传递项目属性时将忽略分号之后的内容&lt;/a&gt;
&lt;!-- [Roslyn 分析器已知问题 传递项目属性时将忽略分号之后的内容 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18766604 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;生成代码&quot;&gt;生成代码&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%99%A8%E5%88%86%E6%9E%90%E5%99%A8%E5%85%A5%E9%97%A8.html&quot;&gt;dotnet 源代码生成器分析器入门&lt;/a&gt;
&lt;!-- [dotnet 源代码生成器分析器入门 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18786647 ) --&gt;&lt;/p&gt;

&lt;p&gt;大佬收藏的 Source Generators 列表： &lt;a href=&quot;https://github.com/amis92/csharp-source-generators&quot;&gt;amis92/csharp-source-generators: A list of C# Source Generators (not necessarily awesome) and associated resources: articles, talks, demos.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%B0%9D%E8%AF%95-IIncrementalGenerator-%E8%BF%9B%E8%A1%8C%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81.html&quot;&gt;尝试 IIncrementalGenerator 进行增量 Source Generator 生成代码&lt;/a&gt;
&lt;!-- [尝试 IIncrementalGenerator 进行增量 Source Generator 生成代码 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/16697794.html ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%BA-IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E9%A1%B9%E7%9B%AE%E6%B7%BB%E5%8A%A0%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95.html&quot;&gt;为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A6%82%E4%BD%95%E5%9C%A8%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%99%A8%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%8F%90%E4%BE%9B-AnalyzerConfigOptionsProvider-%E9%80%89%E9%A1%B9.html&quot;&gt;IIncrementalGenerator 如何在源代码生成器单元测试提供 AnalyzerConfigOptionsProvider 选项&lt;/a&gt;
&lt;!-- [IIncrementalGenerator 如何在源代码生成器单元测试提供 AnalyzerConfigOptionsProvider 选项 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19275194 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-VisualStudio-%E4%B8%80%E9%94%AE-F5-%E5%90%AF%E5%8A%A8%E8%B0%83%E8%AF%95-Roslyn-%E5%88%86%E6%9E%90%E5%99%A8%E9%A1%B9%E7%9B%AE.html&quot;&gt;dotnet 在 VisualStudio 一键 F5 启动调试 Roslyn 分析器项目&lt;/a&gt;
&lt;!-- [dotnet 在 VisualStudio 一键 F5 启动调试 Roslyn 分析器项目 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18730521 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-IndentedTextWriter-%E8%BE%85%E5%8A%A9%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E6%97%B6%E7%94%9F%E6%88%90%E5%B8%A6%E7%BC%A9%E8%BF%9B%E7%9A%84%E5%86%85%E5%AE%B9.html&quot;&gt;dotnet 使用 IndentedTextWriter 辅助生成代码时生成带缩进的内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E5%85%A5%E9%97%A8-%E8%AF%BB%E5%8F%96-csproj-%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%B1%9E%E6%80%A7%E9%85%8D%E7%BD%AE.html&quot;&gt;IIncrementalGenerator 增量 Source Generator 生成代码入门 读取 csproj 项目文件的属性配置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%88%86%E6%9E%90%E5%99%A8-%E8%AF%BB%E5%8F%96-csproj-%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84-AdditionalFiles-Item-%E7%9A%84-Metadata-%E9%85%8D%E7%BD%AE.html&quot;&gt;Roslyn 分析器 读取 csproj 项目文件的 AdditionalFiles Item 的 Metadata 配置&lt;/a&gt;
&lt;!-- [Roslyn 分析器 读取 csproj 项目文件的 AdditionalFiles Item 的 Metadata 配置 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18459703 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E5%85%A5%E9%97%A8-%E8%8E%B7%E5%8F%96%E5%BC%95%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%9B%86%E7%9A%84%E6%89%80%E6%9C%89%E7%B1%BB%E5%9E%8B.html&quot;&gt;IIncrementalGenerator 增量 Source Generator 生成代码入门 获取引用程序集的所有类型&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E5%85%A5%E9%97%A8-%E5%88%A4%E6%96%AD%E7%A8%8B%E5%BA%8F%E9%9B%86%E4%B9%8B%E9%97%B4%E7%9A%84-InternalsVisibleTo-%E5%85%B3%E7%B3%BB.html&quot;&gt;IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集之间的 InternalsVisibleTo 关系&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E5%85%A5%E9%97%A8-%E5%88%A4%E6%96%AD%E7%A8%8B%E5%BA%8F%E9%9B%86%E7%9A%84%E5%BC%95%E7%94%A8%E5%85%B3%E7%B3%BB.html&quot;&gt;IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集的引用关系&lt;/a&gt;
&lt;!-- [IIncrementalGenerator 判断程序集的引用关系 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17678664.html ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E5%85%A5%E9%97%A8-%E8%8E%B7%E5%8F%96%E9%A1%B9%E7%9B%AE%E9%BB%98%E8%AE%A4%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4.html&quot;&gt;IIncrementalGenerator 增量 Source Generator 生成代码入门 获取项目默认命名空间&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E5%85%A5%E9%97%A8-%E8%AF%BB%E5%8F%96%E8%A7%A3%E6%9E%90-ValueTuple-%E7%9A%84%E5%AE%9A%E4%B9%89.html&quot;&gt;IIncrementalGenerator 增量 Source Generator 生成代码入门 读取解析 ValueTuple 的定义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-ForAttributeWithMetadataName-%E6%8F%90%E9%AB%98-IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%BC%80%E5%8F%91%E6%95%88%E7%8E%87%E5%92%8C%E6%80%A7%E8%83%BD.html&quot;&gt;使用 ForAttributeWithMetadataName 提高 IIncrementalGenerator 增量 Source Generator 源代码生成开发效率和性能&lt;/a&gt;
&lt;!-- [使用 ForAttributeWithMetadataName 提高 IIncrementalGenerator 增量 Source Generator 源代码生成开发效率和性能 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18009107 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%B0%86-Source-Generator-%E7%94%9F%E6%88%90%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81%E4%BF%9D%E5%AD%98%E5%88%B0%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6.html&quot;&gt;将 Source Generator 生成的源代码保存到本地文件&lt;/a&gt;
&lt;!-- [将 Source Generator 生成的源代码保存到本地文件 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18011557 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/IIncrementalGenerator-%E5%A2%9E%E9%87%8F-Source-Generator-%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E5%BA%94%E7%94%A8-%E5%B0%86%E6%9E%84%E5%BB%BA%E6%97%B6%E9%97%B4%E5%86%99%E5%85%A5%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;IIncrementalGenerator 增量 Source Generator 生成代码应用 将构建时间写入源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-SourceGenerator-%E6%BA%90%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E6%8A%80%E6%9C%AF%E5%AE%9E%E7%8E%B0%E4%B8%AD%E6%96%87%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80.html&quot;&gt;dotnet 用 SourceGenerator 源代码生成技术实现中文编程语言&lt;/a&gt; &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/16804899.html&quot;&gt;博客园&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;生成代码例子&quot;&gt;生成代码例子&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/generate-csharp-source-using-roslyn-source-generator&quot;&gt;使用 Source Generator 在编译你的 .NET 项目时自动生成代码 - walterlv&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;visualstudio&quot;&gt;VisualStudio&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%90%84%E7%89%88%E6%9C%AC-msbuild-%E8%B7%AF%E5%BE%84.html&quot;&gt;VisualStudio 各版本 msbuild 路径&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/visual-studio-2015-warning-MSB3246.html&quot;&gt;visual studio 2015 warning MSB3246&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Visual-studio-%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE%E5%A4%B1%E8%B4%A5vstemplate.html&quot;&gt;Visual studio 创建项目失败vstemplate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Visual-Studio-%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A1%B9%E7%9B%AE%E6%A8%A1%E6%9D%BF.html&quot;&gt;Visual Studio 自定义项目模板&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Visual-studio-C-%E4%BB%A3%E7%A0%81%E4%BD%BF%E7%94%A8-NotNull.html&quot;&gt;Visual studio C# 代码使用 NotNull&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E%E4%BB%A5%E5%89%8D%E7%9A%84%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F%E8%BF%81%E7%A7%BB%E5%88%B0-VS2017-%E6%96%B0%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F.html&quot;&gt;从以前的项目格式迁移到 VS2017 新项目格式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/msbuild-Roslyn-%E8%A1%8C%E4%B8%BA%E8%AF%A6%E8%A7%A3.html&quot;&gt;msbuild Roslyn 行为详解&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-can-not-get-the-correct-struct-object-value-in-Locals-windows.html&quot;&gt;VisualStudio can not get the correct struct object value in Locals windows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E8%87%AA%E5%AE%9A%E4%B9%89%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4.html&quot;&gt;VisualStudio 自定义外部命令&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%A4%96%E9%83%A8%E5%B7%A5%E5%85%B7%E9%85%8D%E5%90%88-dotnet-tool-%E5%88%B6%E4%BD%9C%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6%E5%90%8D%E5%B7%A5%E5%85%B7.html&quot;&gt;VisualStudio 外部工具配合 dotnet tool 制作复制文件名工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%B8%AA-Git-Tag-%E6%8E%A8%E9%80%81.html&quot;&gt;VisualStudio 如何快速添加一个 Git Tag 推送&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/TotalCommander-%E8%AE%BE%E7%BD%AE-VisualStudio-%E5%BC%80%E5%8F%91%E8%80%85%E5%91%BD%E4%BB%A4%E8%A1%8C.html&quot;&gt;TotalCommander 设置 VisualStudio 开发者命令行&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%BC%96%E8%AF%91-build-%E9%80%9A%E8%BF%87-rebuild-%E4%B8%8D%E9%80%9A%E8%BF%87.html&quot;&gt;VisualStudio 命令行编译 build 通过 rebuild 不通过&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/msbuild-%E4%BF%AE%E6%94%B9-VisualStudio-%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%E8%BE%93%E5%87%BA%E7%9B%AE%E5%BD%95%E7%9A%84%E8%B7%AF%E5%BE%84.html&quot;&gt;msbuild 修改 VisualStudio 文件复制到输出目录的路径&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-DockerfileContext-%E8%A7%A3%E5%86%B3%E9%A1%B9%E7%9B%AE%E6%94%BE%E5%9C%A8%E9%87%8C%E5%B1%82%E6%96%87%E4%BB%B6%E5%A4%B9%E5%AF%BC%E8%87%B4-VisualStudio-%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet 通过 DockerfileContext 解决项目放在里层文件夹导致 VisualStudio 构建失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-VisualStudio-%E7%BB%99%E6%96%87%E4%BB%B6%E8%B5%B7%E4%B8%80%E4%B8%AA%E5%B8%A6%E5%88%86%E5%8F%B7%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E4%BC%9A%E6%80%8E%E6%A0%B7.html&quot;&gt;在 VisualStudio 给文件起一个带分号的文件名会怎样&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%BC%80%E5%8F%91%E6%96%87%E4%BB%B6%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B7%A5%E5%85%B7%E5%8D%95%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7.html&quot;&gt;VisualStudio 开发文件自定义工具单文件生成工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2019-%E6%96%B0%E7%89%B9%E6%80%A7.html&quot;&gt;VisualStudio 2019 新特性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2019-%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8-C-8.0-%E6%96%B0%E7%9A%84%E6%96%B9%E5%BC%8F.html&quot;&gt;VisualStudio 2019 尝试使用 C# 8.0 新的方式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2017-%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F-%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E7%89%88%E6%9C%AC%E5%8F%B7.html&quot;&gt;VisualStudio 2017 项目格式 自动生成版本号&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-Windows-Defender-%E8%AE%BE%E7%BD%AE%E6%96%87%E4%BB%B6%E5%A4%B9%E7%99%BD%E5%90%8D%E5%8D%95%E6%8F%90%E5%8D%87-VisualStudio-%E7%BC%96%E8%AF%91%E9%80%9F%E5%BA%A6.html&quot;&gt;在 Windows Defender 设置文件夹白名单提升 VisualStudio 编译速度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-IncrediBuild-%E6%8F%90%E5%8D%87-VisualStudio-%E7%BC%96%E8%AF%91%E9%80%9F%E5%BA%A6.html&quot;&gt;使用 IncrediBuild 提升 VisualStudio 编译速度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%89%E8%A3%85visualStudio-%E5%87%BA%E7%8E%B0-cant-install-Microsoft.TeamFoundation.OfficeIntegration.Resources.html&quot;&gt;安装visualStudio 出现 cant install Microsoft.TeamFoundation.OfficeIntegration.Resources&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%80%E6%AE%B5%E8%83%BD%E8%AE%A9-VisualStudio-%E7%82%B8%E6%8E%89%E7%9A%84%E4%BB%A3%E7%A0%81.html&quot;&gt;一段能让 VisualStudio 炸掉的代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/visualStudio-%E6%97%A0%E6%B3%95%E7%99%BB%E9%99%86.html&quot;&gt;visualStudio 无法登陆&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E7%A6%81%E7%94%A8%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6%E5%88%B0%E6%96%87%E4%BB%B6%E5%A4%B9%E8%87%AA%E5%8A%A8%E4%BF%AE%E6%94%B9%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%8A%9F%E8%83%BD.html&quot;&gt;VisualStudio 禁用移动文件到文件夹自动修改命名空间功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E7%AD%9B%E9%80%89%E5%99%A8-slnf-%E6%96%87%E4%BB%B6.html&quot;&gt;VisualStudio 解决方案筛选器 slnf 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E4%BD%BF%E7%94%A8%E4%B8%89%E4%B8%AA%E6%96%B9%E6%B3%95%E5%90%AF%E5%8A%A8%E6%9C%80%E6%96%B0-C-%E5%8A%9F%E8%83%BD.html&quot;&gt;VisualStudio 使用三个方法启动最新 C# 功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2019-%E5%A6%82%E4%BD%95%E7%A6%BB%E7%BA%BF%E4%B8%8B%E8%BD%BD.html&quot;&gt;VisualStudio 2019 如何离线下载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E9%85%8D%E7%BD%AE%E5%A4%9A%E8%BF%9B%E7%A8%8B%E8%B0%83%E8%AF%95%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%90%AF%E5%8A%A8%E9%A1%B9%E7%9B%AE.html&quot;&gt;VisualStudio 配置多进程调试快捷键启动项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2019-%E6%96%B0%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%B7%BB%E5%8A%A0-git-%E4%BB%93%E5%BA%93.html&quot;&gt;VisualStudio 2019 新创建项目添加 git 仓库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2022-%E5%A6%82%E4%BD%95%E6%98%BE%E7%A4%BA-dotnet-6-%E5%8F%8A%E4%BB%A5%E4%B8%8A%E7%89%88%E6%9C%AC%E7%9A%84%E6%A1%86%E6%9E%B6%E7%9A%84%E4%BB%A3%E7%A0%81%E6%B3%A8%E9%87%8A%E4%B8%BA%E4%B8%AD%E6%96%87.html&quot;&gt;VisualStudio 2022 如何显示 dotnet 6 及以上版本的框架的代码注释为中文&lt;/a&gt;
&lt;!-- [VisualStudio 2022 如何显示 dotnet 6 及以上版本的框架的代码注释为中文 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/17973889 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E5%90%AF%E5%8A%A8%E9%A1%B9%E7%9B%AE.html&quot;&gt;VisualStudio 快速设置启动项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%90%88%E5%B9%B6%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6.html&quot;&gt;VisualStudio 合并代码文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E4%BF%AE%E6%94%B9%E9%85%8D%E8%89%B2.html&quot;&gt;VisualStudio 修改配色&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Visual-Studio-%E6%9F%A5%E7%9C%8B%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%83%BD%E5%8A%9B.html&quot;&gt;Visual Studio 查看项目的能力&lt;/a&gt;
&lt;!-- [Visual Studio 查看项目的能力 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18409403 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E4%BD%BF%E7%94%A8-VisualStudio-%E6%AF%94%E8%BE%83%E5%88%86%E6%94%AF%E6%9B%B4%E6%94%B9.html&quot;&gt;git 使用 VisualStudio 比较分支更改&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-VisualStudio-2017-%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6.html&quot;&gt;WPF 使用 VisualStudio 2017 项目文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%AE%89%E8%A3%85-Python-%E5%BC%80%E5%8F%91.html&quot;&gt;VisualStudio 安装 Python 开发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E9%80%9A%E8%BF%87-EditorBrowsable-%E9%9A%90%E8%97%8F%E4%B8%8D%E5%BC%80%E6%94%BE%E7%9A%84%E5%B1%9E%E6%80%A7%E6%88%96%E6%96%B9%E6%B3%95.html&quot;&gt;VisualStudio 通过 EditorBrowsable 隐藏不开放的属性或方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E8%BF%87%E6%BB%A4%E8%BE%93%E5%87%BA%E7%AA%97%E5%8F%A3%E6%96%87%E6%9C%AC.html&quot;&gt;VisualStudio 过滤输出窗口文本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E9%80%9A%E8%BF%87%E9%85%8D%E7%BD%AE-DefaultXamlRuntime-%E5%B1%9E%E6%80%A7-%E8%AE%A9%E6%8E%A7%E5%88%B6%E5%8F%B0%E9%A1%B9%E7%9B%AE%E9%87%8C%E7%9A%84-XAML-%E5%BA%94%E7%94%A8%E4%B8%8A%E6%99%BA%E8%83%BD%E6%8F%90%E7%A4%BA.html&quot;&gt;VisualStudio 通过配置 DefaultXamlRuntime 属性 让控制台项目里的 XAML 应用上智能提示&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-csproj-%E6%B7%BB%E5%8A%A0-ItemGroup-%E7%9A%84-Service.html&quot;&gt;VisualStudio csproj 添加 ItemGroup 的 Service &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8-OllamaHub-%E8%AE%A9-Visual-Studio-Copilot-%E5%8F%AF%E4%BB%A5%E5%AF%B9%E6%8E%A5%E4%BB%BB%E6%84%8F%E6%A8%A1%E5%9E%8B.html&quot;&gt;用 OllamaHub 让 Visual Studio Copilot 可以对接任意模型&lt;/a&gt;
&lt;!-- [用 OllamaHub 让 Visual Studio Copilot 可以对接任意模型 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20687205 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%9E%E9%AA%8C%E5%8D%83%E9%97%AE-3.7-Plus-%E5%9C%A8-VS-Copilot-%E9%87%8C%E6%92%B0%E5%86%99-XAML-%E7%9A%84%E8%83%BD%E5%8A%9B.html&quot;&gt;实验千问 3.7 Plus 在 VS Copilot 里撰写 XAML 的能力&lt;/a&gt;
&lt;!-- [实验千问 3.7 Plus 在 VS Copilot 里撰写 XAML 的能力 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20943542 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;visualstudio-调试&quot;&gt;VisualStudio 调试&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%E8%AF%A6%E8%A7%A3.html&quot;&gt;VisualStudio 断点调试详解&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E8%B0%83%E8%AF%95%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%96%B9%E6%B3%95.html&quot;&gt;VisualStudio 调试内存泄漏方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E8%AE%A9-VisualStudio-%E6%80%A5%E9%80%9F%E8%B0%83%E8%AF%95%E5%BA%95%E5%B1%82%E5%BA%93%E6%96%B9%E6%B3%95.html&quot;&gt;Roslyn 让 VisualStudio 急速调试底层库方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AD%A6%E6%83%95-Visual-Studio-%E5%B1%9E%E6%80%A7%E6%B1%82%E5%80%BC%E5%89%AF%E4%BD%9C%E7%94%A8%E5%AF%BC%E8%87%B4%E9%80%BB%E8%BE%91%E4%B8%8D%E7%AC%A6%E5%90%88%E9%A2%84%E6%9C%9F.html&quot;&gt;警惕 Visual Studio 属性求值副作用导致逻辑不符合预期&lt;/a&gt;
&lt;!-- [警惕 Visual Studio 属性求值副作用导致逻辑不符合预期 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18436921 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/UOS-%E5%BC%80%E5%90%AF-VisualStudio-%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95-.NET-%E5%BA%94%E7%94%A8%E4%B9%8B%E6%97%85.html&quot;&gt;UOS 开启 VisualStudio 远程调试 .NET 应用之旅&lt;/a&gt;
&lt;!-- [UOS 开启 VisualStudio 远程调试 .NET 应用之旅 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18086533 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%A6%82%E4%BD%95-SSH-%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95-Linux-%E7%9A%84-dotnet-%E5%BA%94%E7%94%A8%E7%9A%84%E5%90%AF%E5%8A%A8.html&quot;&gt;VisualStudio 如何 SSH 远程调试 Linux 的 dotnet 应用的启动&lt;/a&gt;
&lt;!-- [VisualStudio 如何 SSH 远程调试 Linux 的 dotnet 应用的启动 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18238164 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E4%BD%BF%E7%94%A8%E5%A4%9A%E4%B8%AA%E7%8E%AF%E5%A2%83%E8%BF%9B%E8%A1%8C%E8%B0%83%E8%AF%95.html&quot;&gt;VisualStudio 使用多个环境进行调试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%BC%80%E5%90%AF%E4%BB%85%E6%88%91%E4%BB%A3%E7%A0%81%E8%B0%83%E8%AF%95.html&quot;&gt;VisualStudio 开启仅我代码调试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E9%80%9A%E8%BF%87%E5%A4%96%E9%83%A8%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95%E5%BF%AB%E9%80%9F%E8%B0%83%E8%AF%95%E5%BA%93%E4%BB%A3%E7%A0%81.html&quot;&gt;VisualStudio 通过外部调试方法快速调试库代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E6%89%93%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%E5%92%8C%E4%B8%8D%E6%89%93%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB.html&quot;&gt;VisualStudio 打断点调试和不打断点调试有什么区别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%9C%A8-DebuggerDisplay-%E7%9A%84%E5%B1%9E%E6%80%A7%E6%9B%B4%E6%94%B9%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E5%B0%86%E4%BC%9A%E8%AE%A9%E8%B0%83%E8%AF%95%E5%92%8C%E9%9D%9E%E8%B0%83%E8%AF%95%E4%B8%8B%E9%80%BB%E8%BE%91%E4%B8%8D%E5%90%8C.html&quot;&gt;VisualStudio 在 DebuggerDisplay 的属性更改业务逻辑将会让调试和非调试下逻辑不同&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2019-%E8%B0%83%E8%AF%95%E9%A1%B9%E7%9B%AE%E4%BD%BF%E7%94%A8-Portable-PDB-%E6%8F%90%E7%A4%BA%E4%B8%8D%E6%94%AF%E6%8C%81-PDB-%E6%A0%BC%E5%BC%8F.html&quot;&gt;VisualStudio 2019 调试项目使用 Portable PDB 提示不支持 PDB 格式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E8%A7%A3%E5%86%B3%E9%A6%96%E6%AC%A1%E8%B0%83%E8%AF%95-docker-%E7%9A%84-vs2017u5-exists,-deleting-%E5%A4%AA%E6%85%A2%E9%97%AE%E9%A2%98.html&quot;&gt;VisualStudio 解决首次调试 docker 的 vs2017u5 exists, deleting 太慢问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E8%B0%83%E8%AF%95%E6%97%B6%E4%BC%9A%E4%B8%8D%E6%96%AD%E5%88%B7%E6%96%B0-WPF-%E5%BA%94%E7%94%A8%E6%B8%B2%E6%9F%93.html&quot;&gt;VisualStudio 调试时会不断刷新 WPF 应用渲染&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/visual-Studio-%E6%97%A0%E6%B3%95%E8%B0%83%E8%AF%95-%E6%8F%90%E7%A4%BA%E7%A8%8B%E5%BA%8F%E8%B7%9F%E8%B8%AA%E5%B7%B2%E9%80%80%E5%87%BA.html&quot;&gt;visual Studio 无法调试，提示程序跟踪已退出&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-2022-%E6%89%BE%E4%B8%8D%E5%88%B0%E5%86%85%E5%AD%98-%E5%8F%8D%E6%B1%87%E7%BC%96-%E5%AF%84%E5%AD%98%E5%99%A8%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7.html&quot;&gt;VisualStudio 2022 找不到内存 反汇编 寄存器调试工具&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2378995&quot;&gt;腾讯云&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;visualstudio-插件收藏&quot;&gt;VisualStudio 插件收藏&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%A5%BD%E7%94%A8%E6%8F%92%E4%BB%B6%E9%9B%86%E5%90%88.html&quot;&gt;VisualStudio 好用插件集合&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83%E5%B7%A5%E5%85%B7-2.6-%E4%BF%AE%E6%94%B9%E5%BD%93%E5%89%8D%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81.html&quot;&gt;VisualStudio 编码规范工具 2.6 修改当前文件编码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E6%8F%92%E4%BB%B6-%E7%BF%BB%E8%AF%91%E6%B3%A8%E9%87%8A.html&quot;&gt;VisualStudio 插件 翻译注释&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;visualstudio-扩展插件开发&quot;&gt;VisualStudio 扩展插件开发&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91.html&quot;&gt;VisualStudio 扩展开发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91-%E8%8E%B7%E5%BE%97%E8%BE%93%E5%87%BA%E7%AA%97%E5%8F%A3%E5%86%85%E5%AE%B9.html&quot;&gt;VisualStudio 扩展开发 获得输出窗口内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91-%E6%B7%BB%E5%8A%A0%E8%BE%93%E5%87%BA%E7%AA%97%E5%8F%A3.html&quot;&gt;VisualStudio 扩展开发 添加输出窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91-%E6%B7%BB%E5%8A%A0%E8%8F%9C%E5%8D%95.html&quot;&gt;VisualStudio 扩展开发 添加菜单&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;cicd&quot;&gt;CICD&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E7%BB%99-CI-CD-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA%E4%B8%8A-.NET-5-%E6%9E%84%E5%BB%BA%E5%92%8C%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83.html&quot;&gt;如何给 CI CD 服务器搭建上 .NET 5 构建和运行环境&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;github-action&quot;&gt;GitHub Action&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%83%A8%E7%BD%B2-github-%E7%9A%84-Action-%E8%BF%9B%E8%A1%8C%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90.html&quot;&gt;dotnet 部署 github 的 Action 进行持续集成&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%85%8D%E7%BD%AE-github-%E8%87%AA%E5%8A%A8%E6%89%93%E5%8C%85%E4%B8%8A%E4%BC%A0-nuget-%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 配置 github 自动打包上传 nuget 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%85%8D%E5%90%88-GitHub-%E7%9A%84-Action-%E5%81%9A%E8%87%AA%E5%8A%A8%E6%8E%A8-Tag-%E6%97%B6%E6%89%93%E5%8C%85-NuGet-%E5%8C%85.html&quot;&gt;dotnet 配合 GitHub 的 Action 做自动推 Tag 时打包 NuGet 包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Github-%E7%BB%99%E4%BB%93%E5%BA%93%E4%B8%8A%E4%BC%A0-NuGet-%E5%BA%93.html&quot;&gt;Github 给仓库上传 NuGet 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-GitHub-%E7%9A%84-Action-%E4%B8%8A%E9%83%A8%E7%BD%B2%E8%87%AA%E5%8A%A8%E4%BB%A3%E7%A0%81%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83%E6%9C%BA%E5%99%A8%E4%BA%BA.html&quot;&gt;dotnet 在 GitHub 的 Action 上部署自动代码编码规范机器人&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-GitHub-%E4%BB%93%E5%BA%93%E6%B7%BB%E5%8A%A0-NuGet-%E7%89%88%E6%9C%AC%E5%9B%BE%E6%A0%87%E5%92%8C%E6%9E%84%E5%BB%BA%E5%9B%BE%E6%A0%87.html&quot;&gt;在 GitHub 仓库添加 NuGet 版本图标和构建图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GitHub-Action-%E6%96%B0%E4%B8%8A%E7%BA%BF-WPF-.NET-Core-%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E6%A8%A1%E6%9D%BF.html&quot;&gt;GitHub Action 新上线 WPF .NET Core 自动构建模板&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9F%BA%E4%BA%8E-dotnet-format-%E7%9A%84-GitHub-Action-%E8%87%AA%E5%8A%A8%E4%BB%A3%E7%A0%81%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%9C%BA%E5%99%A8%E4%BA%BA.html&quot;&gt;dotnet 基于 dotnet format 的 GitHub Action 自动代码格式化机器人&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/github-%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E5%88%A0%E9%99%A4%E5%90%88%E5%B9%B6%E7%9A%84%E5%88%86%E6%94%AF.html&quot;&gt;github 设置自动删除合并的分支&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%83%A8%E7%BD%B2-GitHub-%E7%9A%84-Action-Runner-%E5%88%B6%E4%BD%9C%E8%87%AA%E6%89%98%E7%AE%A1%E8%BF%90%E8%A1%8C%E5%99%A8.html&quot;&gt;dotnet 部署 GitHub 的 Action Runner 制作自托管运行器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GitHub-%E5%A6%82%E4%BD%95%E8%BF%87%E6%BB%A4%E6%9F%90%E4%B8%AA%E4%BD%9C%E8%80%85%E7%9A%84-MR-%E5%86%85%E5%AE%B9.html&quot;&gt;GitHub 如何过滤某个作者的 MR 内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Github-%E6%B7%BB%E5%8A%A0-Action-%E7%BC%96%E8%AF%91%E5%9B%BE%E6%A0%87.html&quot;&gt;Github 添加 Action 编译图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GitHub-%E7%9A%84-Action-%E6%8E%A5%E5%85%A5-Stryker.NET-%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E9%B2%81%E6%A3%92%E6%80%A7.html&quot;&gt;GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%80%9A%E8%BF%87-GitHub-%E7%9A%84-Action-%E8%BE%85%E5%8A%A9%E4%B8%8B%E8%BD%BD%E5%9B%BD%E5%A4%96%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E7%9A%84%E7%A6%BB%E7%BA%BF%E4%B8%8B%E8%BD%BD%E6%96%B9%E6%B3%95.html&quot;&gt;dotnet 通过 GitHub 的 Action 辅助下载国外资源文件的离线下载方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GitHub-%E7%9A%84-Action-%E5%A6%82%E4%BD%95%E7%A6%81%E7%94%A8.html&quot;&gt;GitHub 的 Action 如何禁用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GitHub-%E7%9A%84-Action-%E5%88%A4%E6%96%AD%E4%BB%85%E5%9C%A8%E4%B8%BB%E4%BB%93%E5%BA%93%E6%89%8D%E6%89%A7%E8%A1%8C%E8%84%9A%E6%9C%AC.html&quot;&gt;GitHub 的 Action 判断仅在主仓库才执行脚本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BF%AE%E5%A4%8D-GitHub-Action-%E6%9E%84%E5%BB%BA%E8%BF%87%E7%A8%8B%E6%8F%90%E7%A4%BA-NETSDK1127-%E9%94%99%E8%AF%AF.html&quot;&gt;dotnet 修复 GitHub Action 构建过程提示 NETSDK1127 错误&lt;/a&gt; &lt;a href=&quot;https://cloud.tencent.com/developer/article/2380232&quot;&gt;腾讯云&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%94%AF%E6%8C%81%E8%BE%83%E4%BD%8E-GLibC-%E7%89%88%E6%9C%AC%E7%9A%84-dotnet-AOT-GitHub-Action-%E6%9E%84%E5%BB%BA%E6%96%B9%E6%B3%95.html&quot;&gt;支持较低 GLibC 版本的 dotnet AOT GitHub Action 构建方法&lt;/a&gt;
&lt;!-- [支持较低 GLibC 版本的 dotnet AOT GitHub Action 构建方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19055031 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;gitlab&quot;&gt;Gitlab&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%85%8D%E7%BD%AE-Gitlab-%E7%9A%84-Runner-%E5%81%9A-CI-%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA.html&quot;&gt;dotnet 配置 Gitlab 的 Runner 做 CI 自动构建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%85%8D%E5%90%88-Gitlab-%E5%81%9A%E8%87%AA%E5%8A%A8%E6%8E%A8-Tag-%E6%97%B6%E6%89%93%E5%8C%85-NuGet-%E5%8C%85.html&quot;&gt;dotnet 配合 Gitlab 做自动推 Tag 时打包 NuGet 包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%B0%86%E8%87%AA%E5%8A%A8%E4%BB%A3%E7%A0%81%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%B8%A6%E5%85%A5%E5%9B%A2%E9%98%9F-GitLab-%E5%B9%B3%E5%8F%B0.html&quot;&gt;dotnet 将自动代码格式化机器人带入团队 GitLab 平台&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E8%AE%A9-Gitlab-%E7%9A%84-Runner-%E5%9C%A8%E6%9E%84%E5%BB%BA%E6%97%B6%E6%8B%89%E5%8F%96-Git-Submodules-%E4%BB%93%E5%BA%93.html&quot;&gt;如何让 Gitlab 的 Runner 在构建时拉取 Git Submodules 仓库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%AE%E5%A4%8D-GitLab-%E7%9A%84-CI-Runner-%E6%8F%90%E7%A4%BA%E6%89%BE%E4%B8%8D%E5%88%B0-pwsh-%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6.html&quot;&gt;修复 GitLab 的 CI Runner 提示找不到 pwsh 执行文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ASP.NET-Core-%E8%BF%9E%E6%8E%A5-GitLab-%E4%B8%8E-MatterMost-%E6%89%93%E9%80%A0-devops-%E5%B7%A5%E5%85%B7.html&quot;&gt;ASP.NET Core 连接 GitLab 与 MatterMost 打造 devops 工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E8%83%BD%E6%9E%84%E5%BB%BA-dotnet-AOT-%E7%9A%84-gitlab-ruuner-%E7%9A%84-Debian-docker-%E9%95%9C%E5%83%8F.html&quot;&gt;制作一个能构建 dotnet AOT 的 gitlab ruuner 的 Debian docker 镜像&lt;/a&gt;
&lt;!-- [制作一个能构建 dotnet AOT 的 gitlab runner 的 Debian docker 镜像 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18164886 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E9%85%8D%E7%BD%AE-Gitlab-%E7%9A%84-CI-%E6%89%BE%E4%B8%8D%E5%88%B0-Runner-%E6%88%96%E6%89%BE%E9%94%99%E7%9A%84%E5%8F%AF%E8%83%BD%E5%8E%9F%E5%9B%A0.html&quot;&gt;dotnet 配置 Gitlab 的 CI 找不到 Runner 或找错的可能原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-Gitlab-%E5%BC%80%E5%90%AF-MatterMost-%E6%9C%BA%E5%99%A8%E4%BA%BA.html&quot;&gt;在 Gitlab 开启 MatterMost 机器人&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-tool-%E5%88%9B%E5%BB%BA-GitLab-%E5%90%88%E5%B9%B6%E8%AF%B7%E6%B1%82-Merge-Requests-%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet tool 创建 GitLab 合并请求 Merge Requests 工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E-gitlab-%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86%E8%81%8A%E8%81%8A%E5%9B%A2%E9%98%9F%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86.html&quot;&gt;从 gitlab 配置管理聊聊团队项目管理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-11-%E5%9C%A8-GitLab-Runner-%E6%9C%8D%E5%8A%A1%E5%86%85%E6%89%BE%E4%B8%8D%E5%88%B0-SMB-%E6%8C%82%E8%BD%BD%E7%9A%84-NAS-%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;Windows 11 在 GitLab Runner 服务内找不到 SMB 挂载的 NAS 文件夹&lt;/a&gt;
&lt;!-- [Windows 11 在 GitLab Runner 服务内找不到 SMB 挂载的 NAS 文件夹 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18827932 ) --&gt;&lt;/p&gt;

&lt;h4 id=&quot;杂项&quot;&gt;杂项&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E4%BD%BF%E7%94%A8-appveyor-%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA.html&quot;&gt;开源项目使用 appveyor 自动构建&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Fiddler-%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91-%E5%B0%86%E6%8F%92%E4%BB%B6%E6%94%BE%E5%9C%A8%E7%8B%AC%E7%AB%8B%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E9%98%B2%E6%AD%A2-DLL-%E5%86%B2%E7%AA%81.html&quot;&gt;Fiddler 插件开发 将插件放在独立子文件夹防止 DLL 冲突&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;nuget&quot;&gt;NuGet&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%89%93%E5%8C%85-NuGet-%E7%9A%84%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%A4%A7%E5%85%A8%E6%95%B4%E7%90%86.html&quot;&gt;dotnet 打包 NuGet 的配置属性大全整理&lt;/a&gt;
&lt;!-- [dotnet 打包 NuGet 的配置属性大全整理 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18826022 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/msbuild-%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E5%B8%B8%E7%94%A8%E5%88%A4%E6%96%AD%E6%9D%A1%E4%BB%B6.html&quot;&gt;msbuild 项目文件常用判断条件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/How-to-generate-NuGet-package-with-Git-Tag-version-using-GitHub-Action.html&quot;&gt;How to generate NuGet package with Git Tag version using GitHub Action&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-ASP.NET-Core-%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A5%E4%B8%8A%E4%BC%A0%E5%BA%93%E6%96%87%E4%BB%B6%E7%9A%84-NuGet-%E6%9C%8D%E5%8A%A1%E5%99%A8.html&quot;&gt;dotnet 用 ASP.NET Core 制作一个可以上传库文件的 NuGet 服务器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-NuGet-%E5%B0%86%E8%87%AA%E5%B7%B1%E7%9A%84%E5%B7%A5%E5%85%B7%E4%BD%9C%E4%B8%BA-dotnet-tool-%E5%88%86%E5%8F%91.html&quot;&gt;dotnet 用 NuGet 将自己的工具作为 dotnet tool 分发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E6%89%93%E5%8C%85-NuGet-%E5%8C%85%E6%B7%BB%E5%8A%A0%E6%94%B9%E5%8A%A8%E6%97%A5%E5%BF%97.html&quot;&gt;Roslyn 打包 NuGet 包添加改动日志&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%AF%8F%E4%B8%AA%E9%A1%B9%E7%9B%AE%E9%83%BD%E4%BC%9A%E8%BE%93%E5%87%BA%E4%B8%80%E4%B8%AA-NuGet-%E5%8C%85%E8%80%8C%E4%B8%8D%E6%98%AF%E4%B8%80%E4%B8%AA%E5%8C%85%E5%B8%A6%E6%89%80%E6%9C%89%E9%A1%B9%E7%9B%AE.html&quot;&gt;dotnet 为什么每个项目都会输出一个 NuGet 包而不是一个包带所有项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%9C%A8-NuGet-%E5%8C%85%E4%B8%AD%E6%94%BE%E6%B3%A8%E9%87%8A-xml-%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95.html&quot;&gt;Roslyn 在 NuGet 包中放注释 xml 文件的方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/NuGet-%E6%9B%B4%E6%96%B0%E5%BA%93%E6%96%B0%E7%89%88%E6%9C%AC%E7%9A%84%E7%BC%93%E5%AD%98%E9%97%AE%E9%A2%98.html&quot;&gt;NuGet 更新库新版本的缓存问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9C%A8-NuGet-%E4%B8%8A%E6%90%9C%E5%AF%BB%E5%A5%BD%E7%94%A8%E7%9A%84-dotnet-tool-%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet 在 NuGet 上搜寻好用的 dotnet tool 工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/NuGet-%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E5%9B%BE%E6%A0%87.html&quot;&gt;NuGet 如何设置图标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-SourceLink-%E5%B0%86-NuGet-%E9%93%BE%E6%8E%A5%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%B0-GitHub-%E7%AD%89%E4%BB%93%E5%BA%93.html&quot;&gt;dotnet 使用 SourceLink 将 NuGet 链接源代码到 GitHub 等仓库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/NuGet-%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8A%E4%BC%A0%E6%89%BE%E4%B8%8D%E5%88%B0-snupkg-%E6%96%87%E4%BB%B6.html&quot;&gt;NuGet 命令行上传找不到 snupkg 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E4%BD%BF%E7%94%A8-Target-%E6%9B%BF%E6%8D%A2%E5%8D%A0%E4%BD%8D%E7%AC%A6%E6%96%B9%E5%BC%8F%E7%94%9F%E6%88%90-nuget-%E6%89%93%E5%8C%85.html&quot;&gt;Roslyn 使用 Target 替换占位符方式生成 nuget 打包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-NuGet-%E5%BA%93%E4%BF%AE%E6%94%B9%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%85%A5%E5%8F%A3%E5%87%BD%E6%95%B0.html&quot;&gt;Roslyn 通过 NuGet 库修改应用程序入口函数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-Nuget-%E5%BC%95%E7%94%A8%E6%BA%90%E4%BB%A3%E7%A0%81-%E5%9C%A8-VS-%E6%99%BA%E8%83%BD%E6%8F%90%E7%A4%BA%E6%AD%A3%E5%B8%B8%E4%BD%86%E6%98%AF%E6%97%A0%E6%B3%95%E7%BC%96%E8%AF%91.html&quot;&gt;Roslyn 通过 Nuget 引用源代码 在 VS 智能提示正常但是无法编译&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-Nuget-%E7%AE%A1%E7%90%86%E5%85%AC%E5%8F%B8%E9%85%8D%E7%BD%AE.html&quot;&gt;Roslyn 通过 Nuget 管理公司配置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E4%BD%BF%E7%94%A8%E6%96%B0%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F%E5%BF%AB%E9%80%9F%E6%89%93%E5%87%BA-Nuget-%E5%8C%85.html&quot;&gt;VisualStudio 使用新项目格式快速打出 Nuget 包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%8E%B7%E5%8F%96-Nuget-%E7%89%88%E6%9C%AC%E5%8F%B7.html&quot;&gt;获取 Nuget 版本号&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E7%A7%BB%E5%8A%A8-nuget-%E7%BC%93%E5%AD%98%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;如何移动 nuget 缓存文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Github-%E7%BB%99%E4%BB%93%E5%BA%93%E4%B8%8A%E4%BC%A0-NuGet-%E5%BA%93.html&quot;&gt;Github 给仓库上传 NuGet 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/How-to-fix-nuget-Unrecognized-license-type-MIT-when-pack.html&quot;&gt;How to fix nuget Unrecognized license type MIT when pack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%BC%80%E5%8F%91-NuGet-%E5%8C%85%E7%9A%84-Task-%E7%BC%96%E8%AF%91%E5%8F%AF%E8%83%BD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98.html&quot;&gt;Roslyn 开发 NuGet 包的 Task 编译可能遇到的问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/NuGet-%E7%AC%A6%E5%8F%B7%E6%9C%8D%E5%8A%A1%E5%99%A8.html&quot;&gt;NuGet 符号服务器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E5%A6%82%E4%BD%95%E5%9C%A8-NuGet-%E5%8C%85%E9%87%8C%E9%9D%A2%E5%90%8C%E6%97%B6%E5%8C%85%E5%90%AB-DEBUG-%E5%92%8C-RELEASE-%E7%9A%84%E5%BA%93.html&quot;&gt;VisualStudio 如何在 NuGet 包里面同时包含 DEBUG 和 RELEASE 的库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/VisualStudio-%E7%BB%99%E9%A1%B9%E7%9B%AE%E6%B7%BB%E5%8A%A0%E7%89%B9%E6%AE%8A%E7%9A%84-Nuget-%E7%9A%84%E9%93%BE%E6%8E%A5.html&quot;&gt;VisualStudio 给项目添加特殊的 Nuget 的链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Nuget-%E9%80%9A%E8%BF%87-dotnet-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%91%E5%B8%83.html&quot;&gt;Nuget 通过 dotnet 命令行发布&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-nuget-%E7%BB%9F%E4%B8%80%E7%AE%A1%E7%90%86%E4%BF%A1%E6%81%AF.html&quot;&gt;Roslyn 通过 nuget 统一管理信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%AE%E5%A4%8D-VisualStudio-%E6%9E%84%E5%BB%BA%E6%97%B6%E6%B2%A1%E6%9C%89%E5%B0%86-NuGet-%E7%9A%84-PDB-%E7%AC%A6%E5%8F%B7%E6%96%87%E4%BB%B6%E6%8B%B7%E8%B4%9D%E5%88%B0%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;修复 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E5%A6%82%E4%BD%95%E5%9F%BA%E4%BA%8E-Microsoft.NET.Sdk-%E5%88%B6%E4%BD%9C%E6%BA%90%E4%BB%A3%E7%A0%81%E5%8C%85.html&quot;&gt;Roslyn 如何基于 Microsoft.NET.Sdk 制作源代码包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E6%89%93%E5%8C%85%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E6%96%87%E4%BB%B6%E5%88%B0-NuGet-%E5%8C%85.html&quot;&gt;Roslyn 打包自定义的文件到 NuGet 包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E9%80%9A%E8%BF%87-EmbedAllSources-%E5%B0%86%E6%BA%90%E4%BB%A3%E7%A0%81%E5%B5%8C%E5%85%A5%E5%88%B0-PDB-%E7%AC%A6%E5%8F%B7%E6%96%87%E4%BB%B6%E4%B8%AD%E6%96%B9%E4%BE%BF%E5%BC%80%E5%8F%91%E8%80%85%E8%B0%83%E8%AF%95.html&quot;&gt;Roslyn 通过 EmbedAllSources 将源代码嵌入到 PDB 符号文件中方便开发者调试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Roslyn-%E6%89%93%E5%8C%85-NuGet-%E5%8C%85-BuildTransitive-%E6%96%87%E4%BB%B6%E5%A4%B9%E7%94%A8%E4%BA%8E%E7%A9%BF%E9%80%8F%E4%BE%9D%E8%B5%96%E4%BC%A0%E9%80%92%E6%8B%B7%E8%B4%9D%E6%96%87%E4%BB%B6.html&quot;&gt;Roslyn 打包 NuGet 包 BuildTransitive 文件夹用于穿透依赖传递拷贝文件&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;软件安装包&quot;&gt;软件安装包&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.walterlv.com/post/getting-started-with-wix-toolset.html&quot;&gt;WiX Toolset 安装包制作入门教程（目录篇） - walterlv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dotnet9.com/bbs/post/2021/2/how-to-make-a-professional-software-installation-package&quot;&gt;怎么做一个专业的软件安装包？ - 码坊&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dotnet9.com/bbs/post/2022/5/How-to-make-cool-software-installation-package&quot;&gt;怎么制作炫酷软件安装包 - 码界工坊&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dotnet9.com/bbs/post/2023/7/Using-Inno-Setup-to-automatically-build-installation-packages-during-VS-compilation&quot;&gt;利用Inno Setup在VS编译时自动构建安装包 - 码界工坊&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Inno-Setup-%E5%AE%89%E8%A3%85%E5%8C%85%E8%84%9A%E6%9C%AC-Run-%E7%9A%84-Flags-%E6%A0%87%E8%AE%B0.html&quot;&gt;Inno Setup 安装包脚本 Run 的 Flags 标记&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;设计和经验&quot;&gt;设计和经验&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E5%B0%86%E4%B8%80%E4%B8%AA%E5%A4%A7%E5%9E%8B%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%BA%94%E7%94%A8%E9%A1%B9%E7%9B%AE%E8%BF%81%E7%A7%BB%E5%88%B0-dotnet-6-%E7%9A%84%E7%BB%8F%E9%AA%8C%E5%92%8C%E5%86%B3%E7%AD%96.html&quot;&gt;记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%B5%85%E8%B0%88-Windows-%E6%A1%8C%E9%9D%A2%E7%AB%AF%E8%A7%A6%E6%91%B8%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B.html&quot;&gt;浅谈 Windows 桌面端触摸架构演进&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%9B%E5%BB%BACBB%E5%BF%83%E5%BE%97.html&quot;&gt;创建CBB心得&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E7%9A%84%E6%83%B3%E6%B3%95.html&quot;&gt;框架设计的想法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-IOC-%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC%E5%92%8C-DI-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E6%84%8F%E4%B9%89.html&quot;&gt;使用 IOC 控制反转和 DI 依赖注入的意义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%80%E4%BA%9B%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5%E5%A5%97%E8%B7%AF.html&quot;&gt;dotnet 一些代码审查套路&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E4%BD%BF%E7%94%A8-json-%E6%9C%89%E5%93%AA%E4%BA%9B%E5%9D%91.html&quot;&gt;命令行参数使用 json 有哪些坑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E6%9C%89R5G6B5%E9%A2%9C%E8%89%B2%E6%A0%BC%E5%BC%8F.html&quot;&gt;读书笔记 为什么要有R5G6B5颜色格式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A8%8B%E5%BA%8F%E7%8C%BF%E4%BF%AE%E5%85%BB-%E7%BB%99%E5%B1%9E%E6%80%A7%E4%B8%80%E4%B8%AA%E5%8D%95%E4%BD%8D.html&quot;&gt;程序猿修养 给属性一个单位&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/GitHub-%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E.html&quot;&gt;GitHub 开源项目如何参与&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%81%8A%E8%81%8A-2020-%E7%9A%84-dotnet-%E5%90%84%E5%A4%A7%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E4%BB%93%E5%BA%93%E7%9A%84%E6%83%85%E5%86%B5.html&quot;&gt;聊聊 2020 的 dotnet 各大开源项目仓库的情况&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3-%E5%AE%9A%E4%B9%89%E8%BF%87%E6%BB%A4%E7%9A%84%E6%96%B9%E5%BC%8F%E8%A7%A3%E8%80%A6.html&quot;&gt;编程思想 定义过滤的方式解耦&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%94%A8-dotnet-%E5%81%9A%E5%85%A8%E6%A0%88%E5%BC%80%E5%8F%91.html&quot;&gt;从零开始用 dotnet 做全栈开发&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1-%E7%99%BD%E8%AF%9D%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5.html&quot;&gt;软件设计 白话依赖注入&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BC%80%E6%BA%90%E5%85%AC%E5%85%B1%E7%BB%84%E4%BB%B6%E4%BB%93%E5%BA%93%E7%9A%84%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%86%99.html&quot;&gt;开源公共组件仓库的更新日志应该如何写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8-GUID-%E5%81%9A%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%8D%E6%98%AF%E5%A5%BD%E4%B8%BB%E6%84%8F.html&quot;&gt;为什么使用 GUID 做文件名不是好主意&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%85%B3%E4%BA%8E%E6%8A%80%E6%9C%AF%E8%A7%84%E5%88%92%E7%9A%84%E6%83%B3%E6%B3%95.html&quot;&gt;关于技术规划的想法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%90%AC%E9%BE%99%E5%8D%8E%E8%AE%B2%E5%85%AC%E5%85%B1%E7%BB%84%E4%BB%B6-CBB-%E5%BB%BA%E8%AE%BE%E7%AC%94%E8%AE%B0.html&quot;&gt;听龙华讲公共组件 CBB 建设笔记&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%88%91%E5%86%99%E7%9A%84%E9%80%97%E6%AF%94%E4%BB%A3%E7%A0%81.html&quot;&gt;我写的逗比代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%96%87%E6%A1%A3%E5%BA%94%E7%94%A8%E7%9A%84%E6%92%A4%E9%94%80%E9%87%8D%E5%81%9A%E8%AE%BE%E8%AE%A1.html&quot;&gt;dotnet 文档应用的撤销重做设计&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E5%8C%96%E5%88%86%E6%9E%90-DUMP-%E5%B9%B3%E5%8F%B0.html&quot;&gt;搭建一个自动化分析 DUMP 平台&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%8F%8C%E7%BC%93%E5%AD%98%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%AE%BE%E8%AE%A1-%E4%B8%8B%E8%BD%BD%E5%BA%93%E7%9A%84%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5%E7%BC%93%E5%AD%98%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 双缓存数据结构设计 下载库的文件写入缓存框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%80%9A%E8%BF%87%E5%85%AC%E5%BC%80%E7%9A%84%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E5%8F%91%E5%B8%83%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E7%9A%84%E5%BA%93%E7%9A%84%E5%AE%89%E5%85%A8%E6%84%8F%E4%B9%89.html&quot;&gt;通过公开的自动构建发布开源项目的库的安全意义&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-C-%E5%86%99%E8%84%9A%E6%9C%AC%E7%9A%84%E4%BC%98%E5%8A%BF%E5%92%8C%E6%96%B9%E6%B3%95.html&quot;&gt;使用 C# 写脚本的优势和方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%BC%80%E5%8F%91%E7%9A%84%E5%8D%95%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93%E5%92%8C%E5%A4%9A%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93%E7%9A%84%E4%BC%98%E5%8A%A3.html&quot;&gt;dotnet 开发的单代码仓库和多代码仓库的优劣&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%99%BD%E6%9D%BF%E7%B1%BB%E5%BA%94%E7%94%A8%E7%9A%84%E6%A8%A1%E5%BC%8F%E4%BA%A4%E4%BA%92%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88.html&quot;&gt;白板类应用的模式交互设计方案&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%99%BD%E6%9D%BF%E7%B1%BB%E5%BA%94%E7%94%A8%E7%9A%84%E4%B8%9A%E5%8A%A1%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E6%A8%A1%E5%BC%8F.html&quot;&gt;白板类应用的业务事件分发模式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BA%94%E7%94%A8%E5%95%86%E5%BA%97%E7%9A%84%E6%88%98%E7%95%A5%E5%9C%B0%E4%BD%8D.html&quot;&gt;应用商店的战略地位&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E7%94%BB%E5%B8%83%E5%B7%A5%E5%85%B7%E6%A0%8F%E7%9A%84%E5%8F%AF%E6%89%A9%E5%B1%95%E8%AE%BE%E8%AE%A1.html&quot;&gt;WPF 画布工具栏的可扩展设计&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E8%B0%81%E6%94%B9%E4%BA%86%E6%88%91%E7%9A%84%E4%BB%A3%E7%A0%81.html&quot;&gt;C＃ 谁改了我的代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E8%B4%A3%E4%BB%BB%E9%93%BE.html&quot;&gt;C# 设计模式 责任链&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%8E%E4%BA%BA%E5%B7%A5%E6%80%9D%E7%BB%B4%E5%8A%A0%E4%B8%8A%E4%BA%8C%E9%98%B6%E7%86%B5%E7%8C%9C%E6%B5%8B%E4%B8%96%E7%95%8C%E5%AD%98%E5%9C%A8%E6%84%8F%E5%BF%97%E6%80%9D%E7%BB%B4.html&quot;&gt;从人工思维加上二阶熵猜测世界存在意志思维&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E-.NET-%E7%9A%84%E5%BC%80%E5%8F%91%E5%92%8C%E8%AE%BE%E8%AE%A1.html&quot;&gt;如何参与 .NET 的开发和设计&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%97%A5%E5%BF%97%E4%B8%8A%E6%8A%A5%E7%9A%84-TracerId-%E5%92%8C-SessionId-%E7%9A%84%E6%84%8F%E4%B9%89.html&quot;&gt;dotnet 日志上报的 TracerId 和 SessionId 的意义&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;程序猿修养&quot;&gt;程序猿修养&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A8%8B%E5%BA%8F%E7%8C%BF%E4%BF%AE%E5%85%BB-%E4%BB%8E%E5%AE%89%E8%A3%85-dotnet-%E5%BC%80%E5%A7%8B.html&quot;&gt;程序猿修养 从安装 dotnet 开始&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A8%8B%E5%BA%8F%E7%8C%BF%E4%BF%AE%E5%85%BB-%E4%BD%BF%E7%94%A8-NuGet-%E5%8F%91%E5%B0%84%E5%8D%AB%E6%98%9F%E5%8F%AA%E9%9C%80%E8%A6%81%E4%B8%89%E6%AD%A5.html&quot;&gt;程序猿修养 使用 NuGet 发射卫星只需要三步&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A8%8B%E5%BA%8F%E7%8C%BF%E4%BF%AE%E5%85%BB-%E6%97%A5%E5%BF%97%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%86%99.html&quot;&gt;程序猿修养 日志应该如何写&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;算法&quot;&gt;算法&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PTA-6-2-%E5%A4%9A%E9%A1%B9%E5%BC%8F%E6%B1%82%E5%80%BC.html&quot;&gt;PTA 6-2 多项式求值&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%8D%E4%BD%BF%E7%94%A8%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%8F%8D%E8%BD%AC%E6%A0%88.html&quot;&gt;不使用数据结构反转栈&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%90%9C%E7%B4%A2%E7%AE%97%E6%B3%95.html&quot;&gt;C# 搜索算法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%B1%82%E7%82%B9%E9%9B%86%E7%9A%84%E5%A4%96%E6%8E%A5%E7%9F%A9%E5%BD%A2.html&quot;&gt;求点集的外接矩形&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9B%BE%E8%AE%BA%E5%8A%A0%E6%B3%95.html&quot;&gt;图论加法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%85%A8%E9%9D%A2%E8%A7%A3%E6%9E%90.html&quot;&gt;卷积神经网络全面解析&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%95%B0%E6%8D%AE%E5%B7%AE%E5%BC%82%E7%AE%97%E6%B3%95-%E7%94%A8%E4%BA%8E%E5%87%8F%E5%B0%8FOTA%E5%86%85%E5%AE%B9.html&quot;&gt;二进制数据差异算法 用于减小OTA内容&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%86%E5%BD%A2%E5%92%8C%E5%9B%BE%E8%AE%BA%E7%BD%91%E7%BB%9C.html&quot;&gt;分形和图论网络&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99%E4%B8%80%E4%B8%AA%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD-%E4%BB%8E%E4%B8%80%E4%B8%AA%E7%A5%9E%E7%BB%8F%E5%85%83%E5%BC%80%E5%A7%8B.html&quot;&gt;dotnet 从零开始写一个人工智能 从一个神经元开始&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99%E4%B8%80%E4%B8%AA%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD.html&quot;&gt;dotnet 从零开始写一个人工智能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%89%8B%E7%AE%97%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C-BP-%E4%BC%A0%E6%92%AD%E7%AE%97%E6%B3%95.html&quot;&gt;手算神经网络 BP 传播算法&lt;/a&gt;
&lt;!-- [手算神经网络BP传播算法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19067357 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%9F%E6%88%90%E5%AF%86%E7%A0%81.html&quot;&gt;生成密码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%86%E5%92%8C%E7%BA%BF.html&quot;&gt;圆和线&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8%E7%8A%B6%E6%80%81%E6%9C%BA%E7%9A%84%E6%80%9D%E6%83%B3%E8%A7%A3%E6%9E%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html&quot;&gt;用状态机的思想解析字符串&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9B%BE%E8%AE%BA-Warshall-%E5%92%8CFloyd-%E7%9F%A9%E9%98%B5%E4%BC%A0%E9%80%92%E9%97%AD%E5%8C%85.html&quot;&gt;图论 Warshall 和Floyd 矩阵传递闭包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-dotnet-%E4%B8%80%E4%B8%AA%E8%BF%98%E7%9C%8B%E7%9A%84%E8%BF%87%E5%8E%BB%E7%9A%84-B-%E6%A0%91%E5%AE%9E%E7%8E%B0.html&quot;&gt;C# dotnet 一个还看的过去的 B 树实现&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%BA%E4%BD%95-987654321_123456789-%E7%9A%84%E5%80%BC%E6%98%AF-8.0000000729.html&quot;&gt;为何 987654321/123456789 的值是 8.0000000729&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;开源项目&quot;&gt;开源项目&lt;/h2&gt;

&lt;p&gt;我收藏的一些开源项目，请看 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE.html&quot;&gt;开源项目&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;开源工具&quot;&gt;开源工具&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%94%AF%E6%8C%81-dotnet-6-%E7%9A%84-dnSpy-%E7%A5%9E%E5%99%A8%E7%89%88%E6%9C%AC.html&quot;&gt;支持 dotnet 6 的 dnSpy 神器版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%8E%A8%E8%8D%90%E4%B8%80%E4%B8%AA%E5%89%AA%E8%B4%B4%E6%9D%BF%E5%86%85%E5%AE%B9%E6%9F%A5%E7%9C%8B%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 推荐一个剪贴板内容查看工具&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;开源库介绍&quot;&gt;开源库介绍&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%BA%E5%A4%A7%E5%9E%8B%E5%BA%94%E7%94%A8%E6%8E%A5%E5%85%A5-ApplicationStartupManager-%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnet 为大型应用接入 ApplicationStartupManager 启动流程框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-ConfigureAwait.Fody-%E5%BA%93%E8%AE%BE%E7%BD%AE%E9%BB%98%E8%AE%A4%E7%9A%84-await-%E5%90%8C%E6%AD%A5%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE.html&quot;&gt;dotnet 使用 ConfigureAwait.Fody 库设置默认的 await 同步上下文切换配置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SourceYard-%E5%88%B6%E4%BD%9C%E6%BA%90%E4%BB%A3%E7%A0%81%E5%8C%85.html&quot;&gt;SourceYard 制作源代码包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-MVC-%E7%9A%84%E6%96%B9%E5%BC%8F%E6%89%93%E5%BC%80-IPC-%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93.html&quot;&gt;dotnet 用 MVC 的方式打开 IPC 命名管道&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%80%E6%BA%90%E4%BA%8C%E7%BB%B4%E7%BB%98%E7%94%BB%E5%B0%8F%E5%B7%A5%E5%85%B7-GeometryToolDemo-%E9%A1%B9%E7%9B%AE.html&quot;&gt;WPF 开源二维绘画小工具 GeometryToolDemo 项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnetCampus.UITest.WPF-%E4%B8%80%E4%B8%AA%E6%94%AF%E6%8C%81%E4%B8%AD%E6%96%87%E7%94%A8%E4%BE%8B%E7%9A%84%E7%95%8C%E9%9D%A2%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6.html&quot;&gt;dotnetCampus.UITest.WPF 一个支持中文用例的界面单元测试框架&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B0%86-SVG-%E8%BD%AC-XAML-%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 将 SVG 转 XAML 的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8%E4%BA%8E%E8%BE%85%E5%8A%A9%E5%81%9A%E4%BA%8C%E5%88%86%E8%B0%83%E8%AF%95%E7%9A%84%E6%9E%84%E5%BB%BA%E6%AF%8F%E4%B8%AA-commit-%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;用于辅助做二分调试的构建每个 commit 的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%8E%A8%E8%8D%90%E4%B8%80%E4%B8%AA%E4%BD%BF%E7%94%A8-HardLink-%E7%A1%AC%E9%93%BE%E6%8E%A5%E5%87%8F%E5%B0%91%E9%87%8D%E5%A4%8D%E6%96%87%E4%BB%B6%E5%8D%A0%E7%94%A8%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;推荐一个使用 HardLink 硬链接减少重复文件占用磁盘空间的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E9%AB%98%E6%80%A7%E8%83%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E5%BA%93-dotnetCampus.Configurations-%E7%AE%80%E4%BB%8B.html&quot;&gt;dotnet C# 高性能配置文件读写库 dotnetCampus.Configurations 简介&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-FastTunnel-%E5%81%9A%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E8%BF%9C%E7%A8%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%A1%8C%E9%9D%A2%E6%9C%8D%E5%8A%A1%E5%99%A8.html&quot;&gt;使用 FastTunnel 做内网穿透远程计算机桌面服务器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/FastTunnel-%E6%90%AD%E9%85%8D-nginx-%E5%B0%86%E6%9C%AC%E5%9C%B0%E5%86%85%E7%BD%91%E7%94%B5%E8%84%91-HTTP-%E6%9C%8D%E5%8A%A1%E5%85%AC%E5%BC%80%E5%88%B0%E5%AD%90%E5%9F%9F%E5%90%8D%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE.html&quot;&gt;FastTunnel 搭配 nginx 将本地内网电脑 HTTP 服务公开到子域名公网访问&lt;/a&gt;
&lt;!-- [FastTunnel 搭配 nginx 将本地内网电脑 HTTP 服务公开到子域名公网访问 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18924838 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%8B%8F%E5%B7%9E-%E5%BC%80%E6%BA%90%E8%87%AA%E4%B8%BB%E7%9A%84-dotnet-%E7%94%9F%E6%80%81.html&quot;&gt;苏州 开源自主的 dotnet 生态&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E9%80%82%E5%90%88%E5%85%A5%E9%97%A8%E9%98%85%E8%AF%BB%E7%9A%84%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE-SeeGit-%E5%9B%BE%E5%BD%A2%E5%8C%96-Git-%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95.html&quot;&gt;WPF 适合入门阅读的开源项目 SeeGit 图形化 Git 历史记录&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%AE%A9-C-%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90-HLSL-%E4%BD%BF%E7%94%A8-DX12-%E7%9A%84-GPU-%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97%E5%BA%93-ComputeSharp-%E7%9A%84%E7%AE%80%E4%BB%8B.html&quot;&gt;dotnet 让 C# 可以通过动态生成 HLSL 使用 DX12 的 GPU 并行计算库 ComputeSharp 的简介&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-MVC-%E7%9A%84%E6%96%B9%E5%BC%8F%E6%89%93%E5%BC%80-IPC-%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93.html&quot;&gt;dotnet 用 MVC 的方式打开 IPC 命名管道&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%BC%80%E6%BA%90%E4%BA%8C%E7%BB%B4%E7%BB%98%E7%94%BB%E5%B0%8F%E5%B7%A5%E5%85%B7-GeometryToolDemo-%E9%A1%B9%E7%9B%AE.html&quot;&gt;WPF 开源二维绘画小工具 GeometryToolDemo 项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-tool-%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet tool 文件编码规范命令行工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Refasmer-%E4%BB%8E%E7%8E%B0%E6%9C%89%E7%9A%84-DLL-%E9%87%8C%E9%9D%A2%E5%AF%BC%E5%87%BA%E5%85%AC%E5%BC%80%E7%9A%84%E6%88%90%E5%91%98%E7%BB%84%E8%A3%85%E5%87%BA%E6%96%B0%E7%9A%84%E4%BB%85%E4%BD%9C%E4%B8%BA%E5%BC%95%E7%94%A8%E7%94%A8%E9%80%94%E7%9A%84%E7%A8%8B%E5%BA%8F%E9%9B%86.html&quot;&gt;dotnet 使用 Refasmer 从现有的 DLL 里面导出公开的成员组装出新的仅作为引用用途的程序集&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-Microsoft.Diagnostics.Runtime-%E5%BA%93%E5%86%99%E4%BB%A3%E7%A0%81%E8%A7%A3%E6%9E%90-DUMP-%E6%96%87%E4%BB%B6.html&quot;&gt;dotnet 用 Microsoft.Diagnostics.Runtime 库写代码解析 DUMP 文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-AsyncQueue-%E5%88%9B%E5%BB%BA%E9%AB%98%E6%80%A7%E8%83%BD%E5%86%85%E5%AD%98%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%98%9F%E5%88%97.html&quot;&gt;dotnet 使用 AsyncQueue 创建高性能内存生产者消费者队列&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-Microsoft.Recognizers.Text-%E8%B6%85%E5%BC%BA%E5%A4%A7%E7%9A%84%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%85%B3%E9%94%AE%E8%AF%8D%E6%8F%90%E5%8F%96%E5%BA%93.html&quot;&gt;dotnet Microsoft.Recognizers.Text 超强大的自然语言关键词提取库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%BB%99%E4%BB%BB%E6%84%8F%E5%AF%B9%E8%B1%A1%E9%99%84%E5%8A%A0%E4%BB%BB%E6%84%8F%E5%B1%9E%E6%80%A7%E7%9A%84%E5%BA%93.html&quot;&gt;dotnet 给任意对象附加任意属性的库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/C-%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%A7%A3%E6%9E%90%E5%B7%A5%E5%85%B7.html&quot;&gt;C＃命令行解析工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-.NET-Core-%E5%9C%A8-MAC-%E4%B8%8B%E6%8F%90%E4%BE%9B-Excel-%E7%9A%84-Power-Query-%E5%8A%9F%E8%83%BD.html&quot;&gt;使用 .NET Core 在 MAC 下提供 Excel 的 Power Query 功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-ClearScript-%E6%89%A7%E8%A1%8C-VBScript-%E5%92%8C-JS-%E4%BB%A3%E7%A0%81-%E6%97%A0%E9%9C%80%E6%B5%8F%E8%A7%88%E5%99%A8.html&quot;&gt;dotnet 使用 ClearScript 执行 VBScript 和 JS 代码 无需浏览器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-Pandoc-%E6%8A%8A-Markdown-%E8%BD%AC-Docx.html&quot;&gt;使用 Pandoc 把 Markdown 转 Docx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-System.CommandLine-%E5%86%99%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%A8%8B%E5%BA%8F.html&quot;&gt;dotnet 使用 System.CommandLine 写命令行程序&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%8E%A7%E5%88%B6%E5%8F%B0-Hangfire-%E5%90%8E%E5%8F%B0%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1.html&quot;&gt;dotnet 控制台 Hangfire 后台定时任务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Pipelines.Sockets.Unofficial-%E4%B8%80%E4%B8%AA%E7%BA%AF%E6%89%98%E7%AE%A1%E5%AE%9E%E7%8E%B0%E5%AF%B9%E6%8E%A5-System.IO.Pipelines-%E7%9A%84-Sockets-%E5%BA%93.html&quot;&gt;Pipelines.Sockets.Unofficial 一个纯托管实现对接 System.IO.Pipelines 的 Sockets 库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-C-%E4%BD%BF%E7%94%A8-FreeType-%E8%AF%BB%E5%8F%96%E5%92%8C%E7%BB%98%E5%88%B6%E5%AD%97%E4%BD%93.html&quot;&gt;dotnet C# 使用 FreeType 读取和绘制字体&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SixLabors.ImageSharp-%E5%A6%82%E4%BD%95%E8%AF%BB%E5%8F%96-IDAT-%E6%A0%A1%E9%AA%8C%E5%A4%B1%E8%B4%A5%E7%9A%84-png-%E5%9B%BE%E7%89%87.html&quot;&gt;SixLabors.ImageSharp 如何读取 IDAT 校验失败的 png 图片&lt;/a&gt;
&lt;!-- [SixLabors.ImageSharp 如何读取 IDAT 校验失败的 png 图片 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18559796 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-LatestCSharpFeatures-%E5%BA%93%E8%AE%A9%E6%97%A7%E7%89%88%E6%9C%AC-dotnet-%E6%A1%86%E6%9E%B6%E9%A1%B9%E7%9B%AE%E4%BD%BF%E7%94%A8%E6%96%B0-C-%E8%AF%AD%E6%B3%95.html&quot;&gt;使用 LatestCSharpFeatures 库让旧版本 dotnet 框架项目使用新 C# 语法&lt;/a&gt;
&lt;!-- [使用 LatestCSharpFeatures 库让旧版本 dotnet 框架项目使用新 C# 语法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18606279 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8-ICU-%E5%BA%93%E8%BF%9B%E8%A1%8C%E5%88%86%E8%AF%8D%E5%92%8C%E5%88%86%E8%A1%8C.html&quot;&gt;dotnet 简单使用 ICU 库进行分词和分行&lt;/a&gt;
&lt;!-- [dotnet 简单使用 ICU 库进行分词和分行 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18622917 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-ColorCode-%E5%81%9A%E4%BB%A3%E7%A0%81%E7%9D%80%E8%89%B2%E5%99%A8.html&quot;&gt;dotnet 使用 ColorCode 做代码着色器&lt;/a&gt;
&lt;!-- [dotnet 使用 ColorCode 做代码着色器 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18687046 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-LibGit2Sharp-%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0.html&quot;&gt;dotnet LibGit2Sharp 使用笔记&lt;/a&gt;
&lt;!-- [dotnet LibGit2Sharp 使用笔记 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18700407 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;工具&quot;&gt;工具&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%AB%98%E6%95%88%E7%8E%87%E5%B7%A5%E5%85%B7.html&quot;&gt;高效率工具&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dotnet-tool&quot;&gt;dotnet tool&lt;/h3&gt;

&lt;h4 id=&quot;制作-dotnet-工具&quot;&gt;制作 dotnet 工具&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%89%8B%E5%B7%A5%E6%89%93%E4%B8%80%E4%B8%AA-dotnet-tool-%E5%8C%85.html&quot;&gt;dotnet 手工打一个 dotnet tool 包&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%B6%E4%BD%9C%E7%9A%84-dotnet-tool-%E8%BF%90%E8%A1%8C%E5%A4%B1%E8%B4%A5%E6%8F%90%E7%A4%BA%E4%BE%9D%E8%B5%96%E7%BC%BA%E5%A4%B1.html&quot;&gt;制作的 dotnet tool 运行失败提示依赖缺失&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-tool-%E5%AE%89%E8%A3%85%E5%A4%B1%E8%B4%A5%E5%9B%A0%E4%B8%BA%E5%AF%B9%E5%BA%94%E7%9A%84%E5%BA%93%E4%B8%8D%E4%BB%85%E5%8C%85%E5%90%AB%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet tool 安装失败因为对应的库不仅包含工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-tool-%E5%B7%A5%E5%85%B7%E5%AE%89%E8%A3%85%E6%8F%90%E7%A4%BA-Could-not-find-a-part-of-the-path-%E5%AE%89%E8%A3%85%E5%A4%B1%E8%B4%A5.html&quot;&gt;dotnet tool 工具安装提示 Could not find a part of the path 安装失败&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;推荐工具&quot;&gt;推荐工具&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%80%E4%BA%9B%E5%A5%BD%E7%94%A8%E7%9A%84-dotnet-tool-%E5%B7%A5%E5%85%B7.html&quot;&gt;一些好用的 dotnet tool 工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-tool-%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet tool 文件编码规范命令行工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-tool-%E8%87%AA%E5%8A%A8%E6%89%BE%E5%88%B0%E9%A1%B9%E7%9B%AE%E9%87%8C%E9%9D%A2%E9%87%8D%E5%A4%8D%E7%9A%84-NuGet-%E4%BE%9D%E8%B5%96%E9%A1%B9.html&quot;&gt;dotnet tool 自动找到项目里面重复的 NuGet 依赖项&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-tool-%E5%88%A4%E6%96%AD%E5%8D%9A%E5%AE%A2%E6%96%87%E6%A1%A3%E9%93%BE%E6%8E%A5%E6%98%AF%E5%90%A6%E5%8F%AF%E7%94%A8%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet tool 判断博客文档链接是否可用的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%87%AA%E5%8A%A8%E8%BF%81%E7%A7%BB-VS-2017-%E4%BB%A5%E5%89%8D%E7%9A%84-csproj-%E8%BD%AC%E4%B8%BA-dotnet-core-%E7%9A%84-SDK-Style-%E9%A3%8E%E6%A0%BC%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet 自动迁移 VS 2017 以前的 csproj 转为 dotnet core 的 SDK Style 风格工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E8%8E%B7%E5%8F%96%E8%BF%9B%E7%A8%8B%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet 获取进程命令行参数的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%85%A5%E9%97%A8%E5%88%B0%E6%94%BE%E5%BC%83-%E4%BD%BF%E7%94%A8-.NET-Core-%E5%8D%B8%E8%BD%BD%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet 入门到放弃 使用 .NET Core 卸载工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-serve-%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%BC%80%E5%90%AF%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8-%E9%80%9A%E8%BF%87-HTTP-%E5%B0%86%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB%E7%BB%99%E5%85%B6%E4%BB%96%E8%AE%BE%E5%A4%87.html&quot;&gt;dotnet serve 一句话开启文件服务器 通过 HTTP 将文件共享给其他设备&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E7%94%A8-gcdump-%E8%B0%83%E8%AF%95%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%86%85%E5%AD%98%E5%8D%A0%E7%94%A8.html&quot;&gt;dotnet 用 gcdump 调试应用程序内存占用&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;开发调试工具&quot;&gt;开发调试工具&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%80%E4%BA%9B%E5%A5%BD%E7%94%A8%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7.html&quot;&gt;一些好用的开发者工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/MSBuild-%E8%BE%93%E5%87%BA%E6%97%A5%E5%BF%97%E5%8F%AF%E8%A7%86%E5%8C%96%E5%B7%A5%E5%85%B7-MSBuild-Structured-Log-Viewer-%E7%AE%80%E4%BB%8B.html&quot;&gt;MSBuild 输出日志可视化工具 MSBuild Structured Log Viewer 简介&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%A9-snoop-%E6%94%AF%E6%8C%81-.NET-Core-WPF-%E8%B0%83%E8%AF%95.html&quot;&gt;让 snoop 支持 .NET Core WPF 调试&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-Infer-%E8%87%AA%E5%8A%A8%E5%88%86%E6%9E%90%E4%BB%A3%E7%A0%81%E7%BC%BA%E9%99%B7.html&quot;&gt;dotnet 使用 Infer# 自动分析代码缺陷&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BF%AE%E5%A4%8D-SmartAssembly-%E6%B7%B7%E6%B7%86-.NET-6-%E6%97%B6%E6%8F%90%E7%A4%BA-Unable-to-load-runtime-config-file-%E5%A4%B1%E8%B4%A5.html&quot;&gt;修复 SmartAssembly 混淆 .NET 6 时提示 Unable to load runtime config file 失败&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-format-%E5%BF%BD%E7%95%A5%E7%94%9F%E6%88%90%E4%BB%A3%E7%A0%81%E7%9A%84%E6%A0%BC%E5%BC%8F%E5%8C%96.html&quot;&gt;dotnet format 忽略生成代码的格式化&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%94%AF%E6%8C%81-dotnet-6-%E7%9A%84-dnSpy-%E7%A5%9E%E5%99%A8%E7%89%88%E6%9C%AC.html&quot;&gt;支持 dotnet 6 的 dnSpy 神器版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8%E4%BA%8E%E8%BE%85%E5%8A%A9%E5%81%9A%E4%BA%8C%E5%88%86%E8%B0%83%E8%AF%95%E7%9A%84%E6%9E%84%E5%BB%BA%E6%AF%8F%E4%B8%AA-commit-%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;用于辅助做二分调试的构建每个 commit 的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-OpenXML-%E8%A7%A3%E5%8E%8B%E7%BC%A9%E6%96%87%E6%A1%A3%E4%B8%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet OpenXML 解压缩文档为文件夹工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/docfx-%E5%81%9A%E4%B8%80%E4%B8%AA%E5%92%8C%E5%BE%AE%E8%BD%AF%E4%B8%80%E6%A0%B7%E7%9A%84%E6%96%87%E6%A1%A3%E5%B9%B3%E5%8F%B0.html&quot;&gt;docfx 做一个和微软一样的文档平台&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%B0%86-SVG-%E8%BD%AC-XAML-%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;WPF 将 SVG 转 XAML 的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-SizeBench-%E5%88%86%E6%9E%90-Exe-%E6%96%87%E4%BB%B6%E4%BD%93%E7%A7%AF.html&quot;&gt;使用 SizeBench 分析 Exe 文件体积&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;resharper&quot;&gt;Resharper&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-Resharper-%E6%9B%B4%E6%94%B9%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%90%8E%E7%94%9F%E6%88%90%E6%96%87%E4%BB%B6%E5%BC%95%E7%94%A8%E6%89%BE%E4%B8%8D%E5%88%B0%E7%9A%84%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4.html&quot;&gt;WPF 使用 Resharper 更改命名空间后生成文件引用找不到的命名空间&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/resharper-%E8%B7%B3%E8%BD%AC%E5%88%B0%E6%BA%90%E4%BB%A3%E7%A0%81.html&quot;&gt;resharper 跳转到源代码&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3-VS-%E8%B7%B3%E8%BD%AC%E5%AE%9A%E4%B9%89%E5%92%8C-Resharper-%E9%87%8D%E5%A4%8D.html&quot;&gt;解决 VS 跳转定义和 Resharper 重复&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-Resharper-%E7%89%B9%E6%80%A7.html&quot;&gt;使用 Resharper 特性&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-Resharper-%E5%BF%AB%E9%80%9F%E5%81%9A%E9%80%82%E9%85%8D%E5%99%A8.html&quot;&gt;使用 Resharper 快速做适配器&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/resharper-%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BB%A3%E7%A0%81%E7%89%87.html&quot;&gt;resharper 自定义代码片&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Resharper-%E5%8E%BB%E6%8E%89%E6%B3%A8%E9%87%8A%E6%8B%BC%E5%86%99.html&quot;&gt;Resharper 去掉注释拼写&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Resharper-%E5%A6%82%E4%BD%95%E6%8A%8A%E7%B1%BB%E9%87%8C%E7%9A%84%E7%B1%BB%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6.html&quot;&gt;Resharper 如何把类里的类移动到其他文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ReSharper-%E6%98%BE%E7%A4%BA%E4%BD%BF%E7%94%A8%E7%9A%84%E9%A2%9C%E8%89%B2.html&quot;&gt;ReSharper 显示使用的颜色&lt;/a&gt;
&lt;!-- [ReSharper 显示使用的颜色 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18178845 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/ReSharper-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%9C%A8-Directory.Build.props-%E5%B1%9E%E6%80%A7%E6%B1%82%E5%80%BC%E7%BB%93%E6%9E%9C%E4%B8%8D%E8%83%BD%E5%BA%94%E7%94%A8%E5%88%B0%E9%A1%B9%E7%9B%AE%E9%87%8C.html&quot;&gt;ReSharper 已知问题 在 Directory.Build.props 属性求值结果不能应用到项目里&lt;/a&gt;
&lt;!-- [ReSharper 已知问题 在 Directory.Build.props 属性求值结果不能应用到项目里 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18921496 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;sublime-text&quot;&gt;Sublime Text&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Sublime-Text-%E5%AE%89%E8%A3%85%E4%B8%AD%E6%96%87-%E8%8B%B1%E6%96%87%E5%AD%97%E4%BD%93.html&quot;&gt;Sublime Text 安装中文、英文字体&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Sublime-Text-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6.html&quot;&gt;Sublime Text 好用的插件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/sublime-Text-%E6%AD%A3%E5%88%99%E6%9B%BF%E6%8D%A2.html&quot;&gt;sublime Text 正则替换&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%B7%BB%E5%8A%A0%E5%8F%B3%E9%94%AE%E4%BD%BF%E7%94%A8-SublimeText-%E6%89%93%E5%BC%80.html&quot;&gt;添加右键使用 SublimeText 打开&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E6%B7%BB%E5%8A%A0-SublimeText-%E7%BC%96%E8%AF%91%E6%8F%92%E4%BB%B6.html&quot;&gt;dotnet core 添加 SublimeText 编译插件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-SublimeText-%E4%BD%BF%E7%94%A8-dotnet-%E7%BC%96%E8%AF%91-C-%E9%A1%B9%E7%9B%AE.html&quot;&gt;在 SublimeText 使用 dotnet 编译 C# 项目&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SublimeText-%E5%BF%AB%E9%80%9F%E6%89%93%E5%BC%80%E5%BD%93%E5%89%8D%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;SublimeText 快速打开当前文件的文件夹&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SublimeText-%E7%B2%98%E8%B4%B4%E5%9B%BE%E7%89%87%E4%BF%9D%E5%AD%98%E5%88%B0%E6%9C%AC%E5%9C%B0.html&quot;&gt;SublimeText 粘贴图片保存到本地&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/SublimeText-%E9%85%8D%E7%BD%AE%E8%B7%B3%E8%BD%AC%E5%9B%9E%E4%B8%8A%E4%B8%AA%E5%85%89%E6%A0%87%E5%9D%90%E6%A0%87.html&quot;&gt;SublimeText 配置跳转回上个光标坐标&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%85%B3%E9%97%AD-SublimeText-3.2.2-Build-3211-%E7%9A%84%E6%8B%BC%E5%86%99%E6%A3%80%E6%9F%A5.html&quot;&gt;关闭 SublimeText 3.2.2 Build 3211 的拼写检查&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;git&quot;&gt;GIT&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%841000%E4%B8%AA%E9%97%AE%E9%A2%98.html&quot;&gt;git 需要知道的1000个问题&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E9%80%9A%E8%BF%87-SublimeMerge-%E5%A4%84%E7%90%86%E5%86%B2%E7%AA%81.html&quot;&gt;git 通过 SublimeMerge 处理冲突&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E4%B8%8A%E4%BC%A0%E5%BD%93%E5%89%8D%E5%88%86%E6%94%AF.html&quot;&gt;git 上传当前分支&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E7%BB%9F%E8%AE%A1%E4%B8%A4%E4%B8%AA-commit-%E4%B9%8B%E9%97%B4%E7%9B%B8%E5%B7%AE%E7%9A%84%E6%AC%A1%E6%95%B0.html&quot;&gt;git 统计两个 commit 之间相差的次数&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%9B%B4%E6%96%B0%E6%9C%AC%E5%9C%B0%E6%89%80%E6%9C%89-Git-%E4%BB%93%E5%BA%93%E7%9A%84%E5%B7%A5%E5%85%B7.html&quot;&gt;dotnet 更新本地所有 Git 仓库的工具&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E6%89%80%E6%9C%89-Git-%E4%BB%93%E5%BA%93.html&quot;&gt;自动更新所有 Git 仓库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E9%94%99%E8%AF%AF%E6%8F%90%E4%BA%A4%E7%9A%84-git-%E5%A4%A7%E6%96%87%E4%BB%B6.html&quot;&gt;如何删除错误提交的 git 大文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E4%BB%93%E5%BA%93.html&quot;&gt;git 合并两个仓库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git%E6%97%A0%E6%B3%95pull%E4%BB%93%E5%BA%93refusing-to-merge-unrelated-histories.html&quot;&gt;git无法pull仓库refusing to merge unrelated histories&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E4%BF%AE%E6%94%B9commit%E6%97%A5%E6%9C%9F%E4%B8%BA%E4%B9%8B%E5%89%8D%E7%9A%84%E6%97%A5%E6%9C%9F.html&quot;&gt;git 修改commit日期为之前的日期&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93.html&quot;&gt;git镜像仓库&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E5%88%86%E6%94%AF%E6%94%B9%E5%90%8D.html&quot;&gt;git 分支改名&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E6%8F%90%E4%BA%A4%E6%B7%BB%E5%8A%A0-emoij-%E6%96%87%E5%AD%97.html&quot;&gt;git 提交添加 emoij 文字&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-push-%E9%94%99%E8%AF%AF-hook-declined.html&quot;&gt;git push 错误 hook declined &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-rebase-%E5%90%88%E5%B9%B6%E5%A4%9A%E4%B8%AA%E6%8F%90%E4%BA%A4.html&quot;&gt;git rebase 合并多个提交&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-cannot-lock-ref.html&quot;&gt;git cannot lock ref&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/git-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%B0%83%E7%94%A8-git-%E6%97%B6%E5%8F%AF%E8%83%BD%E5%AD%98%E5%9C%A8%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E6%8A%95%E6%AF%92%E9%97%AE%E9%A2%98.html&quot;&gt;git 已知问题 命令行调用 git 时可能存在环境变量投毒问题&lt;/a&gt;
&lt;!-- [git 已知问题 命令行调用 git 时可能存在环境变量投毒问题 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18773226 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/3%E5%88%86%E9%92%9F%E6%95%99%E4%BD%A0%E6%90%AD%E5%BB%BA-gitea-%E5%9C%A8-Centos-%E6%9C%8D%E5%8A%A1%E5%99%A8.html&quot;&gt;3分钟教你搭建 gitea 在 Centos 服务器&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;azure&quot;&gt;Azure&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Azure-%E6%97%A0%E6%9C%8D%E5%8A%A1%E5%99%A8-Function-%E5%87%BD%E6%95%B0%E8%AE%A1%E7%AE%97%E6%9C%8D%E5%8A%A1-dotnet-core-3.1-%E5%88%9B%E5%BB%BA%E5%92%8C%E9%83%A8%E7%BD%B2%E5%85%A5%E9%97%A8.html&quot;&gt;Azure 无服务器 Function 函数计算服务 dotnet core 3.1 创建和部署入门&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Azure-%E5%87%BD%E6%95%B0%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2%E5%A4%B1%E8%B4%A5-%E5%9B%A0%E4%B8%BA%E5%87%BD%E6%95%B0%E5%BA%94%E7%94%A8%E8%AE%BE%E7%BD%AE-v3-%E4%BD%86%E4%B8%BB%E6%9C%BA%E6%98%AF-v2-%E7%89%88%E6%9C%AC.html&quot;&gt;Azure 函数服务部署失败 因为函数应用设置 v3 但主机是 v2 版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%9F%BA%E4%BA%8E-Azure-%E7%9A%84%E8%AE%A4%E7%9F%A5%E6%9C%8D%E5%8A%A1-%E6%83%85%E7%BB%AA%E5%88%86%E6%9E%90-%E8%AF%AD%E8%A8%80%E6%A3%80%E6%B5%8B-%E5%85%B3%E9%94%AE%E7%9F%AD%E8%AF%AD%E6%8F%90%E5%8F%96.html&quot;&gt;WPF 基于 Azure 的认知服务 情绪分析 语言检测 关键短语提取&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;docker&quot;&gt;Docker&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E6%89%A7%E8%A1%8C-docker-%E5%AE%B9%E5%99%A8-error-MSB4018-CreateAppHost-%E4%BB%BB%E5%8A%A1%E6%84%8F%E5%A4%96%E5%A4%B1%E8%B4%A5%E5%8F%AF%E8%83%BD%E5%8E%9F%E5%9B%A0.html&quot;&gt;dotnet 执行 docker 容器 error MSB4018 CreateAppHost 任务意外失败可能原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%9F%BA%E4%BA%8E-debian-%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA-docker-%E7%9A%84-sdk-%E9%95%9C%E5%83%8F.html&quot;&gt;dotnet 基于 debian 创建一个 docker 的 sdk 镜像&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E5%88%B6%E4%BD%9C-docker-%E6%8F%90%E7%A4%BA-Insufficient-space-in-download-directory-%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4%E4%B8%8D%E8%B6%B3.html&quot;&gt;dotnet 制作 docker 提示 Insufficient space in download directory 磁盘空间不足&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-windows-%E4%B8%8A%E8%BF%90%E8%A1%8C%E7%9A%84-podman-%E9%BB%98%E8%AE%A4%E7%9A%84%E6%8C%82%E8%BD%BD%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E6%98%AF%E4%BB%80%E4%B9%88.html&quot;&gt;在 windows 上运行的 podman 默认的挂载相对路径是什么&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%88%B6%E4%BD%9C%E4%B8%80%E4%B8%AA%E8%83%BD%E6%9E%84%E5%BB%BA-dotnet-AOT-%E7%9A%84-gitlab-ruuner-%E7%9A%84-Debian-docker-%E9%95%9C%E5%83%8F.html&quot;&gt;制作一个能构建 dotnet AOT 的 gitlab ruuner 的 Debian docker 镜像&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E4%B8%8A%E9%AB%98%E6%95%88%E5%BC%80%E5%8F%91%E4%B8%8E%E8%B0%83%E8%AF%95-docker-%E5%AE%B9%E5%99%A8%E5%86%85-dotnet-%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%96%B9%E6%A1%88.html&quot;&gt;Windows 上高效开发与调试 docker 容器内 dotnet 程序的方案&lt;/a&gt;
&lt;!-- [Windows 上高效开发与调试 docker 容器内 dotnet 程序的方案 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20057057 ) --&gt;&lt;/p&gt;

&lt;h3 id=&quot;total-commander&quot;&gt;Total Commander&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Total-Commander-%E6%98%BE%E7%A4%BA%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%96%87%E4%BB%B6%E5%90%8D%E6%89%A9%E5%B1%95.html&quot;&gt;Total Commander 显示文件包含文件名扩展&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Total-Commander-%E4%BD%BF%E7%94%A8-mklink-%E5%BB%BA%E7%AB%8B%E6%96%87%E4%BB%B6%E5%A4%B9%E9%93%BE%E6%8E%A5-%E5%B0%86-C-%E7%9B%98%E6%96%87%E4%BB%B6%E8%BF%81%E7%A7%BB%E5%88%B0%E5%85%B6%E4%BB%96%E7%9B%98.html&quot;&gt;Total Commander 使用 mklink 建立文件夹链接 将 C 盘文件迁移到其他盘&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;powershell&quot;&gt;PowerShell&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1.html&quot;&gt;PowerShell 通过 WMI 获取系统服务&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6.html&quot;&gt;PowerShell 通过 WMI 获取系统安装软件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF.html&quot;&gt;PowerShell 通过 WMI 获取系统信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E4%BD%BF%E7%94%A8-WMI-%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF.html&quot;&gt;PowerShell 使用 WMI 获取信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E7%9A%84%E9%A9%B1%E5%8A%A8.html&quot;&gt;PowerShell 通过 WMI 获取系统安装的驱动&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E8%AE%BE%E5%A4%87%E5%8E%82%E5%95%86.html&quot;&gt;PowerShell 通过 WMI 获取设备厂商&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E9%80%9A%E8%BF%87-WMI-%E8%8E%B7%E5%8F%96%E8%A1%A5%E4%B8%81.html&quot;&gt;PowerShell 通过 WMI 获取补丁&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E6%8B%BF%E5%88%B0%E6%98%BE%E5%8D%A1%E4%BF%A1%E6%81%AF.html&quot;&gt;PowerShell 拿到显卡信息&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E5%AE%9E%E7%8E%B0-curl-%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D%E5%92%8C%E5%AF%86%E7%A0%81%E9%80%BB%E8%BE%91.html&quot;&gt;PowerShell 实现 curl 的用户名和密码逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-core-%E4%BD%BF%E7%94%A8-PowerShell-%E8%84%9A%E6%9C%AC.html&quot;&gt;dotnet core 使用 PowerShell 脚本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/PowerShell-%E6%8B%BF%E5%88%B0%E6%9C%80%E8%BF%91%E7%9A%8410%E4%B8%AA%E7%B3%BB%E7%BB%9F%E6%97%A5%E5%BF%97.html&quot;&gt;PowerShell 拿到最近的10个系统日志&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;bat&quot;&gt;BAT&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/BAT-%E8%84%9A%E6%9C%AC%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8D%E7%B3%BB%E7%BB%9F%E6%98%AF-x86-%E8%BF%98%E6%98%AF-x64-%E7%B3%BB%E7%BB%9F.html&quot;&gt;BAT 脚本判断当前系统是 x86 还是 x64 系统&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%80%9A%E8%BF%87-cmd-%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E5%B0%86-16-%E8%BF%9B%E5%88%B6%E8%BD%AC-10-%E8%BF%9B%E5%88%B6%E6%95%B0%E5%AD%97.html&quot;&gt;通过 cmd 批处理文件将 16 进制转 10 进制数字&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%9C%A8-CMD-%E5%90%AF%E5%8A%A8%E7%9A%84%E8%BD%AF%E4%BB%B6%E4%BC%A0%E5%85%A5%E5%B8%A6%E7%A9%BA%E6%A0%BC%E7%9A%84%E8%B7%AF%E5%BE%84.html&quot;&gt;如何在 CMD 启动的软件传入带空格的路径&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/cmd-%E5%A6%82%E4%BD%95%E8%B7%A8%E9%A9%B1%E5%8A%A8%E5%99%A8%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6%E5%A4%B9.html&quot;&gt;cmd 如何跨驱动器移动文件夹&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;latex&quot;&gt;Latex&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Latex-%E8%AE%BA%E6%96%87elsevier-%E6%89%8B%E6%8A%8A%E6%89%8B%E5%A6%82%E4%BD%95%E7%94%A8Latex%E5%86%99%E8%AE%BA%E6%96%87.html&quot;&gt;Latex 论文elsevier，手把手如何用Latex写论文&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Latex-%E5%85%AC%E5%BC%8F%E9%80%9F%E6%9F%A5.html&quot;&gt;Latex 公式速查&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/Latex-%E5%8E%BB%E6%8E%89%E8%A1%8C%E5%8F%B7.html&quot;&gt;Latex 去掉行号&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;希沃白板&quot;&gt;希沃白板&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%B8%8C%E6%B2%83%E7%99%BD%E6%9D%BF%E5%A6%82%E4%BD%95%E5%9C%A8%E5%85%AC%E5%BC%8F%E9%87%8C%E9%9D%A2%E8%BE%93%E5%85%A5%E7%BB%9D%E5%AF%B9%E5%80%BC%E7%AC%A6%E5%8F%B7.html&quot;&gt;希沃白板如何在公式里面输入绝对值符号&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%8B%BC%E9%9F%B3%E8%BE%93%E5%85%A5%E6%B3%95-%E5%BF%AB%E9%80%9F%E8%BE%93%E5%85%A5%E5%B8%A6%E9%9F%B3%E8%B0%83%E7%9A%84%E5%AD%97%E7%AC%A6.html&quot;&gt;拼音输入法 快速输入带音调的字符&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%B8%8C%E6%B2%83%E7%99%BD%E6%9D%BF%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E6%89%8B%E6%9C%BA%E7%AB%AF%E6%92%AD%E6%94%BE%E8%AF%BE%E4%BB%B6%E5%86%85%E8%A7%86%E9%A2%91%E5%87%BA%E7%8E%B0%E9%BB%91%E5%B1%8F%E9%97%AA%E9%80%80.html&quot;&gt;希沃白板如何解决手机端播放课件内视频出现黑屏闪退&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%B8%8C%E6%B2%83%E7%99%BD%E6%9D%BF%E6%96%AD%E7%BD%91%E7%8E%AF%E5%A2%83%E5%85%8D%E7%99%BB%E9%99%86%E7%BC%96%E8%BE%91%E8%AF%BE%E4%BB%B6.html&quot;&gt;希沃白板断网环境免登陆编辑课件&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;jekyll&quot;&gt;jekyll&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-windows-%E5%AE%89%E8%A3%85-Jekyll.html&quot;&gt;在 windows 安装 Jekyll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/jekyll-%E5%9C%A8%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E6%B5%81%E7%A8%8B%E5%9B%BE.html&quot;&gt;jekyll 在博客添加流程图&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/jekyll-%E5%A6%82%E4%BD%95%E5%8A%A0%E5%AF%86%E5%8D%9A%E5%AE%A2-%E9%98%B2%E6%AD%A2%E6%8A%93%E5%8F%96.html&quot;&gt;jekyll 如何加密博客 防止抓取&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/jekyll-%E6%B7%BB%E5%8A%A0-Valine-%E8%AF%84%E8%AE%BA.html&quot;&gt;jekyll 添加 Valine 评论&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;其他工具&quot;&gt;其他工具&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%A9-AE-%E8%BE%93%E5%87%BA-MPEG.html&quot;&gt;让 AE 输出 MPEG &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/MobaXterm-%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86.html&quot;&gt;MobaXterm 使用代理&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/matlab-%E7%94%BB%E5%9B%BE.html&quot;&gt;matlab 画图&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-ahk-%E8%AE%A9%E6%99%AE%E9%80%9A%E9%94%AE%E7%9B%98%E5%8F%98%E4%B8%BADvorak%E9%94%AE%E7%9B%98.html&quot;&gt;使用 ahk 让普通键盘变为Dvorak键盘&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/AutoHotKey-%E7%94%A8%E6%89%93%E7%A0%81%E7%9A%84%E5%BF%AB%E6%8D%B7%E9%94%AE.html&quot;&gt;AutoHotKey 用打码的快捷键&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BD%BF%E7%94%A8-RetroShare-%E5%88%86%E4%BA%AB%E8%B5%84%E6%BA%90.html&quot;&gt;使用 RetroShare 分享资源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-Telegram.html&quot;&gt;如何使用 Telegram&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85-btsync.html&quot;&gt;如何安装 btsync&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%89%E8%A3%85-aria2.html&quot;&gt;安装 aria2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%89%E8%A3%85-pip.html&quot;&gt;安装 pip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%80%9A%E8%BF%87-frp-%E5%BC%80%E5%90%AF%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%89%93%E5%BC%80%E6%9C%AC%E5%9C%B0%E7%9A%84-ZeroNet-%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE.html&quot;&gt;通过 frp 开启服务器打开本地的 ZeroNet 服务器外网访问&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%B4%A1%E7%8C%AE%E8%87%AA%E5%B7%B1%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BAtor%E4%B8%AD%E8%BD%AC.html&quot;&gt;贡献自己的服务器搭建tor中转&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%BD%BF%E7%94%A8%E5%BE%AE%E4%BF%A1.html&quot;&gt;通过命令行使用微信&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%A7%A3%E5%86%B3-BT-%E5%B7%A5%E5%85%B7%E8%BF%9E%E6%8E%A5%E6%95%B0%E8%BF%87%E5%A4%9A%E5%AF%BC%E8%87%B4%E6%97%A0%E7%BD%91%E9%80%9F%E9%97%AE%E9%A2%98.html&quot;&gt;解决 BT 工具连接数过多导致无网速问题&lt;/a&gt;
&lt;!-- [解决 BT 工具连接数过多导致无网速问题 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18813929 ) --&gt;&lt;/p&gt;

&lt;h2 id=&quot;杂项-1&quot;&gt;杂项&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E5%9F%BA%E4%BA%8E-VR-%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C%E5%BC%80%E5%B1%95%E8%99%9A%E6%8B%9F%E8%B5%84%E4%BA%A7%E7%9A%84%E7%8E%A9%E6%B3%95.html&quot;&gt;非技术 基于 VR 虚拟世界开展虚拟资产的玩法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E6%8A%80%E8%83%BD%E7%9F%A5%E8%AF%86%E5%92%8C%E8%B5%84%E8%AE%AF.html&quot;&gt;非技术 技能知识和资讯&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B2%E4%B8%8E%E7%94%B5%E4%BF%A1%E8%A1%8C%E4%B8%9A%E7%9A%84%E5%8F%91%E5%B1%95.html&quot;&gt;非技术 在线教育与电信行业的发展&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E5%81%9A%E4%BA%8B%E6%83%85%E7%9A%84%E6%80%A5%E5%92%8C%E5%BF%AB%E7%9A%84%E5%B7%AE%E5%88%AB.html&quot;&gt;非技术 做事情的急和快的差别&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E7%A7%9F%E8%81%98%E4%BA%BA%E5%BD%A2%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%9A%84%E6%83%B3%E6%B3%95.html&quot;&gt;非技术 租聘人形机器人的想法&lt;/a&gt;
&lt;!-- [非技术 租聘人形机器人的想法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19631308 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E7%BA%B3%E7%B1%B3%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%9A%84%E6%83%B3%E6%B3%95.html&quot;&gt;非技术 纳米机器人的想法&lt;/a&gt;
&lt;!-- [非技术 纳米机器人的想法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19631309 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E5%A4%A9%E5%AE%AB%E8%AE%A1%E5%88%92-%E6%8F%90%E9%AB%98%E7%BB%8F%E6%B5%8E.html&quot;&gt;非技术 天宫计划 提高经济&lt;/a&gt;
&lt;!-- [非技术 天宫计划 提高经济 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/19631310 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%9D%9E%E6%8A%80%E6%9C%AF-%E4%BA%A7%E5%93%81%E5%B9%BB%E6%83%B3-%E8%B5%B7%E5%B1%85%E5%BD%95%E6%99%BA%E8%83%BD%E8%AE%B0%E5%BD%95%E4%BA%A7%E5%93%81.html&quot;&gt;非技术 产品幻想 起居录智能记录产品&lt;/a&gt;
&lt;!-- [非技术 产品幻想 起居录智能记录产品 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20129293 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/lindexi/p/17679583.html&quot;&gt;非技术 对以后各大应用功能与 AI 助手的思考 - lindexi - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/AI-%E6%97%B6%E4%BB%A3%E7%9A%84%E8%AE%BE%E5%A4%87%E6%89%80%E8%A7%81%E5%8D%B3%E7%94%A8.html&quot;&gt;AI 时代的设备所见即用&lt;/a&gt;
&lt;!-- [AI 时代的设备所见即用 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/20943982 ) --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BD%93%E6%83%B3%E6%B3%95%E6%88%90%E4%B8%BA%E6%9C%80%E5%A5%BD%E7%9A%84%E5%AF%BC%E6%BC%94.html&quot;&gt;当想法成为最好的导演&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E9%80%97%E6%AF%94%E9%9D%A2%E8%AF%95%E5%AE%98%E6%88%90%E9%95%BF%E8%B7%AF%E7%BA%BF-%E5%A6%82%E4%BD%95%E8%AE%A9%E8%A2%AB%E9%9D%A2%E8%AF%95%E8%80%85%E8%A7%89%E5%BE%97%E7%B3%9F%E5%BF%83.html&quot;&gt;逗比面试官成长路线 如何让被面试者觉得糟心&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B2%E5%B8%88%E5%9F%B9%E8%AE%AD-%E5%A4%9A%E7%B1%B3%E8%AF%BA%E5%8E%9F%E5%88%99.html&quot;&gt;讲师培训 多米诺原则&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A8%8B%E5%BA%8F%E5%91%98%E7%AC%91%E8%AF%9D.html&quot;&gt;程序员笑话&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%A3%81%E7%BA%B8.html&quot;&gt;程序员壁纸&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BE%AE%E8%BD%AF%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F.html&quot;&gt;微软技术支持联系方式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BE%AE%E8%BD%AF%E6%9C%80%E5%85%B7%E4%BB%B7%E5%80%BC%E4%B8%93%E5%AE%B6-MVP-%E5%A6%82%E4%BD%95%E8%8E%B7%E5%BE%97-Resharper-%E7%9A%84%E5%85%8D%E8%B4%B9%E5%8A%9F%E8%83%BD.html&quot;&gt;微软最具价值专家 MVP 如何获得 Resharper 的免费功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8-sim-%E5%8D%A1%E5%8A%A0%E5%AF%86%E4%BF%9D%E6%8A%A4%E8%B5%84%E9%87%91.html&quot;&gt;用 sim 卡加密保护资金&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%89%E8%A3%85-wordpress-%E5%87%BA%E7%8E%B0-%E6%8A%B1%E6%AD%89-%E6%88%91%E4%B8%8D%E8%83%BD%E5%86%99%E5%85%A5wp-config.php%E6%96%87%E4%BB%B6.html&quot;&gt;安装 wordpress 出现 抱歉，我不能写入wp-config.php文件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%86%99%E6%AF%95%E4%B8%9A%E8%AE%BA%E6%96%87-%E8%A1%A8%E6%A0%BC.html&quot;&gt;如何写毕业论文 表格&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%80%E7%B2%92%E5%9C%A8%E6%97%B6%E7%A9%BA%E8%BD%AE%E5%9B%9E%E7%9A%84%E7%B2%92%E5%AD%90%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88.html&quot;&gt;一粒在时空轮回的粒子会发生什么&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98.html&quot;&gt;一个好的程序员&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A0%B4%E8%A7%A3360doc%E5%A4%8D%E5%88%B6.html&quot;&gt;破解360doc复制&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BA%91%E4%B9%8B%E5%B9%BB-UWP-%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.html&quot;&gt;云之幻 UWP 视频教程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BE%AE%E8%BD%AF%E6%A1%86%E6%9E%B6%E4%B8%8B%E8%BD%BD.html&quot;&gt;微软框架下载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%A1%AC%E4%BB%B6%E5%88%86%E9%85%8D.html&quot;&gt;硬件分配&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%87%AA%E5%8A%A8%E6%9C%BA.html&quot;&gt;自动机&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8%E8%87%AA%E5%8A%A8%E6%9C%BA%E7%9A%84%E6%80%9D%E6%83%B3%E8%AF%B4%E6%98%8E%E5%85%89%E9%80%9F.html&quot;&gt;用自动机的思想说明光速&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93.html&quot;&gt;文件传输&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E5%AD%98%E5%82%A8%E5%92%8C%E5%A4%87%E4%BB%BD.html&quot;&gt;大文件的存储和备份&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BB%A3%E7%A0%81%E6%AE%B5.html&quot;&gt;代码段&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%BA%8C%E9%98%B6%E7%86%B5.html&quot;&gt;二阶熵&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/2019-%E5%BE%B7%E7%86%99-%E8%85%BE%E8%AE%AF%E4%BA%91-%E4%BA%91%E7%A4%BE%E5%8C%BA%E5%B9%B4%E5%BA%A6%E6%9C%80%E4%BD%B3%E4%BD%9C%E8%80%85%E5%A5%96.html&quot;&gt;2019 德熙 腾讯云 云社区年度最佳作者奖&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%8A%E6%B5%B7%E5%B1%95%E7%9B%9F%E7%BD%91%E7%BB%9C%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E7%9A%84-gamebox-%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%85%A5%E8%BF%9B%E7%A8%8B%E5%AF%BC%E8%87%B4%E8%BD%AF%E4%BB%B6%E5%B4%A9%E6%BA%83.html&quot;&gt;上海展盟网络科技有限公司的 gamebox 组件注入进程导致软件崩溃&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%AE%B0%E8%81%94%E8%BD%AF-UniAccess-%E5%AF%BC%E8%87%B4-NSIS-%E5%AE%89%E8%A3%85%E5%8C%85%E5%90%AF%E5%8A%A8%E8%BF%9B%E7%A8%8B%E5%A4%B1%E6%95%88.html&quot;&gt;记联软 UniAccess 导致 NSIS 安装包启动进程失效&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E4%B8%AD%E5%9B%BD%E6%9C%80%E6%96%B0%E6%89%8B%E6%9C%BA%E5%8F%B7%E6%AE%B5%E5%88%92%E5%88%86%E6%83%85%E5%86%B5.html&quot;&gt;中国最新手机号段划分情况&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E7%94%A8%E8%87%AA%E5%8A%A8%E6%9C%BA%E7%9A%84%E6%80%9D%E6%83%B3%E8%AF%B4%E6%98%8E%E6%97%B6%E9%97%B4%E6%96%AD%E7%89%87%E6%98%AF%E6%97%A0%E6%B3%95%E6%84%9F%E7%9F%A5%E7%9A%84.html&quot;&gt;用自动机的思想说明时间断片是无法感知的&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%B8%96%E7%95%8C%E7%8C%9C%E6%B5%8B-%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%9A%84%E5%B0%8F%E6%B5%8B%E8%AF%95.html&quot;&gt;dotnet 世界猜测 随机数的小测试&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;p2p-下载&quot;&gt;P2P 下载&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%BE%AE%E8%BD%AF%E7%9A%84-P2P-%E4%B8%8B%E8%BD%BD%E6%96%B9%E5%BC%8F.html&quot;&gt;微软的 P2P 下载方式&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%AE%8C%E6%95%B4%E7%9A%84-P2P-%E5%BA%94%E7%94%A8%E9%9C%80%E8%A6%81%E5%8C%85%E5%90%AB%E5%93%AA%E4%BA%9B%E5%8A%9F%E8%83%BD.html&quot;&gt;完整的 P2P 应用需要包含哪些功能&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E5%9C%A8-P2P-%E6%96%87%E4%BB%B6%E5%88%86%E4%BA%AB%E5%BA%94%E7%94%A8%E4%BB%A5%E6%96%87%E4%BB%B6%E6%88%96%E6%96%87%E4%BB%B6%E6%AE%B5%E4%B8%BA%E5%8D%95%E4%BD%8D%E7%9A%84%E4%BC%98%E7%BC%BA.html&quot;&gt;在 P2P 文件分享应用以文件或文件段为单位的优缺&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;考古&quot;&gt;考古&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://hadibrais.wordpress.com/2020/04/02/the-intel-x86-microarchitectures-map/&quot;&gt;英特尔 x86 微架构图考古贴 The Intel x86 Microarchitectures Map - Micromysteries&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.lindexi.com/post/%E8%80%83%E5%8F%A4-ISO-639-%E6%A0%87%E5%87%86-1988-%E5%92%8C-1989-%E7%89%88%E7%9A%84%E5%8F%98%E6%9B%B4.html&quot;&gt;考古 ISO 639 标准 1988 和 1989 版的变更&lt;/a&gt;
&lt;!-- [考古 ISO 639 标准 1988 和 1989 版的变更 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18869180 ) --&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 29 Aug 2026 07:03:43 +0000</pubDate>
        <link>https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html</guid>
        
        
      </item>
    
      <item>
        <title>Latex 论文elsevier，手把手如何用Latex写论文</title>
        <description>&lt;p&gt;这几天在开始写论文，准备发的是elsevier，这个网站的instruction有问题，下载的东西基本上好多的错误，所以我就写博客记录。&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2019/2/13 10:38:20 --&gt;

&lt;div id=&quot;toc&quot;&gt;&lt;/div&gt;
&lt;!-- 标签：Latex --&gt;

&lt;p&gt;关于使用 Latex 的好处请看&lt;a href=&quot;https://blog.csdn.net/jiafgn/article/details/73065589&quot;&gt;使用LaTeX写论文 - CSDN博客&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在开始的时候需要先安装工具&lt;/p&gt;

&lt;h2 id=&quot;下载&quot;&gt;下载&lt;/h2&gt;

&lt;p&gt;这里需要我们先安装 Latex ，我安装的是 Ctex 安装地址是 &lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/ctex/legacy/2.9/&quot;&gt;CTEX&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我这里下载的是 CTeX_2.9.2.164.exe 如果没法使用请和我说：&lt;a href=&quot;mailto:lindexi_gd@163.com&quot;&gt;lindexi_gd@163.com&lt;/a&gt;&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文0.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121625500&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;本文还需要下载 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;basic-miktex-2.9.6069-x64&lt;/code&gt; 工具，可以到 &lt;a href=&quot;http://miktex.org/&quot;&gt;http://miktex.org/&lt;/a&gt; 下载，或者在本文最后点击我的网盘下载。如果不能下载请和我说。&lt;/p&gt;

&lt;p&gt;我们首先安装Ctex，一路下一步，注意可以安装到D盘，不一定需要C盘。&lt;/p&gt;

&lt;h2 id=&quot;安装&quot;&gt;安装&lt;/h2&gt;

&lt;p&gt;先安装 Ctex 双击打开安装包&lt;/p&gt;

&lt;h3 id=&quot;安装-ctex-详细步骤&quot;&gt;安装 Ctex 详细步骤&lt;/h3&gt;

&lt;p&gt;如果你是比较熟悉安装软件的大神，请跳过本章&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;选择语言&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文1.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831211343923&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;点击下一步，可以看到下面很多时候我都说下一步&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文2.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831211415999&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;接受协议&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文3.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831211435516&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;选择功能，点击下一步&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文4.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121153371&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;选择安装文件夹，这个文件夹可以不放在 C 盘，如果自己的 C 盘空间不大&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文5.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121165538&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;点击安装之后点击下一步&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文11.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121223195&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;安装-basic-miktex&quot;&gt;安装 basic-miktex&lt;/h3&gt;

&lt;p&gt;双击 basic-miktex-2.9.6069-x64 打开，请注意在这一步的时候需要保证你的系统是 x64 的系统，如何判断当前的系统是 x86 的还是 x64 的系统，请看下面方法&lt;/p&gt;

&lt;p&gt;如果是 windows 10 系统，通过右击 此电脑 属性，可以看到系统类型是 x86 还是 x64 的&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文40.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201921310313513&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果是 windows 7 系统，通过右击 计算机 属性，可以看到是什么系统&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文41.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2019213103126688&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果看到你的设备显示的是 32 位的系统，请下载 &lt;a href=&quot;https://miktex.org/download/ctan/systems/win32/miktex/setup/windows-x86/basic-miktex-2.9.6942.exe&quot;&gt;basic-miktex-2.9.6942.exe&lt;/a&gt; 版本，安装方法和 x64 相同请看下面&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;同意协议点击下一步&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文6.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831211838889&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;选择给所有用户，点击下一步&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文7.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121199443&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;选择文件夹，这个文件很大，可以选择在其他文件夹，需要记住这个文件夹，因为在下面需要用到&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文8.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831211947190&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;点击下一步&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文9.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831212039174&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;点击开始安装&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文10.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831212135192&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;点击关闭&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文12.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831212231158&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;现在就可以从开始菜单打开 WinEdt 和 TeXworks 但是我比较喜欢使用 TexStudio 这个软件安装比较简单。&lt;/p&gt;

&lt;p&gt;如果在使用 WinEdt 编译的过程出现下面的问题，就请按照下面的步骤解决&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;CTeX 系统找不到指定的文件&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;在 Options 的 Execution Modes 打开&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文13.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121274393&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;点击 Tex System 可以看到 MiKTeX 的路径，需要看一下这些路径是否正确，确定的方法是通过搜索 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MiKTeX 2.9&lt;/code&gt; 的安装文件夹的方式&lt;/p&gt;

&lt;p&gt;也就是刚才的 basic-miktex-2.9.6069-x64 安装选择第3步的文件夹&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文14.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831212947969&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=cbd5295a82030a015ea0a318299d1b4e) --&gt;

&lt;p&gt;修改完成就点击确定这样就可以。&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=9e6cf40a898f22bda6a8ebd342644c23)

看到CTEX的MikTex不存在Bin，那么需要安装miktex，这个安装必须在C盘，默认位置，记住**C盘**

安装完，我们可以安装TeXStudio，这个软件做的很好，看下界面

![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=471b24d1b321541a9cb98d5081c57c20)

是不是感觉比WinEdt好，如果感觉好的话，那么就去下载，可以到官网[www.texstudio.org](www.texstudio.org)如果上不了就在我这里下。 --&gt;

&lt;h2 id=&quot;打开模板&quot;&gt;打开模板&lt;/h2&gt;

&lt;p&gt;我们开始使用艾斯维尔官方的模板，官方下载位置 &lt;a href=&quot;https://www.elsevier.com/__data/assets/file/0007/56842/elsarticle-template.zip&quot;&gt;elsarticle-template.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;下载之后将解压到一个文件夹，然后双击 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ecrc-template.tex&lt;/code&gt; 打开，打开之后进行编译&lt;/p&gt;

&lt;p&gt;可以看到里面没有&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ecrc.sty&lt;/code&gt;在我们编译的时候就出错&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecrc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sty&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sty&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文15.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831213459864&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文17.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121360832&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;好像还没告诉大家是如何编译的，在软件点击编译就是下面的图标&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文16.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883121360832&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=0d2dc427f5df19c6fd3d5c26480a3eab) --&gt;

&lt;p&gt;可以去下载我的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ecrc.sty&lt;/code&gt;，下载放在最后，大家如果发现无法下载，就联系我&lt;/p&gt;

&lt;p&gt;下载之后需要放在 elsarticle-template 所在文件夹&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tex&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model1a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bst&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mybibfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bib&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;numcompress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sty&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ecrc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;关闭软件再重新打开，进行编译，结果还是发现找不到&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;所以这里缺文件还是很多&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;LaTeX&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;natbib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sty&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;LaTeX&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lineno&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sty&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;把这些放在一个文件夹，这样就好啦。&lt;/p&gt;

&lt;p&gt;可以尝试使用我的压缩包，我里面包含了用到的文件，或者自己下载 lineno.zip 和 natbib.zip 这些。&lt;/p&gt;

&lt;p&gt;如果安装了缺少的文件之后还发现缺少字体也就是会出现下面的异常&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;FATAL&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;miktex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;maketfm&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;creation&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rule&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;font&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psyr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;n&quot;&gt;Font&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cmr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecrm1000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10.0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pt&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loadable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Metric&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TFM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;be&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;again&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; 
                   &lt;span class=&quot;n&quot;&gt;relax&lt;/span&gt; 
&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fontencoding&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encodingdefault&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;selectfont&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;n&quot;&gt;pifont&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sty&lt;/span&gt;
&lt;span class=&quot;m&quot;&gt;64&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Font&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psyr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10.0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pt&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loadable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Metric&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TFM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;be&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;again&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; 
                   &lt;span class=&quot;n&quot;&gt;relax&lt;/span&gt; 
&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;64&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Pifont&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;用 Texwork 打开 tex 文件，点击编译，可以在下面看到 pifont.sty 里存在错误&lt;/p&gt;

&lt;p&gt;可以在刚才安装 basic-miktex 的文件夹的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tex\latex\psnfss\pifont.sty&lt;/code&gt; 找到&lt;/p&gt;

&lt;p&gt;如我的 basic-miktex 安装在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;E:\Program Files (x86)\MiKTeX 2.9&lt;/code&gt; 那么我就可以通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;E:\Program Files (x86)\MiKTeX 2.9\tex\latex\psnfss\pifont.sty&lt;/code&gt; 找到文件&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文18.png) --&gt;

&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/08/31/5b8952e39def1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;通过点击 pifont.sty 就可以跳转到出现问题的代码&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文20.png) --&gt;

&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/08/31/5b89530b63550.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;尝试删除 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{\Pifont{psy}}&lt;/code&gt; 代码或添加注释，添加之后注意保存。如果不知道如何修改这个文件，可以下载我修改好的文件替换自己的文件。&lt;/p&gt;

&lt;!-- pifont.sty --&gt;

&lt;p&gt;然后打开 basic-miktex 的文件夹的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;miktex\bin\x64\initexmf.exe&lt;/code&gt; 例如我的 basic-miktex 文件夹安装在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;E:\Program Files\MiKTeX 2.9&lt;/code&gt; 我就可以通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;E:\Program Files\MiKTeX 2.9\miktex\bin\x64\initexmf.exe&lt;/code&gt; 打开&lt;/p&gt;

&lt;p&gt;另一个方式是通过 MiKTeX 的包管理器安装 symbol 就可以解决，如果无法联网请看&lt;a href=&quot;http://02015678.lofter.com/post/1cd5b3ca_6fa6e34&quot;&gt;离线安装Miktex/CTEX的宏包Package-02015678&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;打开 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;initexmf.exe&lt;/code&gt; 的方式是通过命令行的方式打开，通过命令行进入 basic-miktex 的文件夹的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dvips\config&lt;/code&gt;文件夹，然后输入下面代码。注意路径是我的安装路径，需要修改路径为你自己的路径。&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;&quot;E:\Program Files\MiKTeX 2.9\miktex\bin\x64\initexmf.exe&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mkmaps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文21.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018831225838423&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;现在编译就可以发现编译成功&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文22.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201883123151733&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;!-- 这个在于我们打开的模板是`ecrc-template.tex`，在官网有下载，[ecrc-template.tex](https://www.elsevier.com/__data/assets/text_file/0007/56878/ecrc-template.tex)

打开之后发现还需要Elsevier-logo-3p.pdf, SDlogo-3p.pdf, Elsevier-logo-5p.pdf and SDlogo-5p.pdf ，都可以在官网下载，下载后需要下载elsarticle.cls，同样官方，[elsarticle.cls](https://www.elsevier.com/__data/assets/text_file/0005/56903/elsarticle.cls) --&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=af60a44f45f5a6a31bac45018e8f42ef) --&gt;

&lt;p&gt;我在TeXStudio打开，发现没有错误。&lt;/p&gt;

&lt;p&gt;如果受不了安装 Latex 的环境，可以使用在线的 &lt;a href=&quot;https://www.overleaf.com/project&quot;&gt;Online LaTeX Editor&lt;/a&gt; 写论文&lt;/p&gt;

&lt;p&gt;下载：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://ctan.org/pkg/texliveonfly&quot;&gt;CTAN: Package texliveonfly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://ctan.org/pkg/cm-super&quot;&gt;CTAN: Package cm-super&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;参见：&lt;a href=&quot;https://www.zhihu.com/question/28668105&quot;&gt;使用lyx排版，编辑Elsevier提供的模板，生成pdf时，出现的关于字体的错误&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tex.stackexchange.com/questions/154998/miktex-makepk-pk-font-alegreya-regular-lf-t1-base-could-not-be-created&quot;&gt;errors - miktex-makepk: PK font Alegreya-Regular-lf-t1–base could not be created - TeX - LaTeX Stack Exchange&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tex.stackexchange.com/questions/152721/problems-with-fonts/152749&quot;&gt;miktex - Problems with fonts - TeX - LaTeX Stack Exchange&lt;/a&gt;&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=7263d9f243b82dbd0ddb75b2d7ffa77d) --&gt;

&lt;p&gt;顺便推荐一个软件：&lt;a href=&quot;http://www.yingdev.com/projects/tickeys&quot;&gt;Tickeys&lt;/a&gt;这个软将可以让我们打字有声音，晚上打字用这个软件感觉好。&lt;/p&gt;

&lt;p&gt;实际很少有人在安装的过程会遇到这么多问题。&lt;/p&gt;

&lt;h2 id=&quot;设置镜像&quot;&gt;设置镜像&lt;/h2&gt;

&lt;p&gt;参见 &lt;a href=&quot;https://github.com/shifujun/UESTCthesis/wiki/TeX%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85&quot;&gt;TeX环境安装 · shifujun/UESTCthesis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/36240727&quot;&gt;TeX Live 2018安装流程&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;开始写论文&quot;&gt;开始写论文&lt;/h2&gt;

&lt;p&gt;开始写的是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\documentclass[3p,times]{elsarticle}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;就是引用 elsarticle，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\documentclass[]{elsarticle}&lt;/code&gt; 选项可以使用参见：https://www.elsevier.com/__data/assets/pdf_file/0009/56844/elsdoc2.pdf&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=8345e12176ee74d31704d5702819e9ec) --&gt;

&lt;p&gt;我们开始就是题目，我们的题目是乱写请看下面&lt;/p&gt;

&lt;p&gt;首先题目&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\title{A paper csdn and Mircrosoft is laji \tnoteref{t1,t2}}&lt;/code&gt;，其中&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\tnoteref&lt;/code&gt;是引用脚注，一般写的就是t1,t2标识，这个随意。其中写了t1，在题目后面就有一个星，在写一个就出现一个逗号，后面加两个星，规则是第n个就有n个星。&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文23.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189191227923&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如输入下面代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;paper&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mircrosoft&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;laji&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tnoteref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文24.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189191343658&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=47006b8ad7f2cc53a29d35d4674f3f98) --&gt;

&lt;p&gt;然后我们在外面写&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\tnotetext[标识]{Content}&lt;/code&gt;，也就是页面下的内容，这里我写的是垃圾微软，可以看到Content可以很长，而我们还有t3没写，没写的没显示&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;paper&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mircrosoft&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;laji&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tnoteref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tnotetext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;document&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;collaborative&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;effort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tnotetext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;The&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;second&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;footnote&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;which&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;longer&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;longer&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;than&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;one&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;an&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intention&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fill&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;up&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;more&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;than&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;one&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;formatting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;But&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;small&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;I&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mircosoft&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;laji&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;现在运行就可以看到这个界面&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文25.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189191710123&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在页面下方可以看到这个界面&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文26.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189191838765&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;现在可以看到星直接存在逗号了，而且需要知道，这里的符号不只是可以写 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t1&lt;/code&gt; 等，可以写为任意的字符&lt;/p&gt;

&lt;p&gt;如修改为下面代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;paper&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mircrosoft&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;laji&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tnoteref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tnotetext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tnotetext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;作者&quot;&gt;作者&lt;/h3&gt;

&lt;p&gt;接着我们开始写作者，假如我们两个作者，第一个是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lindexi_gd&lt;/code&gt;第二个是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Microsoft&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;我们需要知道在Latex的注释是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%%&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;作者的格式是&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;每个label就是标签，可以在地址写，可以在别的地方写作者的地址&lt;/p&gt;

&lt;p&gt;Latex用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\\&lt;/code&gt;换行，在我们的地址比较长，可以用这换行&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=a1b9c47f89679369883919fc05be1d6f) --&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexiAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cor1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fnref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;163.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;作者的\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;就是在脚注，用的是&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;，第&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;个有&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fnref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;脚注，这个才是真的，但是没显示&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexiAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cor1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fnref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;地址写在下面\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexiAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;The&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;address&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;地址是&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;不区分大小写&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Address1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Address2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Mircrosoft&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cor2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fnref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kaveh@river&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;valley&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cortext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cor1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Corresponding&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cortext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cor2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Principal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corresponding&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fntext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;specimen&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;footnote&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fntext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Another&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;footnote&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;but&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;little&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;more&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;longer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fntext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Yet&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;another&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;footnote&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Indeed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;you&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;can&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;have&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;any&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;footnotes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexiAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;The&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;address&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Address1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;River&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Valley&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Technologies&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Browns&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Court&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Kennford&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Exeter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;United&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Kingdom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Address2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Central&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Application&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Management&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Elsevier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Radarweg&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;29&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1043&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NX&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\\&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Amsterdam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Netherlands&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;复制我这个放到代码就可看到下面界面&lt;/p&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=a1b9c47f89679369883919fc05be1d6f) --&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文28.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189191838765&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;页面下方还有文字，只是我就不截图了&lt;/p&gt;

&lt;h3 id=&quot;摘要&quot;&gt;摘要&lt;/h3&gt;

&lt;p&gt;然后就是我们的摘要&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;abstract&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;摘要写在这&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;abstract&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;当然在 Latex 不能写中文，所以我就换了代码截图&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文29.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189193656855&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;关键字&quot;&gt;关键字&lt;/h3&gt;

&lt;p&gt;可以从上面的图片看到，摘要下面就是关键字&lt;/p&gt;

&lt;p&gt;关键字写在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\begin{keyword}&lt;/code&gt; 里面&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keyword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keyword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;不同的关键字使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\sep&lt;/code&gt;分开&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keyword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;CSDN&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sep&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sep&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keyword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=831ef3dfb69b9b72c6c699b55bd476ab) --&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文30.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189193825291&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;下面就是正文了，写正文会遇到这些问题如何插入图片，插入算法，图片位置不对，下面让我一个个告诉大家如何做&lt;/p&gt;

&lt;h3 id=&quot;行标记&quot;&gt;行标记&lt;/h3&gt;

&lt;p&gt;设置了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\linenumbers&lt;/code&gt; 就可以看到每 5 行给一个数值，请看下面代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keyword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;CSDN&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sep&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sep&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keyword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linenumbers&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;也就是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\linenumbers&lt;/code&gt; 只需要写进入在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\linenumbers&lt;/code&gt; 下面的文字就会在每 5 行添加数字，之前我为了找到文章左边的数字是哪里设置的找了很久，所以就在这个告诉大家。&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文31.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018919413019&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;尝试去掉 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\linenumbers&lt;/code&gt; 就不会显示数字&lt;/p&gt;

&lt;h3 id=&quot;标题&quot;&gt;标题&lt;/h3&gt;

&lt;p&gt;在文章的开始就是章节的标题，如第一章我写的是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lindexi.gitee.io&lt;/code&gt; 那么就需要使用这个代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;section&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gitee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;n&quot;&gt;welcome&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tolindexi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gitee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;that&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;has&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;many&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blogs&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文32.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189194345992&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后添加二级标题 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blog.csdn.net/lindexi_gd&lt;/code&gt; 请看代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subsection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;n&quot;&gt;welcome&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;that&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;has&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;many&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blogs&lt;/span&gt; 

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文33.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2018919455739&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;从上面的代码可以知道，一级标题是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\section{标题名}&lt;/code&gt;而二级标题是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\subsection{标题名}&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;输入列表&quot;&gt;输入列表&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}[&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;标号&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;标号可以使用数字或字，其中可以加&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]&lt;/code&gt;,&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;我们可以在列表嵌套&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;has&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;roman&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numeral&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Another&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;one&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;before&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;we&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;close&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;third&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
		&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;has&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;roman&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numeral&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
		&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Another&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;one&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;before&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;we&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;close&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;third&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!-- ![](http://jycloud.9uads.com/web/GetObject.aspx?filekey=b47139339692da2ae2ae17767f35a117) --&gt;

&lt;h3 id=&quot;双栏&quot;&gt;双栏&lt;/h3&gt;

&lt;p&gt;需要双栏，在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\documentclass[3p,times]{elsarticle}&lt;/code&gt;改5p&lt;/p&gt;

&lt;p&gt;还有其他选项，这些我们现在不需要，直接改5p就好&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\documentclass[5p,times]{elsarticle}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这里是设置使用的模板，可以设置是否分栏、页边距、默认的字体类型及大小&lt;/p&gt;

&lt;p&gt;可以选的这些&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;preprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;review&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;final&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;final&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;twocolumn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;final&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;final&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;twocolumn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;final&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;final&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;twocolumn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elsarticle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;引用&quot;&gt;引用&lt;/h3&gt;

&lt;p&gt;我们的论文会参见很多人的，那么添加一个人或删一个引用，可能需要修改文章，而且因为排序问题可能需要修改文章的很多代码。不过在 Latex 有自动的方式，自动修改引用的序号。使用这个方法十分简单。参考需要写在页面的最下，在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\end{document}&lt;/code&gt; 的上方。在写引用之前需要搜索删除 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\bibliography{&amp;lt;your-bib-database&amp;gt;}&lt;/code&gt; 这个代码&lt;/p&gt;

&lt;p&gt;下面来写一个参考&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thebibliography&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bibitem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;每次参考自动写的内容，作者，如果遇到括号不写&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;参见&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;
	
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thebibliography&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在文章遇到我们需要参考就使用下面代码，注意将 label 替换为参考里面的 label&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;citet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这样就好，如果我们没写作者看起来不好&lt;/p&gt;

&lt;p&gt;如果没写作者，只要一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[1]&lt;/code&gt;就可以了，在正文可以使用另一个方式引用&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;citep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;另一方式&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cite&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;要写一个上标我们应该用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;^&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;假如我们的一个引用是这样写的&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thebibliography&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;    
    
    &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bibitem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bibitem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_gd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bibitem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;csdn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lindexi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;
	
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thebibliography&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在引用的写 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$^{\cite{lindexi 1}}$&lt;/code&gt; 就可以做出下面的效果&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; Named Lin Dexi{\cite{lindexi 1}}, I am a developer who has been in contact with UWP technology^{\cite{lindexi}} since 2015. 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;注意&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$$&lt;/code&gt;就是使用公式&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文34.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189112406128&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;关于参考文献请看&lt;a href=&quot;https://blog.csdn.net/tinkle181129/article/details/49822171&quot;&gt;latex 自定义bst文件 - CSDN博客&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;将多个引用使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&lt;/code&gt; 连起来，如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[1][2][3]&lt;/code&gt; 转 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[1-3&lt;/code&gt; 请看&lt;a href=&quot;https://blog.csdn.net/lqhbupt/article/details/49925911&quot;&gt;latex中同一处引用多篇文献 - CSDN博客&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;引用异常&quot;&gt;引用异常&lt;/h3&gt;

&lt;p&gt;如果LaTex报错(但生成的PDF文件正确)，报告下面代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;natbib&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bibliography&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compatible&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;year&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;citations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;natbib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
    &lt;span class=&quot;n&quot;&gt;Press&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numerical&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;citation&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个错误就是文献条目的格式不对，和“作者-年”的引用格式不兼容，可能是有的文献缺少author或year字段，无法作为“作者-年”引用格式，解决方法有两个&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;确保所有文献条目均含有author字段和year字段；&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;在调用natbib宏包时，使用numbers参数，如&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;usepackage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;square&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;comma&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;natbib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果已经添加了 natbib 引用，检查是否加上了日期&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;usepackage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;authoryear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;comma&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;square&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;natbib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里的代码就添加了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;authoryear&lt;/code&gt; 要求引用有年份的信息，只需要去掉就可以&lt;/p&gt;

&lt;p&gt;如果使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\usepackage [numbers]{natbib}&lt;/code&gt; 提示 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option clash for package natbib.&lt;/code&gt; 就是添加了两次 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;natbib&lt;/code&gt; 包，而且两次使用不同的设置&lt;/p&gt;

&lt;p&gt;简单的解决方法是搜索文档看有哪些地方存在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;natbib&lt;/code&gt; 的引用，删除之前的代码就可以&lt;/p&gt;

&lt;h3 id=&quot;斜体&quot;&gt;斜体&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;emph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;内容&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;粗体&quot;&gt;粗体&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;textbf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;排列&quot;&gt;排列&lt;/h3&gt;

&lt;p&gt;左对齐&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;flushleft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  	
  &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;flushleft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;居中&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
 	
 &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;右对齐&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;flushright&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	
  &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;flushright&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;分数&quot;&gt;分数&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;frac&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;上&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;下&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$ \frac{1}{2}  $&lt;/code&gt;请看界面&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文35.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201891124313693&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;无序列表&quot;&gt;无序列表&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;itemize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; 
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; 
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;itemize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;根号&quot;&gt;根号&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;插入图片&quot;&gt;插入图片&lt;/h3&gt;

&lt;p&gt;插入图片的位置不对，我们可以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[!htb]&lt;/code&gt;来取消latex的美学，latex的美学很烂。&lt;/p&gt;

&lt;p&gt;我们需要先引用 float&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;usepackage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;graphicx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;usepackage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在引用图片写上 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[!htb]&lt;/code&gt; 添加到指定的代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;这里用取消美学&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;htb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includegraphics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fig1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;png&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Problem&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Description&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fig1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;图片位置可以使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;figure=&lt;/code&gt; 指定本地的图片&lt;/p&gt;

&lt;p&gt;如果是esp，需要 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\epsfig&lt;/code&gt; 来指定，请看代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;centerline&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epsfig&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
      &lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
      &lt;span class=&quot;n&quot;&gt;angle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;90&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;标题&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Fig1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;参见：http://blog.sciencenet.cn/blog-400681-886697.html&lt;/p&gt;

&lt;p&gt;http://blog.csdn.net/bingfengxiao/article/details/6650096&lt;/p&gt;

&lt;p&gt;多图并排&lt;/p&gt;

&lt;p&gt;使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\vfill&lt;/code&gt;换行，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\hfill&lt;/code&gt; 并排&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*}&lt;/span&gt; 
	 &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;centering&lt;/span&gt; 
	 
	 &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minipage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0.48&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linewidth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.48&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;大小&lt;/span&gt;
	 	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;centering&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;图在中间&lt;/span&gt;
	    &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includegraphics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;图，如果使用&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eps&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;需要转换&lt;/span&gt;
    	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;图&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
     &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minipage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
     &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hfill&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;并排&lt;/span&gt;
     &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minipage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linewidth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
     	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;centering&lt;/span&gt;
     	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includegraphics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;图&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
     	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
     &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minipage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;每一张图有自己的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Figure&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果需要用的是一张图包含小图，就需要使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;subfigure&lt;/code&gt; 的方法&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;\begin{figure}
	\centering 
	\subfigure[(a)]
	{
	
		\includegraphics[width=5cm,height=3cm]{1a}
	}
	\subfigure[(b)]
	{
	
		\includegraphics[width=5cm,height=3cm]{1b}
	}
	
	\caption{ fig }
	\label{f1}
\end{figure}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;http://blog.csdn.net/lsg32/article/details/8121417&lt;/p&gt;

&lt;p&gt;http://www.ctex.org/documents/latex/graphics/node109.html&lt;/p&gt;

&lt;h3 id=&quot;使用eps&quot;&gt;使用eps&lt;/h3&gt;

&lt;p&gt;引用 epsfig&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;usepackage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;graphicx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;usepackage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epsfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;打开cmd，进入图片路径， 使用 epstopdf 命令转换 eps 为 PDF&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;epstopdf&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;图&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行上面代码输出 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;图.pdf&lt;/code&gt; 在相同的文件夹&lt;/p&gt;

&lt;p&gt;引用的时候不需要写后缀名&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includegraphics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;把生成的pdf也放进去，这样生成就好&lt;/p&gt;

&lt;p&gt;重新为图片编号：http://www.52yfjc.com/2014/show.asp?id=887&lt;/p&gt;

&lt;h3 id=&quot;visio转eps&quot;&gt;Visio转eps&lt;/h3&gt;

&lt;p&gt;在线wmf转eps https://cloudconvert.com/wmf-to-eps&lt;/p&gt;

&lt;p&gt;svg转eps http://cn.office-converter.com/SVG-to-EPS&lt;/p&gt;

&lt;p&gt;一个简单方法是选择要转换的图，新建一个visio，然后在页面大小，设为适应，然后保存为pdf就好，一般不需要在转&lt;/p&gt;

&lt;h3 id=&quot;公式&quot;&gt;公式&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&quot;language-stylus&quot;&gt;\begin{equation}
公式
\label{g1}
\end{equation}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://lindexi.gitee.io/lindexi/post/Latex-%E5%85%AC%E5%BC%8F%E9%80%9F%E6%9F%A5.html&quot;&gt;Latex 公式速查&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;插入公式：https://www.kancloud.cn/thinkphp/latex/41806&lt;/p&gt;

&lt;p&gt;http://mohu.org/info/symbols/symbols.htm&lt;/p&gt;

&lt;p&gt;http://blog.csdn.net/garfielder007/article/details/51646604&lt;/p&gt;

&lt;h4 id=&quot;公式空格&quot;&gt;公式空格&lt;/h4&gt;

&lt;p&gt;在公式添加空格有下面的方法&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;latex&lt;/th&gt;
      &lt;th&gt;空格&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;a \qquad b&lt;/td&gt;
      &lt;td&gt;两个quad空格&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;a \quad b&lt;/td&gt;
      &lt;td&gt;quad空格&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;a\ b&lt;/td&gt;
      &lt;td&gt;大空格&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;a\;b&lt;/td&gt;
      &lt;td&gt;中等空格&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;a\,b&lt;/td&gt;
      &lt;td&gt;小空格&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;a href=&quot;https://lindexi.gitee.io/lindexi/post/Latex-%E5%85%AC%E5%BC%8F%E9%80%9F%E6%9F%A5.html&quot;&gt;Latex 公式速查&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;表格&quot;&gt;表格&lt;/h3&gt;

&lt;p&gt;关于表格请看 &lt;a href=&quot;https://blog.csdn.net/robert_chen1988/article/details/51700219&quot;&gt;使用latex撰写elsevier论文，latex表格，插图以及调用的安装包 - CSDN博客&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;插入算法&quot;&gt;插入算法&lt;/h3&gt;

&lt;p&gt;参见 &lt;a href=&quot;https://blog.csdn.net/lqhbupt/article/details/8723478&quot;&gt;LaTeX算法排版例子 - CSDN博客&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;很多算法都是使用伪代码的方式，简单使用的方法是如下面的方式&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;algorithm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; 
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;algorithmic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;
	&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;algorithmic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;algorithm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;页开始&quot;&gt;页开始&lt;/h3&gt;

&lt;p&gt;如果需要设置期刊的名，可以使用下面的方法&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;journalname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;期刊名&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;设置本地包&quot;&gt;设置本地包&lt;/h2&gt;

&lt;p&gt;因为 Latex 要安装一些库是需要联网的，但是很多时候网络都不是很好，所以这时需要使用 &lt;a href=&quot;http://mirrors.ustc.edu.cn/CTAN/systems/win32/miktex/tm/packages/&quot;&gt;国内的源&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;具体使用方法请看：&lt;a href=&quot;http://02015678.lofter.com/post/1cd5b3ca_6fa6e34&quot;&gt;离线安装Miktex/CTEX的宏包Package-02015678&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;下载-1&quot;&gt;下载&lt;/h2&gt;

&lt;p&gt;下面就是本文用到的各个文件的下载链接，如果发现无法下载，或没有 csdn 积分，请邮件&lt;a href=&quot;mailto:lindexi_gd@163.com&quot;&gt;联系&lt;/a&gt;我，我通过邮件发送给你&lt;/p&gt;

&lt;h3 id=&quot;basic-miktex-296069-x64&quot;&gt;basic-miktex-2.9.6069-x64&lt;/h3&gt;

&lt;!-- https://yunpan.cn/OcvKmfknLnEsnJ  访问密码 0943 --&gt;
&lt;p&gt;链接：http://pan.baidu.com/s/1slnnoPB 密码：wcaw&lt;/p&gt;

&lt;p&gt;Btsync:B74YC6AIP6J2CNK2CNTCXGG3NVGGMTTXO&lt;/p&gt;

&lt;h3 id=&quot;ctex&quot;&gt;CTeX&lt;/h3&gt;
&lt;!-- https://yunpan.cn/OcvKmJ8EINEN22  访问密码 7fa9 --&gt;

&lt;p&gt;&lt;a href=&quot;https://pan.baidu.com/s/1jHQVq2U&quot;&gt;CTeX套装&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;texstudio&quot;&gt;TeXStudio&lt;/h3&gt;
&lt;!-- https://yunpan.cn/OcvKmVsRytDq7Z  访问密码 5ef5 --&gt;
&lt;p&gt;链接：http://pan.baidu.com/s/1pLCZL5h 密码：hb29&lt;/p&gt;

&lt;p&gt;Btsync:BBXDB6T3LBPYJ6CVXTV7V6226FGXHXOFP&lt;/p&gt;

&lt;p&gt;https://sourceforge.net/projects/texstudio/?source=typ_redirect&lt;/p&gt;

&lt;h3 id=&quot;ecrcsty&quot;&gt;ecrc.sty&lt;/h3&gt;
&lt;!-- https://yunpan.cn/OcvKHgsSHJMaFc  访问密码 2cef --&gt;
&lt;p&gt;&lt;a href=&quot;https://download.csdn.net/download/lindexi_gd/9646187&quot;&gt;ecrc.sty-CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;elsarticle-template&quot;&gt;elsarticle-template&lt;/h3&gt;

&lt;p&gt;官方的艾斯维尔文件是编译不通过，下面是我添加了文件的版本&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://download.csdn.net/download/lindexi_gd/10639564&quot;&gt;elsarticle-template 包含文件-CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;ecrc-templatetex&quot;&gt;ecrc-template.tex&lt;/h3&gt;
&lt;!-- https://yunpan.cn/OcvKHKAiBNIZDi  访问密码 1100 --&gt;
&lt;p&gt;http://pan.baidu.com/s/1mi3CzJq&lt;/p&gt;

&lt;p&gt;Btsync: BQ2XFET5YROHGWVN2NZNQ4X5VTKEKLO4C&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://download.csdn.net/detail/lindexi_gd/9795700&quot;&gt;ecrc-template-CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;linenosty&quot;&gt;lineno.sty&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://download.csdn.net/download/lindexi_gd/10639569&quot;&gt;下载 lineno.sty -CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.ge.infn.it/~gemmec/SuppNote2012/lineno.sty&quot;&gt;官方 lineno.sty&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;linenotex&quot;&gt;lineno.tex&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://download.csdn.net/download/lindexi_gd/10639571&quot;&gt;下载lineno.tex -CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这是 lineno.tex 官方版本&lt;a href=&quot;https://ctan.org/tex-archive/macros/latex/contrib/lineno?lang=en&quot;&gt;点击下载&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;lineno&quot;&gt;lineno&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://download.csdn.net/download/lindexi_gd/10639574&quot;&gt;下载lineno.zip -CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The LaTeX package lineno.sty provides line numbers on paragraphs&lt;/p&gt;

&lt;h3 id=&quot;natbibsty&quot;&gt;natbib.sty&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://download.csdn.net/download/lindexi_gd/10639753&quot;&gt;下载natbib.sty -CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://web.hku.hk/~gdli/natbibsty.txt&quot;&gt;官方下载&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;pifontsty&quot;&gt;pifont.sty&lt;/h3&gt;

&lt;p&gt;这个文件需要放在 miktex 安装文件夹的 tex\latex\psnfss\ 覆盖，用于解决&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Font&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psyr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10.0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pt&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loadable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Metric&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TFM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;但是会让一些字体无法看到&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://download.csdn.net/download/lindexi_gd/10639767&quot;&gt;下载pifont.sty -CSDN下载&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;另一个解决方法是通过 miktex 安装 symbol 库就可以解决。&lt;/p&gt;

&lt;p&gt;从开始菜单找到 Package Manager (Admin) 打开，可以看到下面界面&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文36.png) --&gt;

&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a35577e130.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在里面搜索 symbol 按下回车搜索，可以看到下面界面，点击第一个右击安装&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文37.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201891144513552&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文38.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F20189114474348&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;安装完成可以看到下面界面，下面是我通过在本地的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;E:\package &lt;/code&gt; 做安装文件夹在本地安装，因为我无法联网安装&lt;/p&gt;

&lt;!-- ![](image/Latex 论文elsevier，手把手如何用Latex写论文/Latex 论文elsevier，手把手如何用Latex写论文39.png) --&gt;

&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F201891144731213&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;参见：https://www.elsevier.com/authors/author-schemas/preparing-crc-journal-articles-with-latex&lt;/p&gt;

&lt;p&gt;http://hubl82.blog.163.com/blog/static/1267694852013459412617/&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.elsevier.com/authors/author-schemas/latex-instructions&quot;&gt;Latex&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;更多数学公式请看 &lt;a href=&quot;https://blog.lindexi.com/post/Latex-%E5%85%AC%E5%BC%8F%E9%80%9F%E6%9F%A5.html&quot;&gt;Latex 公式速查&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://02015678.lofter.com/post/1cd5b3ca_6fa6e34&quot;&gt;离线安装Miktex/CTEX的宏包Package-02015678&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.ctex.org/HomePage&quot;&gt;Welcome to Chinese TeX:CTEX&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Tue, 25 Aug 2026 00:27:55 +0000</pubDate>
        <link>https://blog.lindexi.com/post/Latex-%E8%AE%BA%E6%96%87elsevier-%E6%89%8B%E6%8A%8A%E6%89%8B%E5%A6%82%E4%BD%95%E7%94%A8Latex%E5%86%99%E8%AE%BA%E6%96%87.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/Latex-%E8%AE%BA%E6%96%87elsevier-%E6%89%8B%E6%8A%8A%E6%89%8B%E5%A6%82%E4%BD%95%E7%94%A8Latex%E5%86%99%E8%AE%BA%E6%96%87.html</guid>
        
        
        <category>Latex</category>
        
      </item>
    
      <item>
        <title>C# 字典 Dictionary 的 TryGetValue 与先判断 ContainsKey 然后 Get 的性能对比</title>
        <description>&lt;p&gt;本文使用 &lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%A0%87%E5%87%86%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html&quot;&gt;benchmarkdotnet &lt;/a&gt; 测试字典的性能，在使用字典获取一个可能存在的值的时候可以使用两个不同的写法，于是本文分析两个写法的性能。&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2019/11/29 10:13:19 --&gt;

&lt;p&gt;判断值存在，如果值存在就获取值，可以使用下面两个不同的方法&lt;/p&gt;

&lt;p&gt;一个方法是使用 TryGetValue 请看下面代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;TryGetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;另一个方法是先判断是否存在然后再获取，请看下面代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ContainsKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;于是本文就使用&lt;a href=&quot;https://blog.lindexi.com/post/C-%E6%A0%87%E5%87%86%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html&quot;&gt;benchmarkdotnet &lt;/a&gt;测试两个方法的性能&lt;/p&gt;

&lt;p&gt;下面是进行测试的数据，测试的代码放在本文的最后。这里的 TryGetExist 方法就是尝试获取一个值，这个值是存在的。而 ContainGetExist 是先判断值是否存在，如果存在就尝试获取这个值。&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;py&quot;&gt;BenchmarkDotNet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;v0.10.14, OS=Windows 10.0.17134&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;Intel&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;Core&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;i7-6700&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;CPU&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;3.40GHz&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;(Skylake),&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;CPU,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;8&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;logical&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;physical&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;cores&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Frequency&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;3328130 Hz, Resolution=300.4690 ns, Timer=TSC&lt;/span&gt;
  &lt;span class=&quot;nn&quot;&gt;[Host]&lt;/span&gt;     &lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;.NET&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;Framework&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.7&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;(CLR&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.0.30319.42000),&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;64bit&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;RyuJIT-v4.7.3132.0&lt;/span&gt;  &lt;span class=&quot;nn&quot;&gt;[AttachedDebugger]&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;DefaultJob&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;.NET&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;Framework&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.7&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;(CLR&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.0.30319.42000),&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;64bit&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;RyuJIT-v4.7.3132.0&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Mean&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Error&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;StdDev&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Median&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;TryGetExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;30.26 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.6057 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.5949 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;30.11 ns&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ContainGetExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;46.36 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.0883 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;3.1919 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;44.90 ns&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;TryGetNoExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;20.23 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.4661 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.7658 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;19.93 ns&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ContainGetNoExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;18.68 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.2569 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.2403 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;18.66 ns&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;同样对比 ConcurrentDictionary 线程安全的类的性能，也就是将会上面的 Foo 测试类的字典替换为 ConcurrentDictionary 其他代码都不修改，下面是测试的数据，可以看到使用 TryGetValue 的性能依然比较好&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;py&quot;&gt;BenchmarkDotNet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;v0.10.14, OS=Windows 10.0.17134&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;Intel&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;Core&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;i7-6700&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;CPU&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;3.40GHz&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;(Skylake),&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;CPU,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;8&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;logical&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;physical&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;cores&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;Frequency&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;3328130 Hz, Resolution=300.4690 ns, Timer=TSC&lt;/span&gt;
  &lt;span class=&quot;nn&quot;&gt;[Host]&lt;/span&gt;     &lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;.NET&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;Framework&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.7&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;(CLR&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.0.30319.42000),&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;64bit&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;RyuJIT-v4.7.3132.0&lt;/span&gt;  &lt;span class=&quot;nn&quot;&gt;[AttachedDebugger]&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;DefaultJob&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;.NET&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;Framework&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.7&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;(CLR&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;4.0.30319.42000),&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;64bit&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;RyuJIT-v4.7.3132.0&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Mean&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Error&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;StdDev&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Median&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;TryGetExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;31.20 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.4644 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.3625 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;31.17 ns&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ContainGetExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;66.80 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.4692 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;7.2806 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;63.84 ns&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;TryGetNoExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;20.07 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.1254 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.1112 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;20.04 ns&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ContainGetNoExist&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;27.63 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.4230 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.3956 ns&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;27.65 ns&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;所有代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Foo&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;/// &amp;lt;inheritdoc /&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ran&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;++)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ran&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;-&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ran&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ran&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lindexi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;逗比&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Benchmark&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;TryGetExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;TryGetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lindexi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;_foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Benchmark&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ContainGetExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ContainsKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lindexi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;_foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lindexi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;


        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Benchmark&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;TryGetNoExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;TryGetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lindexi123&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;_foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Benchmark&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ContainGetNoExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ContainsKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lindexi123&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;_foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lindexi123&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LazyDictionary&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我的博客即将同步至腾讯云开发者社区，邀请大家一同入驻：https://cloud.tencent.com/developer/support-plan?invite_code=19bm8i8js1ezb&lt;/p&gt;

</description>
        <pubDate>Mon, 10 Aug 2026 08:21:37 +0000</pubDate>
        <link>https://blog.lindexi.com/post/C-%E5%AD%97%E5%85%B8-Dictionary-%E7%9A%84-TryGetValue-%E4%B8%8E%E5%85%88%E5%88%A4%E6%96%AD-ContainsKey-%E7%84%B6%E5%90%8E-Get-%E7%9A%84%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/C-%E5%AD%97%E5%85%B8-Dictionary-%E7%9A%84-TryGetValue-%E4%B8%8E%E5%85%88%E5%88%A4%E6%96%AD-ContainsKey-%E7%84%B6%E5%90%8E-Get-%E7%9A%84%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94.html</guid>
        
        
        <category>C#</category>
        
      </item>
    
      <item>
        <title>WPF 使用像素着色器实现单应变换</title>
        <description>&lt;p&gt;本文将告诉大家如何在 WPF 中通过自定义 ShaderEffect 像素着色器实现图片的单应变换，也就是透视变换效果，拖动图片四个角点可以实时调整变换形态，整个过程由 GPU 逐像素完成，Demo 中附带了凸四边形校验，避免把图片拖成无法变换的形态&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2026/08/07 07:17:13 --&gt;

&lt;!-- 发布 --&gt;
&lt;!-- 博客 --&gt;

&lt;p&gt;本文内容由人类主导 AI 辅助编写&lt;/p&gt;

&lt;p&gt;效果如下：&lt;/p&gt;

&lt;!-- ![](image/WPF使用像素着色器实现单应变换/WPF使用像素着色器实现单应变换0.gif) --&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi-WPF%25E4%25BD%25BF%25E7%2594%25A8%25E5%2583%258F%25E7%25B4%25A0%25E7%259D%2580%25E8%2589%25B2%25E5%2599%25A8%25E5%25AE%259E%25E7%258E%25B0%25E5%258D%2595%25E5%25BA%2594%25E5%258F%2598%25E6%258D%25A20.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;背景&quot;&gt;背景&lt;/h2&gt;

&lt;p&gt;单应变换（Homography）是计算机视觉里很常用的变换，它的特点是能把一个任意四边形映射到另一个任意四边形，比如把一张贴纸图片投影到照片里的墙面、把倾斜拍摄的文档矫正成正视图，都属于单应变换的应用。数学上它由一个 3x3 的矩阵描述，和普通的仿射变换不同，这个矩阵还带有透视分量，因此能把平行线变成相交线，产生近大远小的效果&lt;/p&gt;

&lt;p&gt;在 WPF 里面想要做出这种透视效果，常见的选择是用 PlaneProjection 或者 3D 场景里的相机投影。但这两个方案本质上都是把平面放到空间里旋转，能模拟的形态有限，而且想要”任意四边形到任意四边形”的自由映射并不方便。另一个思路是使用像素着色器：每个输出像素都去计算自己对应源纹理的哪个位置，然后把颜色取过来，这是完全自由的，只要数学算得出来，什么变换都能做&lt;/p&gt;

&lt;p&gt;WPF 原生支持自定义 ShaderEffect，只需要把编译好的像素着色器字节码交给 PixelShader 即可。本文的 Demo 就是一个完整的可运行示例，界面如下：中间是图片，四角有黄色圆环手柄，拖动手柄图片实时变形，虚线框标出当前四边形，四边形之外的区域保持棋盘格背景&lt;/p&gt;

&lt;h2 id=&quot;整体流程&quot;&gt;整体流程&lt;/h2&gt;

&lt;p&gt;先看一下整个 Demo 的工作流程，方便理解后面每一段代码所处的位置：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;在 XAML 里放置图片、棋盘格背景、四边形轮廓和四个拖拽手柄&lt;/li&gt;
  &lt;li&gt;拖拽手柄时，把拖动量换算成归一化的角点坐标，更新角点数组&lt;/li&gt;
  &lt;li&gt;校验四个角点是否构成凸四边形，不合法则回滚&lt;/li&gt;
  &lt;li&gt;用角点计算”四边形到单位正方形”的逆单应矩阵&lt;/li&gt;
  &lt;li&gt;把矩阵三行传给 ShaderEffect 的常量寄存器&lt;/li&gt;
  &lt;li&gt;GPU 运行像素着色器，逐像素从源纹理取色完成变换&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;其中第 4 步的矩阵计算是整个 Demo 的核心，第 6 步的着色器是效果的关键，拖拽交互只是把这两者串起来&lt;/p&gt;

&lt;h2 id=&quot;角点的坐标系约定&quot;&gt;角点的坐标系约定&lt;/h2&gt;

&lt;p&gt;打开 MainWindow.xaml.cs，可以看到角点数据保存在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_corners&lt;/code&gt; 数组里，四个点的顺序是左上、右上、右下、左下，也就是顺时针：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0.08&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0.78&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0.94&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.82&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0.12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.94&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里非常关键的一点是：坐标全部归一化到 0 到 1 之间，而不是直接使用像素值。为什么要这么做？因为单应矩阵的数学推导是基于单位正方形（0 到 1 的坐标系）的，归一化之后，无论窗口怎么缩放、Viewport 是多大，矩阵计算都不受影响，只在最后把坐标乘回 Viewport 的宽高用于绘制。这个解耦让整个 Demo 简单了很多&lt;/p&gt;

&lt;h2 id=&quot;单应矩阵的计算&quot;&gt;单应矩阵的计算&lt;/h2&gt;

&lt;p&gt;单应变换的矩阵计算分为两步：先算”单位正方形到四边形”的正向矩阵，再对它求逆得到”四边形到单位正方形”的逆矩阵。代码里 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Homography&lt;/code&gt; 静态类封装了全部数学逻辑&lt;/p&gt;

&lt;p&gt;先看正向矩阵 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CreateUnitSquareToQuadrilateral&lt;/code&gt;，它接收四个角点，返回一个 3x3 矩阵：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[,]&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CreateUnitSquareToQuadrilateral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dx1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dx2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dx3&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy3&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;denominator&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;denominator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epsilon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ArgumentException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;四边形无法构成有效的单应变换。&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx3&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;denominator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx3&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dy1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;denominator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[,]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottomLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这段代码看起来有点吓人，其实它是在解一个线性方程组。单应矩阵的第三行是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(g, h, 1)&lt;/code&gt;，其中的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;g&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;h&lt;/code&gt; 就是透视分量，它们决定了变换的”倾斜”程度。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dx1&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dx2&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dx3&lt;/code&gt; 这些中间量分别是四边形的对角差和”歪斜度”（topLeft - topRight + bottomRight - bottomLeft 衡量的是四边形偏离平行四边形的程度），代入公式就能解出 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;g&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;h&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这个矩阵的计算方式不是原创的，而是来自 OpenCV 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getPerspectiveTransform&lt;/code&gt; 实现，是图像处理领域非常经典的公式，直接把四个目标角点代进去就能得到映射矩阵&lt;/p&gt;

&lt;p&gt;拿到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;g&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;h&lt;/code&gt; 之后，矩阵的前两行也就定了。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denominator&lt;/code&gt; 是分母，如果它接近 0，说明四个点退化成了三角形或者共线，这时候矩阵无解，直接抛异常告诉调用方四边形不合法&lt;/p&gt;

&lt;p&gt;有了正向矩阵之后，为什么还需要求逆？这就要回到像素着色器的工作方式了。着色器是对&lt;strong&gt;输出图像&lt;/strong&gt;的每个像素执行的：它知道目标像素的坐标（destination），但不知道这个位置应该取源纹理的哪个颜色。所以我们需要的是反过来的映射，也就是”输出图像上的点，对应源纹理的哪个位置”，这就是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CreateQuadrilateralToUnitSquare&lt;/code&gt; 要做的事：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[,]&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CreateQuadrilateralToUnitSquare&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IReadOnlyList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfNull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ArgumentException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;必须提供四个角点。&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;nameof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;forward&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CreateUnitSquareToQuadrilateral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Invert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;forward&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;它的实现很朴素：先算正向矩阵，再调用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Invert&lt;/code&gt; 求逆。求逆用的是 3x3 矩阵的伴随矩阵法，对于 3x3 这种小矩阵，直接按公式展开比通用高斯消元更快也更直观：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[,]&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Invert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[,]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;determinant&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
                      &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
                      &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)));&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;determinant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epsilon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;单应矩阵不可逆。&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;determinant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[,]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;行列式接近 0 说明矩阵奇异，也就是变换会压扁成一条线，此时同样抛异常。这里的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Epsilon&lt;/code&gt; 是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1e-8&lt;/code&gt;，一个足够小的阈值，用来判断浮点数是否为 0，避免直接比较 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;== 0&lt;/code&gt; 的浮点精度问题&lt;/p&gt;

&lt;h2 id=&quot;凸四边形校验&quot;&gt;凸四边形校验&lt;/h2&gt;

&lt;p&gt;矩阵算好了，但如果用户把某个角点拖过头，四个点可能不再构成凸四边形，此时单应变换会得到扭曲甚至翻转的怪异结果。所以在拖拽过程中要实时校验，不合法就回滚。这就是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IsConvexQuadrilateral&lt;/code&gt; 的作用：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;IsConvexQuadrilateral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IReadOnlyList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfNull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sign&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;++)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;second&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;third&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cross&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;second&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;third&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;second&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;second&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;third&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;second&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cross&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.002&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;currentSign&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Sign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cross&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sign&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;??=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;currentSign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sign&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;currentSign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;判断凸四边形的原理很简单：遍历每条边，计算相邻两条边向量的叉积。叉积的符号表示转动的方向，如果所有边的转动方向一致，也就是叉积符号全部相同，那这个四边形就是凸的。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(i + 1) % corners.Count&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(i + 2) % corners.Count&lt;/code&gt; 是取模运算，让最后一个点能绕回第一个点，这样四条边都能遍历到&lt;/p&gt;

&lt;p&gt;叉积绝对值小于 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.002&lt;/code&gt; 时直接判定不合法，这表示两条边几乎共线，四边形退化成了接近三角形或者自交的形态，虽然数学上还能算出矩阵，但视觉效果会很奇怪。这个阈值可以根据手感调整，太大会让角点拖到边缘就拖不动，太小则容易拖出怪异的形状&lt;/p&gt;

&lt;h2 id=&quot;像素着色器&quot;&gt;像素着色器&lt;/h2&gt;

&lt;p&gt;数学部分完成之后，就轮到真正的核心：像素着色器。整个 HLSL 源码就内嵌在 C# 的字符串里，这也是这个 Demo 最大的亮点，先看着色器代码：&lt;/p&gt;

&lt;div class=&quot;language-hlsl highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sampler2D&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;InputTexture&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;float4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MatrixRow0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;float4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MatrixRow1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;float4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MatrixRow2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;float4&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;destination&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;TEXCOORD0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;COLOR0&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;float3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;homogeneousPosition&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;float3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceW&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;homogeneousPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;homogeneousPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;homogeneousPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lowerBound&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;upperBound&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;visible&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lowerBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lowerBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;upperBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;upperBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;tex2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InputTexture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;saturate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;visible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;逐行解释一下。第一行声明了输入采样器 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;InputTexture&lt;/code&gt; 绑定到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s0&lt;/code&gt; 寄存器，这是 WPF 传入的源图像。接下来三行把矩阵的三行声明为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;float4&lt;/code&gt; 常量，绑定到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c0&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c1&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c2&lt;/code&gt; 寄存器，WPF 会通过常量寄存器把 C# 侧的矩阵数据传进来&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; 函数的输入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;destination&lt;/code&gt; 是目标像素坐标，WPF 渲染时会把它归一化到 0 到 1 范围。把它补上齐次坐标的第三个分量 1.0，就得到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;homogeneousPosition&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;接下来的三行就是把逆矩阵应用到坐标上：&lt;/p&gt;

&lt;div class=&quot;language-hlsl highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceW&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;homogeneousPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;homogeneousPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;homogeneousPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;矩阵乘齐次坐标之后得到一个三维向量，前两个分量是未归一化的源坐标，第三行算出的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sourceW&lt;/code&gt; 是透视分量，用它做除法，把齐次坐标还原成普通的二维坐标，这就是透视除法。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source&lt;/code&gt; 就是当前输出像素对应的源纹理位置&lt;/p&gt;

&lt;p&gt;最后几行处理越界问题：&lt;/p&gt;

&lt;div class=&quot;language-hlsl highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lowerBound&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;upperBound&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;float2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;visible&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lowerBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lowerBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;upperBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;upperBound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;tex2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InputTexture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;saturate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;visible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;当 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source&lt;/code&gt; 落在 0 到 1 之外时，说明这个输出像素在目标四边形外面，那里不应该显示图片内容。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;step(a, b)&lt;/code&gt; 在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b &amp;gt;= a&lt;/code&gt; 时返回 1，否则返回 0，四个边界条件乘起来，落在四边形内的像素 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;visible&lt;/code&gt; 为 1，在外的为 0。最后用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;saturate(source)&lt;/code&gt; 把采样坐标夹到合法范围避免越界采样，再乘上 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;visible&lt;/code&gt;，四边形外的像素 alpha 变成 0，露出下面的棋盘格背景&lt;/p&gt;

&lt;p&gt;注意这里选用的着色器模型是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ps_2_0&lt;/code&gt;，这是 WPF ShaderEffect 支持的传统着色器模型，指令数有限，但应付这个效果绰绰有余&lt;/p&gt;

&lt;h2 id=&quot;运行时编译着色器&quot;&gt;运行时编译着色器&lt;/h2&gt;

&lt;p&gt;传统 WPF 的 ShaderEffect 用法是先用 fxc.exe 把 .fx 文件预编译成 .ps 字节码文件，作为资源嵌入程序集，再通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PixelShader&lt;/code&gt; 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UriSource&lt;/code&gt; 加载。这个流程需要额外的构建步骤和文件管理，比较繁琐&lt;/p&gt;

&lt;p&gt;这个 Demo 换了一种思路：把 HLSL 源码直接写成 C# 字符串，程序启动时调用 DirectX 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D3DCompile&lt;/code&gt; 在运行时编译。这样整个项目不需要任何 .fx 文件，也不需要预编译步骤，代码即着色器，自包含且容易修改。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RuntimePixelShaderCompiler&lt;/code&gt; 类封装了这一切&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D3DCompile&lt;/code&gt; 是 d3dcompiler_47.dll 导出的函数，通过 P/Invoke 调用：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DllImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;d3dcompiler_47.dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CharSet&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CharSet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Ansi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;D3DCompile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;nuint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceDataSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;entryPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flags1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flags2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;MarshalAs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UnmanagedType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ID3DBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;MarshalAs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UnmanagedType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ID3DBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;d3dcompiler_47.dll 在 Windows 8.1 及之后的系统都自带，Win10 和 Win11 无需额外安装。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;entryPoint&lt;/code&gt; 传 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;main&quot;&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;target&lt;/code&gt; 传 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;ps_2_0&quot;&lt;/code&gt;，编译成功后字节码写入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code&lt;/code&gt; 指向的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ID3DBlob&lt;/code&gt;，失败时错误信息写入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;errors&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ID3DBlob&lt;/code&gt; 是 DirectX 的 COM 接口，用于存放编译产物，但它在 C# 里没有现成的互操作定义，需要自己声明。整个接口只有两个方法，取数据指针和取数据大小：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ComImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Guid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8BA5FB08-5195-40E2-AC58-0D989C3A0102&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InterfaceType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ComInterfaceType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InterfaceIsIUnknown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ID3DBlob&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PreserveSig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetBufferPointer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PreserveSig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;nuint&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetBufferSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[ComImport]&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[Guid]&lt;/code&gt; 告诉运行时这是一个 COM 接口，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[PreserveSig]&lt;/code&gt; 表示方法直接返回原始值而不是按 HRESULT 约定包装。这是 COM 互操作里比较容易踩坑的地方，少了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[PreserveSig]&lt;/code&gt; 运行时会试图把返回值当作 HRESULT 处理，导致拿不到正确的数据指针&lt;/p&gt;

&lt;p&gt;编译的主流程如下：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PixelShader&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Compile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UTF8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetBytes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ShaderSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;D3DCompile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nuint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;PerspectiveEffect.fx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;ps_2_0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shaderBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;errorBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shaderBlob&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;errorBlob&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&quot;D3DCompile 失败，HRESULT: 0x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;。&quot;&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ReadBlobText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;errorBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetExceptionForHR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;byteCode&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;checked&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaderBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetBufferSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())];&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaderBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetBufferPointer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;byteCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;byteCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pixelShader&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PixelShader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MemoryStream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;byteCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;writable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;pixelShader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetStreamSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pixelShader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;finally&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;errorBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaderBlob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D3DCompile&lt;/code&gt; 返回的是 HRESULT，负数表示失败。失败时优先从 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;errorBlob&lt;/code&gt; 里读出错误文本，能直接看到 HLSL 的编译报错，这对调试着色器非常重要，不然只能看到一个没有信息的 HRESULT&lt;/p&gt;

&lt;p&gt;编译成功之后，把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ID3DBlob&lt;/code&gt; 里的字节码复制到托管数组，包成 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MemoryStream&lt;/code&gt; 交给 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PixelShader.SetStreamSource&lt;/code&gt;。这里的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;checked((int)shaderBlob.GetBufferSize())&lt;/code&gt; 是为了防止在 32 位环境下指针大小转换溢出&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;finally&lt;/code&gt; 块里释放两个 COM 对象很关键。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ID3DBlob&lt;/code&gt; 是 COM 对象，不释放会一直占用内存，而 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Release&lt;/code&gt; 方法做了类型检查再调用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Marshal.ReleaseComObject&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IsComObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ReleaseComObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;封装-shadereffect&quot;&gt;封装 ShaderEffect&lt;/h2&gt;

&lt;p&gt;像素着色器编译好之后，需要一个 WPF 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ShaderEffect&lt;/code&gt; 子类把它包装起来，才能在 XAML 里使用。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PerspectiveEffect&lt;/code&gt; 类就是干这个的&lt;/p&gt;

&lt;p&gt;静态字段保存编译结果，整个程序只需要编译一次：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PixelShader&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Shader&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RuntimePixelShaderCompiler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Compile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接着注册依赖属性。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;InputProperty&lt;/code&gt; 用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RegisterPixelShaderSamplerProperty&lt;/code&gt; 注册，这是采样器属性，对应 HLSL 里的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s0&lt;/code&gt; 寄存器：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DependencyProperty&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;InputProperty&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RegisterPixelShaderSamplerProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;nameof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PerspectiveEffect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;矩阵的三行各用一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Point4D&lt;/code&gt; 类型的依赖属性，通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PixelShaderConstantCallback&lt;/code&gt; 绑定到常量寄存器：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DependencyProperty&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MatrixRow0Property&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DependencyProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;nameof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PerspectiveEffect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UIPropertyMetadata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PixelShaderConstantCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)));&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DependencyProperty&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MatrixRow1Property&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DependencyProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;nameof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PerspectiveEffect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UIPropertyMetadata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PixelShaderConstantCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)));&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DependencyProperty&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MatrixRow2Property&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DependencyProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;nameof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PerspectiveEffect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UIPropertyMetadata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PixelShaderConstantCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;为什么用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Point4D&lt;/code&gt; 而不是直接传 3x3 矩阵？因为 GPU 常量寄存器是按 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;float4&lt;/code&gt; 对齐的，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PixelShaderConstantCallback&lt;/code&gt; 只能传 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;float4&lt;/code&gt;，所以把矩阵的每一行放进一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Point4D&lt;/code&gt;，第四分量闲置为 0。默认值是单位矩阵，这样即使还没设置矩阵，效果也不会把图片弄丢&lt;/p&gt;

&lt;p&gt;构造函数里把编译好的着色器赋给 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PixelShader&lt;/code&gt;，并刷新所有属性的值，让默认值生效：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PerspectiveEffect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;PixelShader&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Shader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;UpdateShaderValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InputProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;UpdateShaderValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow0Property&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;UpdateShaderValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow1Property&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;UpdateShaderValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MatrixRow2Property&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;最后提供 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SetInverseMatrix&lt;/code&gt; 方法，把 3x3 矩阵拆成三行填进 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Point4D&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetInverseMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[,]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfNull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;MatrixRow0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;MatrixRow1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;MatrixRow2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point4D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;注意传入的是逆矩阵，因为着色器需要的是”输出像素到源纹理”的映射。赋值依赖属性会自动触发 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PixelShaderConstantCallback&lt;/code&gt;，把数据传到 GPU 的常量寄存器，无需手动刷新&lt;/p&gt;

&lt;h2 id=&quot;界面布局&quot;&gt;界面布局&lt;/h2&gt;

&lt;p&gt;界面布局在 MainWindow.xaml 里。窗口采用深色主题，核心区域是一个固定逻辑尺寸 900x560 的 Viewport，外层套 Viewbox 让它随窗口缩放：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Viewbox&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Stretch=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Uniform&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Grid&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Viewport&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Width=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;900&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Height=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;560&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ClipToBounds=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        ...
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Viewbox&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ClipToBounds=&quot;True&quot;&lt;/code&gt; 防止变换后的图片画出边界。Viewport 内部依次堆叠三层内容：最底层是棋盘格背景，中间是图片，最上层是交互层&lt;/p&gt;

&lt;p&gt;棋盘格背景用 DrawingBrush 平铺实现，模仿设计软件里的透明棋盘，用来衬托四边形外的透明区域：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Border&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Border.Background&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;DrawingBrush&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;TileMode=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Tile&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Viewport=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0,0,24,24&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ViewportUnits=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Absolute&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;DrawingBrush.Drawing&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;DrawingGroup&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;GeometryDrawing&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Brush=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#242424&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Geometry=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M0,0 H24 V24 H0 Z&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;nt&quot;&gt;&amp;lt;GeometryDrawing&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Brush=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#333333&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Geometry=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M0,0 H12 V12 H0 Z M12,12 H24 V24 H12 Z&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;/DrawingGroup&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/DrawingBrush.Drawing&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/DrawingBrush&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/Border.Background&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;24x24 的方块，左边画深色，右边画浅色，形成棋盘格&lt;/p&gt;

&lt;p&gt;图片层直接显示一张示例图，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Stretch=&quot;Fill&quot;&lt;/code&gt; 让图片填满整个 Viewport，这样单应变换的输入就是整张图：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Image&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;PreviewImage&quot;&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;Source=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/Image.png&quot;&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;Stretch=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Fill&quot;&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;RenderOptions.BitmapScalingMode=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HighQuality&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;最上层的 Canvas 放四边形轮廓和四个拖拽手柄。轮廓是虚线 Polygon，手柄是四个 Thumb，用 Tag 标记角点索引：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Canvas&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;AdornerCanvas&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Background=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Transparent&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Polygon&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Outline&quot;&lt;/span&gt;
             &lt;span class=&quot;na&quot;&gt;Fill=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Transparent&quot;&lt;/span&gt;
             &lt;span class=&quot;na&quot;&gt;Stroke=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#F9AB00&quot;&lt;/span&gt;
             &lt;span class=&quot;na&quot;&gt;StrokeThickness=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2&quot;&lt;/span&gt;
             &lt;span class=&quot;na&quot;&gt;StrokeDashArray=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;5,3&quot;&lt;/span&gt;
             &lt;span class=&quot;na&quot;&gt;IsHitTestVisible=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;False&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Thumb&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;TopLeftThumb&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Tag=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{StaticResource CornerThumbStyle}&quot;&lt;/span&gt;
           &lt;span class=&quot;na&quot;&gt;DragDelta=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CornerThumb_OnDragDelta&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Thumb&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;TopRightThumb&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Tag=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{StaticResource CornerThumbStyle}&quot;&lt;/span&gt;
           &lt;span class=&quot;na&quot;&gt;DragDelta=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CornerThumb_OnDragDelta&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Thumb&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;BottomRightThumb&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Tag=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{StaticResource CornerThumbStyle}&quot;&lt;/span&gt;
           &lt;span class=&quot;na&quot;&gt;DragDelta=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CornerThumb_OnDragDelta&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Thumb&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x:Name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;BottomLeftThumb&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Tag=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{StaticResource CornerThumbStyle}&quot;&lt;/span&gt;
           &lt;span class=&quot;na&quot;&gt;DragDelta=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CornerThumb_OnDragDelta&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Canvas&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thumb 是 WPF 自带的可拖拽控件，非常适合做这种手柄。它的外观通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CornerThumbStyle&lt;/code&gt; 定制成黄色圆环加白色描边，Cursor 设为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SizeAll&lt;/code&gt; 提示可拖拽&lt;/p&gt;

&lt;h2 id=&quot;拖拽交互&quot;&gt;拖拽交互&lt;/h2&gt;

&lt;p&gt;交互逻辑在 MainWindow.xaml.cs 里。所有 Thumb 共用同一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DragDelta&lt;/code&gt; 事件处理函数，通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Tag&lt;/code&gt; 区分是哪个角点：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CornerThumb_OnDragDelta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DragDeltaEventArgs&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thumb&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Thumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Tag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;candidate&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Clamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HorizontalChange&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Viewport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Clamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;VerticalChange&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Viewport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;previous&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;candidate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Homography&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IsConvexQuadrilateral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;previous&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nf&quot;&gt;UpdateVisuals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DragDelta&lt;/code&gt; 给的是本次拖动的像素位移，把它除以 Viewport 的宽高，就换算成了归一化坐标的增量，和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_corners&lt;/code&gt; 的坐标系保持一致。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Math.Clamp&lt;/code&gt; 把角点限制在 0 到 1 范围内，防止拖出图片区域&lt;/p&gt;

&lt;p&gt;这里有一个很妙的细节：先更新角点，再校验凸四边形，如果校验失败就把角点回滚到拖动前的值。也就是说，允许用户把角点拖到”边缘极限”的合法位置，但一旦越过凸四边形的底线，就停留在最后合法状态，不会出现无法恢复的畸形变换&lt;/p&gt;

&lt;p&gt;最后调用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UpdateVisuals&lt;/code&gt; 刷新界面。这个方法把”计算矩阵”和”绘制 UI”串联起来：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UpdateVisuals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inverse&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Homography&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateQuadrilateralToUnitSquare&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_effect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetInverseMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inverse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_corners&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Select&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Viewport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Viewport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;Outline&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Points&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PointCollection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;PositionThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TopLeftThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;PositionThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TopRightThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;PositionThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BottomRightThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;PositionThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BottomLeftThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;先用当前角点算出逆矩阵设置到 Effect，这一行就完成了”数据到 GPU”的传递，着色器马上会用新矩阵重新渲染。然后把归一化坐标乘回 Viewport 的宽高，得到像素坐标，用于更新虚线轮廓和四个手柄的位置。手柄定位时减去 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ThumbRadius&lt;/code&gt;，让手柄圆心对准角点：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PositionThumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Thumb&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ThumbRadius&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetTop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thumb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ThumbRadius&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;构造函数里把 Effect 挂到图片上，并做一次初始绘制：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MainWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;InitializeComponent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;PreviewImage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Effect&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_effect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;UpdateVisuals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;到这里整个 Demo 就闭环了：拖动任意手柄，角点数组变化，矩阵重算，着色器重绘，图片实时变形&lt;/p&gt;

&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;

&lt;p&gt;这个 Demo 麻雀虽小五脏俱全，串起了三条技术线：单应矩阵的数学计算、HLSL 像素着色器、WPF ShaderEffect 与 COM 互操作。其中最容易踩坑的是运行时编译那一段，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ID3DBlob&lt;/code&gt; 的 COM 接口声明、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[PreserveSig]&lt;/code&gt; 特性、COM 对象释放，任何一个疏漏都会导致编译失败或内存泄漏，建议直接复用本文的封装&lt;/p&gt;

&lt;p&gt;如果想要完全了解代码的每个细节，本文末尾有获取全部代码的方法&lt;/p&gt;

&lt;p&gt;本文代码放在 &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/f3a5a4e0c4572d7b4e10ce7dc3cb5496714a9629/WPFDemo/HomographyShaderEffectDemo&quot;&gt;github&lt;/a&gt; 和 &lt;a href=&quot;https://gitee.com/lindexi/lindexi_gd/tree/f3a5a4e0c4572d7b4e10ce7dc3cb5496714a9629/WPFDemo/HomographyShaderEffectDemo&quot;&gt;gitee&lt;/a&gt; 上，可以使用如下命令行拉取代码。我整个代码仓库比较庞大，使用以下命令行可以进行部分拉取，拉取速度比较快&lt;/p&gt;

&lt;p&gt;先创建一个空文件夹，接着使用命令行 cd 命令进入此空文件夹，在命令行里面输入以下代码，即可获取到本文的代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin f3a5a4e0c4572d7b4e10ce7dc3cb5496714a9629
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上使用的是国内的 gitee 的源，如果 gitee 不能访问，请替换为 github 的源。请在命令行继续输入以下代码，将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码，可以发邮件向我要代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin f3a5a4e0c4572d7b4e10ce7dc3cb5496714a9629
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取代码之后，进入 WPFDemo/HomographyShaderEffectDemo 文件夹，即可获取到源代码&lt;/p&gt;

&lt;p&gt;更多技术博客，请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;博客导航&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 07 Aug 2026 00:23:38 +0000</pubDate>
        <link>https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8%E5%83%8F%E7%B4%A0%E7%9D%80%E8%89%B2%E5%99%A8%E5%AE%9E%E7%8E%B0%E5%8D%95%E5%BA%94%E5%8F%98%E6%8D%A2.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8%E5%83%8F%E7%B4%A0%E7%9D%80%E8%89%B2%E5%99%A8%E5%AE%9E%E7%8E%B0%E5%8D%95%E5%BA%94%E5%8F%98%E6%8D%A2.html</guid>
        
        
        <category>WPF</category>
        
      </item>
    
      <item>
        <title>一条自己攒的AI图标制作流水线工具链</title>
        <description>&lt;p&gt;本文记录我自己日常做应用图标的工作流，先让自己写的 CodingAgent 读项目出提示词，再丢给自己写的文生图应用调用 MiniMax 引擎出设计稿，最后让 CodingAgent 写一个 WPF 程序把图标矢量画出来并导出各尺寸。&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2026/07/30 07:06:25 --&gt;

&lt;!-- 发布 --&gt;
&lt;!-- 博客 --&gt;

&lt;p&gt;本文内容由人类主导 AI 辅助编写&lt;/p&gt;

&lt;p&gt;编程工具 CodingAgent 是我自己写的一个编码代理工具，项目地址在  &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/9c25a9b7cddd617d5e67c902fdcc703c5e93aa5d/SemanticKernelSamples/ChatRoom/Code/CodingChatRoom.AvaloniaShell&quot;&gt;https://github.com/lindexi/lindexi_gd/tree/9c25a9b7cddd617d5e67c902fdcc703c5e93aa5d/SemanticKernelSamples/ChatRoom/Code/CodingChatRoom.AvaloniaShell&lt;/a&gt; 。把它挂到项目上，让它读一遍项目代码和描述，自动吐出文生图的提示词。这一步最大的优势是不用自己动脑子想提示词&lt;/p&gt;

&lt;!-- ![](image/一条自己攒的AI图标制作流水线工具链/一条自己攒的AI图标制作流水线工具链0.png) --&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi-20267291955203633.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;拿到提示词之后，丢给我自己写的文生图应用 &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/634e5114577ebe2894d2d70688ab098bb207e1bb/SemanticKernelSamples/MiniMaxSdk/MiniMaxImageGenerationWpf&quot;&gt;https://github.com/lindexi/lindexi_gd/tree/634e5114577ebe2894d2d70688ab098bb207e1bb/SemanticKernelSamples/MiniMaxSdk/MiniMaxImageGenerationWpf&lt;/a&gt; ，底层调用的是 MiniMax 引擎的能力。选 MiniMax 的原因很实在，就是便宜，这是我伙伴友情提供的资源。&lt;/p&gt;

&lt;!-- ![](image/一条自己攒的AI图标制作流水线工具链/一条自己攒的AI图标制作流水线工具链1.png) --&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi-202672919574863.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;设计稿有了，再让 CodingAgent 看一遍，让它写一个 WPF 程序，用 XAML 把图标矢量绘制出来。选 WPF 这条路是因为 LLM 对 XAML 天然有很强的感知，生成的 XAML 代码质量很高，Shape、Path、Gradient 这些元素信手拈来。再加上 WPF 本身就是一个渲染能力拉满的客户端框架，画出来的图标边缘锐利、色彩准确。最关键的是，用 XAML 画的图标可以在做的过程中随时微调，调颜色、调形状、调布局都只需要改几行代码重新跑一遍，这比文生图的微调能力强太多了。最后顺手用 RenderTargetBitmap 程序化导出 16×16、32×32、48×48、256×256 各尺寸 PNG，手动切图的体力活全省了。&lt;/p&gt;

&lt;!-- ![](image/一条自己攒的AI图标制作流水线工具链/一条自己攒的AI图标制作流水线工具链2.png) --&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi-20267291957346815.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;最终成品跑出来的效果就是这样。&lt;/p&gt;

&lt;!-- ![](image/一条自己攒的AI图标制作流水线工具链/一条自己攒的AI图标制作流水线工具链3.png) --&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi-20267291957507440.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;WPF 图标绘制项目地址：&lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/master/WPFDemo/Design/GanufalallcairJearnocheehiche&quot;&gt;https://github.com/lindexi/lindexi_gd/tree/master/WPFDemo/Design/GanufalallcairJearnocheehiche&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;整个流程跑通之后，我做图标的状态基本上就是打开 CodingAgent、喝口水、收图。更多技术博客，请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;博客导航&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 29 Jul 2026 23:06:25 +0000</pubDate>
        <link>https://blog.lindexi.com/post/%E4%B8%80%E6%9D%A1%E8%87%AA%E5%B7%B1%E6%94%92%E7%9A%84AI%E5%9B%BE%E6%A0%87%E5%88%B6%E4%BD%9C%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%B7%A5%E5%85%B7%E9%93%BE.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/%E4%B8%80%E6%9D%A1%E8%87%AA%E5%B7%B1%E6%94%92%E7%9A%84AI%E5%9B%BE%E6%A0%87%E5%88%B6%E4%BD%9C%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%B7%A5%E5%85%B7%E9%93%BE.html</guid>
        
        
      </item>
    
      <item>
        <title>WPF 保持同一个 HWND 将窗口从 X8 单向升级到 A8 透明渲染</title>
        <description>&lt;p&gt;本文将告诉大家如何让一个普通不透明的 WPF 窗口先使用 X8 渲染目标运行，在业务第一次需要透明时保持原 HWND 不变，单向升级到带 Alpha 的 A8 渲染模式。&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2026/07/29 07:15:01 --&gt;

&lt;!-- 发布 --&gt;
&lt;!-- 博客 --&gt;

&lt;p&gt;本文内容由人类主导 AI 辅助编写&lt;/p&gt;

&lt;h2 id=&quot;背景&quot;&gt;背景&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X8&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A8&lt;/code&gt; 对应 WPF 渲染目标常见的两种颜色格式：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X8R8G8B8&lt;/code&gt;（通常称 &lt;strong&gt;X8&lt;/strong&gt;）：每个像素仅保留 RGB，不保留可用于叠加的 Alpha；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A8R8G8B8&lt;/code&gt;（通常称 &lt;strong&gt;A8&lt;/strong&gt;）：每个像素保留 Alpha 通道（ARGB）。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;窗口内容完全不透明时，WPF 更倾向于使用 X8；需要每像素透明/半透明时才需要走 A8。&lt;/p&gt;

&lt;p&gt;在 WPF 里面实现透明窗口，最容易想到的是设置 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllowsTransparency=&quot;True&quot;&lt;/code&gt;。但是这个属性不是运行过程中随意切换的普通视觉属性，它会影响 WPF 创建窗口和选择呈现路径的方式。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllowsTransparency=True&lt;/code&gt; 还会带来明显的性能损耗与额外路径开销。更详细的底层原因可参阅： &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E6%9C%80%E5%BA%95%E5%B1%82%E6%BA%90%E4%BB%A3%E7%A0%81%E4%BA%86%E8%A7%A3-AllowsTransparency-%E6%80%A7%E8%83%BD%E5%B7%AE%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;WPF 从最底层源代码了解 AllowsTransparency 性能差的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果从窗口启动开始就设置 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllowsTransparency=&quot;True&quot;&lt;/code&gt;，WPF 会让窗口进入应用管理的分层窗口呈现路径。对于只在某个功能开启之后才需要透明的窗口来说，这意味着窗口在绝大部分不需要透明的时间里，也要提前承担透明窗口路径的成本。&lt;/p&gt;

&lt;p&gt;我这里的需求稍微特别一些：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;窗口默认完全不透明，希望先按普通窗口运行；&lt;/li&gt;
  &lt;li&gt;透明功能可能很晚才会开启；&lt;/li&gt;
  &lt;li&gt;外部模块已经持有 HWND，不能通过关闭旧窗口、创建新窗口的方式切换；&lt;/li&gt;
  &lt;li&gt;第一次开启透明之后，可以接受本次窗口生命周期内不再恢复真正的 X8；&lt;/li&gt;
  &lt;li&gt;不希望主动选择或依赖 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllowsTransparency=true&lt;/code&gt; 所对应的应用管理型分层窗口呈现路径。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这一路径的核心收益是启动阶段保持普通不透明窗口，从而先减少 DWM Alpha 合成压力与持续渲染开销。&lt;/p&gt;

&lt;p&gt;基于这些约束，可以把问题简化为只处理一次 X8 到 A8 的升级，而不处理更复杂的 A8 到 X8 降级。&lt;/p&gt;

&lt;p&gt;结合 WPF 源码行为，当前场景只有 X8 → A8 的单向升级路线是可复用的，所以不得已不做 A8 → X8 回退。&lt;/p&gt;

&lt;p&gt;最终生命周期如下：&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;窗口启动：X8 + 普通不透明窗口
首次请求透明：安装完整 WindowChrome，触发目标 Alpha 需求
升级完成：A8 + WS_EX_LAYERED + 每像素 Alpha 内容
后续运行：允许改变内容透明度，但不再恢复 X8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;本文对应的完整演示项目放在文末，大家可以自行拉取代码运行。项目使用 .NET 6 WPF 编写。&lt;/p&gt;

&lt;h2 id=&quot;先说能力边界&quot;&gt;先说能力边界&lt;/h2&gt;

&lt;p&gt;本文基于 WPF 已有的透明 clear color 与重建行为，并配合 Win32 扩展窗口样式实现互操作方案。&lt;/p&gt;

&lt;p&gt;它适合以下场景：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;默认阶段需要保留普通不透明窗口的运行方式；&lt;/li&gt;
  &lt;li&gt;首次透明后允许窗口永久停留在带 Alpha 的模式；&lt;/li&gt;
  &lt;li&gt;必须保留同一个窗口对象（同一 HWND），不能关闭并重建窗口；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它不适合以下场景：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;需要频繁在 X8 和 A8 之间来回切换；&lt;/li&gt;
  &lt;li&gt;关闭透明功能后必须恢复真正的 X8 render target；&lt;/li&gt;
  &lt;li&gt;只能依赖 WPF 公开透明窗口契约，不能接受 WPF 与 Win32 的互操作技巧；&lt;/li&gt;
  &lt;li&gt;无法对目标设备进行兼容性和稳定性验证。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这套做法只强调窗口生命周期约束和可观察状态的建立：完整 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndTarget&lt;/code&gt; 清屏色透明、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt; 保持存在。&lt;/p&gt;

&lt;h2 id=&quot;为什么可以只做单向升级&quot;&gt;为什么可以只做单向升级&lt;/h2&gt;

&lt;p&gt;普通 WPF 顶层窗口在不需要目标 Alpha 时，硬件渲染路径通常可以选择：&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;D3DFMT_X8R8G8B8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里的 X8 表示目标不保留可供合成使用的 Alpha。对于完全不透明的窗口，这是自然且直接的选择。&lt;/p&gt;

&lt;p&gt;从 WPF 源码可见，透明 clear color 会把当前窗口的清屏透明度诉求传递给渲染层；当不透明需求变为需要 Alpha 时，WPF 会按该诉求重建 render target 并切到 A8。&lt;/p&gt;

&lt;p&gt;当安装完整 glass 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt; 时，WPF 会把 DWM frame 扩展到整个窗口，同时把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndSource.CompositionTarget.BackgroundColor&lt;/code&gt; 设置为透明。这个透明 clear color 会向 WPF 渲染层表达“目标需要 Alpha”的需求。&lt;/p&gt;

&lt;p&gt;渲染层发现现有目标不满足 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NeedDestinationAlpha&lt;/code&gt; 后，会释放并重建底层 render target，目标格式可从 X8 变为：&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;D3DFMT_A8R8G8B8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个方向是关键：从“不需要 Alpha”变成“需要 Alpha”时，WPF 已有触发目标重建的路径。&lt;/p&gt;

&lt;p&gt;反方向则不同。后续把所有内容重新绘制成不透明，不代表 WPF 会忘记已经记录过的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NeedDestinationAlpha&lt;/code&gt;，也不代表底层目标会自动恢复成 X8。&lt;/p&gt;

&lt;p&gt;因此本文接受一个限制：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;同一个 HWND 一旦完成 A8 升级，本次窗口生命周期内不再尝试回到 X8 模式。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;接受这个限制之后，就不需要通过反射访问 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MediaContext&lt;/code&gt;、channel 或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndTarget&lt;/code&gt; 的内部成员，也不需要自行注销和重新注册 UCE target。&lt;/p&gt;

&lt;h2 id=&quot;需要满足的调用条件&quot;&gt;需要满足的调用条件&lt;/h2&gt;

&lt;p&gt;这个方案不是简单地给窗口加一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt; 就完成了。为避免样式变更与渲染目标/内容准备不同步，需要同时满足以下条件：&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;保持 AllowsTransparency=false
等待 HWND 创建
安装 WM_STYLECHANGING hook
准备透明业务内容
安装完整 WindowChrome
等待一次公开的渲染边界
确认托管端 clear color 已透明
开启 WS_EX_LAYERED 保留逻辑
添加 WS_EX_LAYERED
验证样式没有被 WPF 清除
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;其中两个条件容易写反：&lt;/p&gt;

&lt;p&gt;第一个是先在窗口创建流程中安装 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndSource&lt;/code&gt; hook。它用于拦截样式写入路径，避免 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt; 在状态切换中被清理。&lt;/p&gt;

&lt;p&gt;第二个是先通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt; 建立目标 Alpha 需求，再添加 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt;，避免 DWM 条件与 WPF 状态出现阶段性不一致。&lt;/p&gt;

&lt;h2 id=&quot;窗口启动时保持完全不透明&quot;&gt;窗口启动时保持完全不透明&lt;/h2&gt;

&lt;p&gt;项目的窗口明确保持 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllowsTransparency=&quot;False&quot;&lt;/code&gt;，而且没有在 XAML 中预先安装完整 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Window&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;AllowsTransparency=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;False&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;WindowStyle=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;None&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ResizeMode=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CanMinimize&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{StaticResource PerformanceWindowStyle}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowStyle&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ResizeMode&lt;/code&gt; 建议满足以下条件之一：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowStyle=&quot;None&quot;&lt;/code&gt; 且 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ResizeMode=&quot;CanMinimize&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowStyle=&quot;None&quot;&lt;/code&gt; 且 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ResizeMode=&quot;NoResize&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;默认背景画刷的 Alpha 是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FF&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;SolidColorBrush&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;x:Key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;WindowOpaqueBackgroundBrush&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Color=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#FF0A1020&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;窗口和根布局都使用这个不透明画刷。这样做不是单纯为了视觉效果，而是为了保证透明功能开启之前，窗口内容不依赖透明合成。&lt;/p&gt;

&lt;p&gt;还要避免一开始就在 XAML 里面安装完整 glass 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt;。如果窗口创建后立刻获得透明 clear color，那么 WPF 可能很早就产生目标 Alpha 需求，失去“透明功能开启之前保留 X8”的意义。&lt;/p&gt;

&lt;h2 id=&quot;用状态机表达不可逆生命周期&quot;&gt;用状态机表达不可逆生命周期&lt;/h2&gt;

&lt;p&gt;控制器没有提供 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DisableTransparency&lt;/code&gt; 或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RestoreX8&lt;/code&gt; 方法，而是只公开一次单向升级操作。内部状态如下：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;enum&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;OpaqueX8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Upgrading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;AlphaModeApplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Faulted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这些状态不是为了让代码看起来更复杂，而是为了明确每个阶段允许发生什么：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OpaqueX8&lt;/code&gt; 表示尚未开始升级，可以接受第一次请求；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Upgrading&lt;/code&gt; 表示正在跨越 WPF 渲染和 Win32 样式边界；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlphaModeApplied&lt;/code&gt; 表示上层配置已经完成，重复调用直接返回；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Faulted&lt;/code&gt; 表示升级过程部分失败，不能继续按照初始 X8 状态盲目重试；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Closed&lt;/code&gt; 表示窗口生命周期结束，不能再访问 HWND。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;失败后不自动重试非常重要。第一次尝试有可能已经触发 WPF 创建 A8 目标，只是在设置或验证 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt; 时失败。此时窗口已经不能再被可靠地当成最初的 X8 状态处理。&lt;/p&gt;

&lt;h2 id=&quot;让多个透明请求复用同一个任务&quot;&gt;让多个透明请求复用同一个任务&lt;/h2&gt;

&lt;p&gt;真实业务中，可能有多个模块几乎同时请求开启透明。如果每个调用方都分别安装 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt;、等待渲染并修改窗口样式，就会引入竞争。&lt;/p&gt;

&lt;p&gt;控制器使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_upgradeTask&lt;/code&gt; 缓存第一次升级任务：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AlphaModeApplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CompletedTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UpgradeCoreAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;第一次请求创建任务，后续请求等待同一个任务。这样可以让透明请求具备幂等性，并保证窗口级资源只由一个控制器管理。&lt;/p&gt;

&lt;h2 id=&quot;在-hwnd-创建之后初始化控制器&quot;&gt;在 HWND 创建之后初始化控制器&lt;/h2&gt;

&lt;p&gt;控制器订阅窗口的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SourceInitialized&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Closed&lt;/code&gt; 事件：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SourceInitialized&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnSourceInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnWindowClosed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SourceInitialized&lt;/code&gt; 发生之后，窗口才拥有可用的 HWND。控制器会取得 HWND 和对应的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndSource&lt;/code&gt;，并检查窗口生命周期中句柄没有发生变化：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WindowInteropHelper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FromHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;Cannot obtain the HwndSource for the Window.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;The Window HWND changed during its lifetime.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这段检查对应了本文最核心的业务约束：升级前后必须保留同一个 HWND。&lt;/p&gt;

&lt;p&gt;所有视觉树、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndSource&lt;/code&gt; hook 和窗口样式操作都必须发生在窗口所属的 Dispatcher 线程。控制器在入口使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;VerifyAccess&lt;/code&gt; 尽早拒绝错误线程调用：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;VerifyAccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;使用-wm_stylechanging-保住-ws_ex_layered&quot;&gt;使用 WM_STYLECHANGING 保住 WS_EX_LAYERED&lt;/h2&gt;

&lt;p&gt;控制器先通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndSource.AddHook&lt;/code&gt; 安装消息 hook。等真正准备添加分层窗口样式时，再把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_keepLayeredStyle&lt;/code&gt; 设置为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;hook 只关心扩展样式变化：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WmStyleChanging&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToInt64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GwlExStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;StyleStruct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PtrToStructure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StyleStruct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StyleNew&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;StructureToPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;当 WPF 或其他逻辑准备修改 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GWL_EXSTYLE&lt;/code&gt; 时，这段代码会在 WPF 后续处理之前截获消息，在新的样式值里面强制保留 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt;，并通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;handled = true&lt;/code&gt; 阻止后续 WPF 消息处理再次修改这个值。&lt;/p&gt;

&lt;p&gt;这里的 hook 会拦截开启保留状态之后的所有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GWL_EXSTYLE&lt;/code&gt; 类型 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WM_STYLECHANGING&lt;/code&gt;，不只是“准备清除 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt;”这一种变化。标记消息已处理也可能跳过 WPF 原本针对这条消息执行的其他内部逻辑，因此需要重点覆盖窗口状态切换、DPI 变化和显示设备重建等场景进行验证。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STYLESTRUCT&lt;/code&gt; 里面的样式值始终是两个 32 位 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DWORD&lt;/code&gt;，不会因为进程运行在 64 位环境就变成 64 位：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;StructLayout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LayoutKind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sequential&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;StyleStruct&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StyleOld&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StyleNew&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;升级完成之后也不能立即移除 hook。WPF 可能在窗口缩放、DPI 变化、最大化或其他窗口状态更新中再次调整扩展样式，因此控制器会一直保留 hook，直到窗口关闭。&lt;/p&gt;

&lt;h2 id=&quot;通过完整-windowchrome-请求目标-alpha&quot;&gt;通过完整 WindowChrome 请求目标 Alpha&lt;/h2&gt;

&lt;p&gt;准备透明业务内容之后，控制器安装覆盖整个窗口的 glass frame：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;WindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetWindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowChrome&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;GlassFrameThickness&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;WindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GlassFrameCompleteThickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;CaptionHeight&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;CornerRadius&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CornerRadius&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ResizeBorderThickness&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Thickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;UseAeroCaptionButtons&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里的重点不是自定义标题栏本身，而是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GlassFrameCompleteThickness&lt;/code&gt;。它让 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt; 把 DWM frame 扩展到完整窗口，并使组合目标的背景 clear color 进入透明状态。&lt;/p&gt;

&lt;p&gt;安装之后，控制器还会检查托管端可观察的 clear color：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;HwndTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CompositionTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BackgroundColor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;NotSupportedException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;WindowChrome did not establish a transparent clear color.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个检查可以确认透明 clear color 已经进入托管端渲染链，并触发了对应的目标 Alpha 诉求；这是从业务层最容易观测到的里程碑。&lt;/p&gt;

&lt;h2 id=&quot;等待一个公开-api-能做到的渲染边界&quot;&gt;等待一个公开 API 能做到的渲染边界&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt; 修改 clear color 之后，变化还需要通过 WPF 的 channel 到达渲染线程。示例先等待 Dispatcher 的 Render 优先级，再使窗口失效，最后等待 ContextIdle：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvokeAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;DispatcherPriority&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvalidateVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvokeAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;DispatcherPriority&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContextIdle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里没有等待 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CompositionTarget.Rendering&lt;/code&gt; 事件。因为窗口隐藏、最小化或当前没有活动呈现时，这个事件可能长时间不触发，升级任务就可能一直挂住。&lt;/p&gt;

&lt;p&gt;这段等待只是公开 API 能提供的渲染边界，不等价于 WPF 内部 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MediaContext.CompleteRender()&lt;/code&gt; 的严格 channel 同步。&lt;/p&gt;

&lt;h2 id=&quot;最后才添加-ws_ex_layered&quot;&gt;最后才添加 WS_EX_LAYERED&lt;/h2&gt;

&lt;p&gt;确认 HWND 和透明 clear color 之后，控制器才开启样式保留并添加 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;SetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;VerifyLayeredStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetWindowLongPtr&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SetWindowLongPtr&lt;/code&gt; 返回零不一定代表失败。示例会在调用之前清空 Win32 last error，再结合 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Marshal.GetLastWin32Error()&lt;/code&gt; 判断：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;SetLastError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetWindowLongPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GwlExStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetLastWin32Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Win32Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这是 Win32 互操作里面很容易忽略的细节。如果把所有零返回都当成失败，可能会误报；如果完全不检查 last error，又可能吞掉真实错误。&lt;/p&gt;

&lt;p&gt;这段实现偏保守，正式产品可根据场景决定是否保留所有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;last error&lt;/code&gt; 分支。&lt;/p&gt;

&lt;h2 id=&quot;用不透明安全帧遮住切换过程&quot;&gt;用不透明安全帧遮住切换过程&lt;/h2&gt;

&lt;p&gt;示例项目没有让用户直接看到升级的中间状态，而是在开始升级之前显示一个完全不透明的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TransitionShield&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;TransitionShield&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;_viewModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;MarkUpgrading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;WindowShell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Background&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Brushes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Transparent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;随后才让控制器准备透明内容：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_alphaController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;UpgradeToTransparentAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;PrepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;透明内容准备方法会把窗口背景和根布局改成透明：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PrepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Background&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Brushes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Transparent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;RootSurface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Background&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Brushes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Transparent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;升级完成并跨过一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ContextIdle&lt;/code&gt; 后，再隐藏安全帧：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvokeAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;DispatcherPriority&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContextIdle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;TransitionShield&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Collapsed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这样做的作用是让窗口在准备 A8 目标、透明内容和 Win32 样式期间，仍然输出完全不透明的像素。即使内部切换跨越多个阶段，用户也不会提前看到桌面穿透或未准备完成的透明内容。&lt;/p&gt;

&lt;h2 id=&quot;窗口关闭时取消尚未完成的升级&quot;&gt;窗口关闭时取消尚未完成的升级&lt;/h2&gt;

&lt;p&gt;升级过程包含异步 Dispatcher 等待。如果窗口在等待期间关闭，后续代码不能继续访问已经失效的 HWND。&lt;/p&gt;

&lt;p&gt;控制器使用一个和窗口生命周期绑定的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CancellationTokenSource&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CancellationTokenSource&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_lifetimeCancellationTokenSource&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;窗口关闭或控制器释放时取消等待，并移除消息 hook：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;_disposed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;_lifetimeCancellationTokenSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Cancel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;RemoveHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;升级过程会在安装 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt; 前后、等待渲染后和修改样式前检查取消或对象状态。这不是为了让取消逻辑看起来完整，而是为了避免窗口生命周期结束后继续调用 Win32 API。&lt;/p&gt;

&lt;h2 id=&quot;mvvm-只管理业务状态不持有-hwndsource&quot;&gt;MVVM 只管理业务状态，不持有 HwndSource&lt;/h2&gt;

&lt;p&gt;示例项目使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MainWindowViewModel&lt;/code&gt; 展示当前升级状态和渲染采样数据，但没有把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Window&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndSource&lt;/code&gt; 或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WindowChrome&lt;/code&gt; 放进 ViewModel。&lt;/p&gt;

&lt;p&gt;ViewModel 只表达以下业务状态：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;enum&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TransparencyDemoState&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;OpaqueX8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Upgrading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;AlphaModeApplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Faulted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;窗口代码负责把业务请求转交给 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OneWayAlphaWindowController&lt;/code&gt;。这种划分让界面状态仍然可以通过数据绑定更新，同时把直接依赖 WPF 窗口和 Win32 生命周期的操作留在 View 层服务中。&lt;/p&gt;

&lt;p&gt;如果在更大的 MVVM 项目里面接入，可以使用附加行为或窗口服务做转发；如果项目不按 MVVM 组织，也可以把这一层下沉到窗口服务。&lt;/p&gt;

&lt;h2 id=&quot;演示项目如何采样呈现数据&quot;&gt;演示项目如何采样呈现数据&lt;/h2&gt;

&lt;p&gt;为了方便比较升级前后的表现，示例窗口持续播放旋转、缩放、脉冲、渐变等动画，并订阅 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CompositionTarget.Rendering&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;CompositionTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Rendering&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnCompositionTargetRendering&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;每次回调累加帧数，并大约每秒计算一次 FPS 和平均帧时间：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sampledFrameCount&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_renderedFrameCount&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_lastRenderingSampleFrameCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;framesPerSecond&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sampledFrameCount&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sampleDuration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TotalSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;averageFrameTimeMilliseconds&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;framesPerSecond&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TimeSpan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FromSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;framesPerSecond&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TotalMilliseconds&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里显示的是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CompositionTarget.Rendering&lt;/code&gt; 回调采样，适合帮助观察切换前后是否出现明显卡顿，也可同时采用其他图形诊断工具（如 GPUView、WPA、PresentMon 等）做更深入分析。&lt;/p&gt;

&lt;p&gt;真正评估收益时，建议分别采样：&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;阶段 A：窗口启动后、尚未请求透明的稳定 X8 阶段
阶段 B：首次升级后的稳定 A8 阶段
阶段 C：X8 到 A8 的一次性切换过程
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;建议关注以下数据：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;应用进程 GPU 使用率；&lt;/li&gt;
  &lt;li&gt;DWM GPU 时间；&lt;/li&gt;
  &lt;li&gt;present 次数和稳定帧率；&lt;/li&gt;
  &lt;li&gt;大尺寸窗口下的显存带宽压力；&lt;/li&gt;
  &lt;li&gt;静态窗口和持续动画窗口的差异；&lt;/li&gt;
  &lt;li&gt;切换耗时、UI stall、黑帧和闪烁；&lt;/li&gt;
  &lt;li&gt;硬件渲染、软件回退、远程桌面和设备重建场景。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;不要混用其他-layered-window-能力&quot;&gt;不要混用其他 layered window 能力&lt;/h2&gt;

&lt;p&gt;本文实现的是 WPF 内容自己的每像素 Alpha，不要额外调用：&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;SetLayeredWindowAttributes(..., LWA_ALPHA)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个 API 设置的是整窗常量 Alpha，常用于窗口淡入淡出等整体透明动画，不是窗口内容像素级 Alpha 混合场景，不能代替 A8 render target。&lt;/p&gt;

&lt;p&gt;反射修改 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndTarget.UsesPerPixelOpacity&lt;/code&gt; 会改变 WPF 的内部透明路径，且会与本方案目标路径冲突。&lt;/p&gt;

&lt;p&gt;本方案的设计前提是整个窗口生命周期保持：&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;AllowsTransparency=false
HwndSource.UsesPerPixelOpacity=false
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;升级后如何恢复不透明外观&quot;&gt;升级后如何恢复不透明外观&lt;/h2&gt;

&lt;p&gt;进入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlphaModeApplied&lt;/code&gt; 之后，业务仍然可以把窗口背景和所有内容重新绘制为 Alpha = 255（即完全不透明）。这样用户看到的窗口会恢复为不透的外观。&lt;/p&gt;

&lt;p&gt;但这只是输出仍走 A8 目标并全部绘制成不透明像素，不代表返回了 X8。&lt;/p&gt;

&lt;p&gt;如果业务真的需要重新获得 X8，在这篇单向升级方案里只有一个选择：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;关闭当前窗口，创建一个新的默认不透明窗口，并迁移业务状态。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;建议验证清单&quot;&gt;建议验证清单&lt;/h2&gt;

&lt;p&gt;至少需要在产品支持的环境中验证以下内容：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;窗口启动时没有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt;；&lt;/li&gt;
  &lt;li&gt;升级前窗口背景和根视觉树完全不透明；&lt;/li&gt;
  &lt;li&gt;升级后 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WS_EX_LAYERED&lt;/code&gt; 仍然存在；&lt;/li&gt;
  &lt;li&gt;实际读取并记录 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HwndSource.UsesPerPixelOpacity&lt;/code&gt;，确认它仍然为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;；&lt;/li&gt;
  &lt;li&gt;透明区域可以正确透出，不透明区域没有意外变淡；&lt;/li&gt;
  &lt;li&gt;重复请求不会重复安装 hook 或重复执行升级；&lt;/li&gt;
  &lt;li&gt;resize、最大化、最小化和恢复之后样式仍然存在；&lt;/li&gt;
  &lt;li&gt;DPI 和显示器切换之后透明效果正常；&lt;/li&gt;
  &lt;li&gt;窗口关闭时不会继续访问 HWND；&lt;/li&gt;
  &lt;li&gt;软件渲染、锁屏、远程桌面和显示设备重建之后行为可接受。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果需要验证真实渲染目标格式，可以在自编译 WPF 中观察 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NeedDestinationAlpha&lt;/code&gt; 和目标重建过程，或者使用图形诊断工具确认目标从 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D3DFMT_X8R8G8B8&lt;/code&gt; 变成 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D3DFMT_A8R8G8B8&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&quot;代码实现&quot;&gt;代码实现&lt;/h2&gt;

&lt;p&gt;核心的逻辑只有三段：控制器、窗口调用方、窗口 XAML。&lt;/p&gt;

&lt;h3 id=&quot;onewayalphawindowcontrollercs&quot;&gt;OneWayAlphaWindowController.cs&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.ComponentModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Runtime.InteropServices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Windows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Windows.Interop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Windows.Shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Windows.Threading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;JacaikecejihaiweHeqajearhi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;enum&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;OpaqueX8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Upgrading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;AlphaModeApplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Faulted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sealed&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;OneWayAlphaWindowController&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IDisposable&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GwlExStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WmStyleChanging&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0x007C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0x00080000U&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Window&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HwndSourceHook&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_windowMessageHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CancellationTokenSource&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_lifetimeCancellationTokenSource&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_hookInstalled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_disposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OneWayAlphaWindowController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Window&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfNull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_windowMessageHook&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessageHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;OpaqueX8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SourceInitialized&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnSourceInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnWindowClosed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WindowInteropHelper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Handle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;InitializeHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UpgradeToTransparentAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Action&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfNull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nf&quot;&gt;ThrowIfDisposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;VerifyAccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AlphaModeApplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CompletedTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;OpaqueX8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;$&quot;Cannot upgrade the window while its state is &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UpgradeCoreAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_upgradeTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_disposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_disposed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_lifetimeCancellationTokenSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Cancel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SourceInitialized&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnSourceInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnWindowClosed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;RemoveHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_lifetimeCancellationTokenSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IDisposable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UpgradeCoreAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Action&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;CancellationToken&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_lifetimeCancellationTokenSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Token&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;nf&quot;&gt;EnsureHwndInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Upgrading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfCancellationRequested&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;InstallHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;nf&quot;&gt;prepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfCancellationRequested&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;InstallFullGlassWindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WaitForRenderAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;ThrowIfDisposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;VerifyHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;VerifyTransparentClearColor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfCancellationRequested&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;SetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;VerifyLayeredStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AlphaModeApplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_disposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetExtendedStyleSafely&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;nf&quot;&gt;RemoveHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;State&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaUpgradeState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Faulted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OnSourceInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;InitializeHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OnWindowClosed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InitializeHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;VerifyAccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WindowInteropHelper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;The Window does not have an HWND yet.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FromHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Cannot obtain the HwndSource for the Window.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;The Window HWND changed during its lifetime.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;EnsureHwndInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;InitializeHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InstallHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hookInstalled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;The Window HwndSource is not initialized.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;AddHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_windowMessageHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_hookInstalled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RemoveHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hookInstalled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsDisposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;RemoveHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_windowMessageHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;_hookInstalled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WindowMessageHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_keepLayeredStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WmStyleChanging&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToInt64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GwlExStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;StyleStruct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PtrToStructure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StyleStruct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StyleNew&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;StructureToPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InstallFullGlassWindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;WindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetWindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowChrome&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;GlassFrameThickness&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowChrome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GlassFrameCompleteThickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;CaptionHeight&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;CornerRadius&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CornerRadius&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;ResizeBorderThickness&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Thickness&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;UseAeroCaptionButtons&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WaitForRenderAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CancellationToken&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvokeAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;DispatcherPriority&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ThrowIfCancellationRequested&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvalidateVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvokeAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;DispatcherPriority&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContextIdle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cancellationToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;SetLastError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetWindowLongPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GwlExStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetLastWin32Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Win32Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unchecked&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToInt64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;SetLastError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;previous&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetWindowLongPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;GwlExStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;unchecked&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)));&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetLastWin32Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;previous&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Win32Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;VerifyHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;currentHwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WindowInteropHelper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;currentHwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsDisposed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IsWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;The Window HWND is no longer valid.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;VerifyTransparentClearColor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;HwndTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CompositionTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BackgroundColor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;NotSupportedException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;WindowChrome did not establish a transparent clear color.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetExtendedStyleSafely&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IsWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Win32Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;VerifyLayeredStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetExtendedStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WsExLayered&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;WPF or the operating system removed WS_EX_LAYERED.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ThrowIfDisposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_disposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ObjectDisposedException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;nameof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;OneWayAlphaWindowController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetWindowLongPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetWindowLongPtr64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetWindowLong32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetWindowLongPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetWindowLongPtr64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetWindowLong32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToInt32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;StructLayout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LayoutKind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sequential&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;StyleStruct&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StyleOld&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StyleNew&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DllImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;kernel32.dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetLastError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;errorCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DllImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EntryPoint&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;GetWindowLong&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SetLastError&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetWindowLong32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DllImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EntryPoint&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;GetWindowLongPtr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SetLastError&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetWindowLongPtr64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DllImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EntryPoint&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;SetWindowLong&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SetLastError&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetWindowLong32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DllImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EntryPoint&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;SetWindowLongPtr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SetLastError&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SetWindowLongPtr64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DllImport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MarshalAs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UnmanagedType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;IsWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;mainwindowxamlcs触发升级与异常处理&quot;&gt;MainWindow.xaml.cs（触发升级与异常处理）&lt;/h3&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OneWayAlphaWindowController&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_alphaController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MainWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;InitializeComponent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;DataContext&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_viewModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_alphaController&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OneWayAlphaWindowController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;CompositionTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Rendering&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnCompositionTargetRendering&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Closed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnWindowClosed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UpgradeToTransparentButtonClick&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RoutedEventArgs&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_viewModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsUpgradeEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;TransitionShield&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_viewModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;MarkUpgrading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;WindowShell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Background&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Brushes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Transparent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_alphaController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;UpgradeToTransparentAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PrepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_viewModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;MarkAlphaModeApplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dispatcher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;InvokeAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;DispatcherPriority&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContextIdle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_closed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;TransitionShield&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Visibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Collapsed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;OperationCanceledException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_closed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ex&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Win32Exception&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ex&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NotSupportedException&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ex&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;HandleUpgradeFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PrepareTransparentContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Background&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Brushes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Transparent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;RootSurface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Background&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Brushes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Transparent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;mainwindowxaml关键属性与按钮&quot;&gt;MainWindow.xaml（关键属性与按钮）&lt;/h3&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Window&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;x:Class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;JacaikecejihaiweHeqajearhi.MainWindow&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;AllowsTransparency=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;False&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;WindowStyle=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;None&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ResizeMode=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CanMinimize&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{StaticResource PerformanceWindowStyle}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 其余内容略 --&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;Button&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Click=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;UpgradeToTransparentButtonClick&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;开启透明&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;IsEnabled=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{Binding IsUpgradeEnabled}&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;全部代码&quot;&gt;全部代码&lt;/h3&gt;

&lt;p&gt;本文代码放在 &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/6a0a196819cd1ade5d5ae4aaff2a6b0c374cb5a7/WPFDemo/JacaikecejihaiweHeqajearhi&quot;&gt;github&lt;/a&gt; 和 &lt;a href=&quot;https://gitee.com/lindexi/lindexi_gd/tree/6a0a196819cd1ade5d5ae4aaff2a6b0c374cb5a7/WPFDemo/JacaikecejihaiweHeqajearhi&quot;&gt;gitee&lt;/a&gt; 上，可以使用如下命令行拉取代码。我整个代码仓库比较庞大，使用以下命令行可以进行部分拉取，拉取速度比较快&lt;/p&gt;

&lt;p&gt;先创建一个空文件夹，接着使用命令行 cd 命令进入此空文件夹，在命令行里面输入以下代码，即可获取到本文的代码&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 6a0a196819cd1ade5d5ae4aaff2a6b0c374cb5a7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上使用的是国内的 gitee 的源，如果 gitee 不能访问，请替换为 github 的源。请在命令行继续输入以下代码，将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码，可以发邮件向我要代码&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 6a0a196819cd1ade5d5ae4aaff2a6b0c374cb5a7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取代码之后，进入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WPFDemo/JacaikecejihaiweHeqajearhi&lt;/code&gt; 文件夹，即可获取到源代码&lt;/p&gt;

&lt;p&gt;更多技术博客，请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;博客导航&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 28 Jul 2026 23:15:01 +0000</pubDate>
        <link>https://blog.lindexi.com/post/WPF-%E4%BF%9D%E6%8C%81%E5%90%8C%E4%B8%80%E4%B8%AA-HWND-%E5%B0%86%E7%AA%97%E5%8F%A3%E4%BB%8E-X8-%E5%8D%95%E5%90%91%E5%8D%87%E7%BA%A7%E5%88%B0-A8-%E9%80%8F%E6%98%8E%E6%B8%B2%E6%9F%93.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/WPF-%E4%BF%9D%E6%8C%81%E5%90%8C%E4%B8%80%E4%B8%AA-HWND-%E5%B0%86%E7%AA%97%E5%8F%A3%E4%BB%8E-X8-%E5%8D%95%E5%90%91%E5%8D%87%E7%BA%A7%E5%88%B0-A8-%E9%80%8F%E6%98%8E%E6%B8%B2%E6%9F%93.html</guid>
        
        
        <category>WPF</category>
        
      </item>
    
      <item>
        <title>WPF 笔迹延迟优化从硬件到软件的全链路分析</title>
        <description>&lt;p&gt;本文将从触摸框硬件、操作系统、应用程序框架到屏幕显示的全链路，系统性地分析笔迹延迟的来源和优化方法。&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2026/07/22 07:26:14 --&gt;

&lt;!-- 发布 --&gt;
&lt;!-- 博客 --&gt;

&lt;p&gt;本文内容由人类编写 AI 润色&lt;/p&gt;

&lt;p&gt;本文的一开始是看到了文龙大佬写的 &lt;a href=&quot;https://www.cnblogs.com/duwenlong/p/21567901&quot;&gt;为什么同一支手写笔，在 WPF 和 WinUI 3 里的跟手感差这么多？ - 杜文龙 - 博客园&lt;/a&gt; 博客，原本想作为回复的内容。后来写着写着，发现内容比较复杂，便单独写成了这篇博客。&lt;/p&gt;

&lt;p&gt;我从 2016 年左右开始做触摸类白板应用，在这方面也算有些经验。借着这个机会回顾了一番，感谢文龙的博客给了我这个动力。&lt;/p&gt;

&lt;h2 id=&quot;背景&quot;&gt;背景&lt;/h2&gt;

&lt;p&gt;做笔迹应用的同仁们常常会遇到一个困惑：明明触摸框标称的频率很高，渲染帧率也稳定在 60fps，但笔迹就是”不跟手”。实际测量下来，从落笔到屏幕上出现笔迹，延迟可能高达几十甚至上百毫秒。这中间的延迟到底去了哪里？&lt;/p&gt;

&lt;p&gt;笔迹延迟是一个系统性问题，链路极长且复杂：触摸框 → 触摸控制器 → 操作系统内核 → 输入子系统 → 应用程序接收 → 笔迹渲染 → DWM 合成 → 显卡输出 → 显示器显示。这条链路上的每一个环节都可能引入延迟，而任何一个环节的短板都会成为最终用户体验的瓶颈。&lt;/p&gt;

&lt;p&gt;本文将从硬件到软件，逐层拆解笔迹延迟的来源，并给出相应的优化思路。&lt;/p&gt;

&lt;h2 id=&quot;触摸框的平滑算法与驻点延迟&quot;&gt;触摸框的平滑算法与驻点延迟&lt;/h2&gt;

&lt;p&gt;触摸框是整条链路的第一站，也是最容易被忽视的一站。&lt;/p&gt;

&lt;p&gt;触摸框厂商在送测时往往会标榜一个很高的报点率，例如 200Hz 甚至更高。但这里有一个常见的误区：报点率高不代表延迟低。许多触摸框在固件层面内置了平滑算法，即使已经收到了两个新的触摸点，也不会立即推送给系统，而是选择”驻点”——将点暂存起来，等到积累了足够多的点之后，再做平滑处理，然后再逐渐推出去。&lt;/p&gt;

&lt;p&gt;这样做的结果是：触摸框的报点频率测试完全可以达标（每秒确实报了那么多点），但每个点从物理接触到推送出去的延迟却被拉长了。平滑算法越激进，延迟就越大。&lt;/p&gt;

&lt;p&gt;另一个常见的问题是带安卓系统的 Monitor 显示屏。这类设备内部相当于嵌了一个小型的 Android 控制器。触摸数据从触摸框出来后，先进安卓系统，再由安卓转发给 PC。这一层转发带来的性能损耗不可忽视：额外的进程切换、额外的通信协议解析、额外的缓冲区拷贝，每一步都在积累延迟。这种架构的好处是可以在安卓端完成一些独立的手势操作（类似电视机上的交互），但代价就是笔迹延迟的增加。更进一步，如果安卓端有任何画面需要叠加到最终输出（如 OSD 菜单、画中画等），这个叠加逻辑极有可能成为触摸延迟的最大瓶颈。&lt;/p&gt;

&lt;p&gt;还有一个常被人忽略的地方是如果触摸框不是直连 PC，时序问题会变得格外重要。中间任何一个转发部件都可能因为时序处理不当而导致丢点或延迟抖动，甚至可能出现”点序乱序”——后发生的触摸点比先发生的更早到达应用程序。&lt;/p&gt;

&lt;h2 id=&quot;操作系统层接收触摸输入的方式&quot;&gt;操作系统层接收触摸输入的方式&lt;/h2&gt;

&lt;p&gt;应用程序接收触摸输入的方式，直接决定了输入链路上的延迟表现。&lt;/p&gt;

&lt;p&gt;在 Windows 上，接收触摸输入主要有两条路径：RealTimeStylus（RTS）和窗口消息。&lt;/p&gt;

&lt;p&gt;RealTimeStylus 是 Windows 提供的实时触笔输入接口，它的核心优势在于：笔迹数据在专用线程上回调，不经过应用主线程的消息队列。这意味着即使主线程正在处理复杂的业务逻辑或被其他窗口消息阻塞，笔迹数据仍然能够准时到达并被处理。&lt;/p&gt;

&lt;p&gt;而如果走窗口消息路径（如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WM_POINTER&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WM_TOUCH&lt;/code&gt; 等），问题就会复杂得多。窗口消息需要经过消息队列 → GetMessage/PeekMessage → DispatchMessage 的标准流程。如果主线程因为某些业务而卡顿（例如复杂的布局计算、大量的数据绑定更新），消息就无法被及时取出和处理，笔迹延迟随之增加。&lt;/p&gt;

&lt;p&gt;更隐蔽的影响来自系统钩子。如果系统中存在某些全局钩子（比如 RawInput 钩子），这些钩子会在消息传递路径上增加额外的处理环节，进一步拉长输入延迟。在生产环境中测量笔迹延迟时，应当排查是否存在这类钩子。&lt;/p&gt;

&lt;p&gt;除了系统钩子之外，一些过滤器驱动也会影响到触摸延迟。比如想要实现类似提笔即写的功能，这样的功能需要驱动层辅助实现，在驱动层里面对触摸进行的处理也会影响触摸延迟。&lt;/p&gt;

&lt;h2 id=&quot;渲染帧内的时序博弈&quot;&gt;渲染帧内的时序博弈&lt;/h2&gt;

&lt;p&gt;这是许多人容易忽略的一个关键点：笔迹延迟不仅仅取决于渲染有多快，更取决于在一帧渲染中能带上哪个时间点的触摸点。&lt;/p&gt;

&lt;p&gt;具体来说，渲染帧率是固定的（例如 60fps 对应约 16.67ms 一帧）。如果渲染发生在帧周期的早期（即距离上一次垂直同步信号刚过去不久），那么这一帧能带上的”最新”触摸点，实际上是 16ms 之前的点——因为最新的触摸点要等到下一帧才会被渲染。反之，如果渲染发生在帧周期的末尾（越靠近下一次垂直同步），能带上的触摸点就越接近当前时刻。&lt;/p&gt;

&lt;p&gt;这意味着一个反直觉的现象：在某些情况下，应用程序越”卡顿”，测出来的触摸延迟反而越低。这是因为卡顿导致渲染时机后移，恰好落在了帧周期的末尾，从而带上了更接近实时的触摸点。这个结果看起来不符合直觉，但细想却能想得明白——它真的让延迟变低了，只是因为渲染时机凑近了帧末尾，而不是因为系统真的变快了。理解这一点非常重要，它告诉我们单纯对比延迟数字而不控制渲染时序变量，得出的结论可能完全失真。&lt;/p&gt;

&lt;h2 id=&quot;wpf-框架层的-ui-线程与笔迹线程分离&quot;&gt;WPF 框架层的 UI 线程与笔迹线程分离&lt;/h2&gt;

&lt;p&gt;在 WPF 中，默认情况下所有 UI 操作都在主线程上执行，包括笔迹的渲染。这意味着主线程的任何阻塞都会直接反映为笔迹延迟。&lt;/p&gt;

&lt;p&gt;比较有效的做法是将笔迹的接收和渲染放到独立的 UI 线程上。WPF 支持创建多个 UI 线程，每个线程可以拥有自己的 Dispatcher 和窗口。配合 RealTimeStylus 在笔迹线程上接收触摸数据，可以做到笔迹的整个处理链路完全不经过主线程，从而最大程度地规避主线程卡顿导致的问题。&lt;/p&gt;

&lt;p&gt;具体来说，可以创建一个独立的笔迹窗口，运行在单独的 UI 线程上。RealTimeStylus 的输入回调也配置在这个线程上。这样，即使主线程正在进行复杂的业务计算或数据绑定更新，笔迹的接收、处理和渲染完全不受影响。&lt;/p&gt;

&lt;p&gt;至于布局的树遍历，这部分的影响反而非常小。WPF 的视觉树和逻辑树遍历是纯 C# 代码调用，实际测量下来，一次典型的布局遍历和命中测试通常只需要 1-2 毫秒。除非在笔迹上叠加了复杂的笔迹美化逻辑（如贝塞尔平滑、压力模拟、墨迹效果等），否则布局部分不是延迟的主要矛盾。&lt;/p&gt;

&lt;p&gt;真正需要关注的是笔迹的 Path 或 Geometry 的复杂度。如果笔迹用复杂的几何路径表示，随着笔迹长度的增加，几何计算的复杂度也会上升。例如，对一条包含数千个段的 Path 进行裁剪或合并操作，耗时可能远超布局遍历。这需要在实际使用中做分段处理或简化策略。&lt;/p&gt;

&lt;h2 id=&quot;渲染管线的重定向表面与-dwm&quot;&gt;渲染管线的重定向表面与 DWM&lt;/h2&gt;

&lt;p&gt;这是 WPF 和 UWP 在笔迹渲染延迟上最大的差别所在。&lt;/p&gt;

&lt;p&gt;WPF 的渲染走的是重定向表面（Redirected Surface）。简单来说，WPF 将自己的渲染内容输出到一个离屏表面，然后由 DWM（Desktop Window Manager）负责将这个表面与其他窗口的内容合成，最终输出到屏幕。这个过程中，WPF 的输出和最终屏幕显示之间至少隔了一个 DWM 的合成周期（这只是 WPF 渲染的其中一个方式）。&lt;/p&gt;

&lt;p&gt;UWP 则可以使用独立交换链（Independent Flip），直接将笔迹内容送到屏幕，绕过了重定向表面的等待。这也是为什么在相同的硬件条件下，UWP 的笔迹延迟通常明显优于 WPF。&lt;/p&gt;

&lt;p&gt;双缓冲是另一个重要因素。几乎所有客户端桌面应用都开启了双缓冲，这能解决画面撕裂问题，但也意味着渲染内容需要等一个完整的垂直同步周期才能被显示出来。如果能接受画面撕裂（对于笔迹这种实时反馈场景，轻微的撕裂通常看不出来），允许撕裂能减少在 DWM 的等待，让渲染内容更接近最近的触摸点。&lt;/p&gt;

&lt;p&gt;UWP 的笔迹还自带预测算法。预测是指在当前触摸点的基础上，根据速度和加速度推测下一个点的位置，提前绘制出来。在纯对比数据层面，预测能让延迟数字好看很多——这也就是 UWP 带预测时能比 WPF 在数据层面好不少的重要原因。但预测是否真的提升了用户体验，则需要具体情况具体分析：预测准确时手感顺滑，预测不准时会出现”笔迹飞出去再拉回来”的不自然感。&lt;/p&gt;

&lt;h2 id=&quot;显卡驱动与瞬时压力&quot;&gt;显卡驱动与瞬时压力&lt;/h2&gt;

&lt;p&gt;测量 GPU 和 CPU 压力时，有一个常见的陷阱：不要用任务管理器。&lt;/p&gt;

&lt;p&gt;任务管理器的采样频率太低（通常每秒一次），而笔迹渲染只用瞬时的计算能力。比如一帧中笔迹渲染只需要不到 2 毫秒的 GPU 时间，但如果这 2 毫秒内 GPU 恰好正在处理其他任务导致无法及时响应，就会出现瞬时峰值不满足的情况，于是这一帧就卡了。但任务管理器的平均使用率看起来完全正常，可能只有 20% 甚至更低。问题不在于平均负载，而在于瞬时响应的及时性。&lt;/p&gt;

&lt;p&gt;显卡驱动还有一个容易忽略的行为：留帧。某些显卡驱动为了解决 CPU 卡顿时的动画连贯性问题，会在驱动层面缓存几帧画面。在游戏场景下这是好事，能让画面更流畅；但在笔迹场景下，这意味着用户看到的笔迹是几帧之前的”历史”，延迟自然就被拉高了。&lt;/p&gt;

&lt;p&gt;如果无法改动显卡驱动，可以采用可等待交换链（Waitable Swap Chain）的方式，核心原理是从系统到驱动层都不保留额外的帧缓存，每一帧都直接呈现。这是在驱动不可控的情况下，降低延迟的有效手段。&lt;/p&gt;

&lt;p&gt;在非 MPO（Multiplane Overlay，多平面叠加）的情况下，DWM 完成合成后不一定立即推送画面到 HDMI 输出。可以和驱动厂商协商，开启相应模式让 DWM 完成合成时立刻推送画面，减少这一环节的等待。&lt;/p&gt;

&lt;h2 id=&quot;显示器的灰阶响应&quot;&gt;显示器的灰阶响应&lt;/h2&gt;

&lt;p&gt;屏幕硬件本身的渲染也有耗时，专业术语叫 Gray to Gray（灰阶响应时间）。这个参数一开始是衡量液晶分子从一个灰度状态切换到另一个灰度状态所需的时间，但如今在非液晶屏幕上也沿用这个说法了，尽管词义与实际技术内容已经相差甚远，但业界已经习惯这么用了。&lt;/p&gt;

&lt;p&gt;这意味着，你在同样的白色背景画板上画不同颜色的笔迹，最终测量到的延迟时间是有直接影响的。例如，在白色背景上画黑色笔迹，和在白色背景上画红色笔迹，由于涉及的灰阶切换路径不同，测出来的延迟可能相差几毫秒甚至更多。做对比测试时，需要固定背景色和笔迹颜色，否则数据不可比。&lt;/p&gt;

&lt;h2 id=&quot;测量时的注意事项&quot;&gt;测量时的注意事项&lt;/h2&gt;

&lt;p&gt;最后，测量笔迹延迟时，务必关闭一切远程控制软件和录屏软件。这些软件通常通过 hook 图形管线或截取屏幕内容来工作，会显著影响渲染管线的行为，导致测量结果失真。&lt;/p&gt;

&lt;p&gt;更多技术博客，请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;博客导航&lt;/a&gt;&lt;/p&gt;

&lt;!--
- 有时候笔迹的延迟不在于渲染，而在于一帧渲染过程中，能带上多少触摸点。特别是能带上距离时间最近的触摸点是哪个
  - 渲染帧率固定的情况下，如果我在越靠近刷新的末尾执行，那我能带上的触摸点越靠近时间最近的点。这也就是某些时候会测试到，越卡顿时，触摸延迟越低
- 从触摸框到屏幕显示出来，过程路线复杂且多。想要优化，软件和硬件都要给力
- 触摸框上常见错误是为了平滑而驻点，即触摸框即使收到了两个点，却不推送到系统上，因为触摸框想做平滑算法。于是整体延迟就会靠后，且此时只测试触摸框频率，是完全能够达标的
- 有些设备是有带安卓的（Monitor），这里的安卓类似于电视机里面的控制器。触摸如果是从触摸框再进入安卓，然后再转发给到 PC 上，那此链路就会长一些，性能在这里是有损耗的。但如此实现，就可以做到一些类似电视机上的操作，完全某些手势操作在安卓端控制
- 时序非常重要，特别是非触摸框直连 PC 的情况，可能有某些部件会对时序导致丢点和延迟
- 应用程序接收触摸输入的方式很重要，如果不采用 RealTimeStylus 的方式，则需要关注窗口消息的延迟问题。比如系统存在某些钩子影响（如RawInput钩子）  ，以及接收消息循环的主线程是否会因为某些业务而卡顿
- 布局的时候的树的影响接近可以忽略，这方面只是一些纯 C# 代码调用，实际测量几乎不可见，可能在大约 1-2 毫秒内，除非用上了一些笔迹美化逻辑
- 在 WPF 里面，采用另一个 UI 线程去做笔迹绘制，配合 RealTimeStylus 在笔迹线程接收，可以最大程度规避主线程卡顿导致的笔迹延迟问题
- 关注笔迹的 Path 或 Geometry 复杂度，复杂度高了，计算复杂度也就高了，自然延迟就上来了
- 关注瞬时 GPU 压力和 CPU 压力。不能用任务管理器看，任务管理器采样频率太低，笔迹只用瞬时的计算能力，比如仅用不到 2 毫秒，此时峰值无法满足，自然就开始卡顿，但平均使用率却不高
- 重定向表面与 DWM 延迟很重要，这一点才是 UWP 和 WPF 笔迹在渲染延迟上最大的差别
- 允许撕裂能减少在 DWM 的等待。接近所有客户端桌面应用都开双缓冲，开双缓冲能解决撕裂问题，但会带来延迟问题，会有很多时间在等待渲染同步。允许撕裂能减少 DWM 等待，让渲染的内容更接近最近的触摸点，这也是 UWP 和 WPF 笔迹渲染延迟上差别的体现
- 关注显卡驱动的留帧问题，显卡驱动某些情况下，为了解决 CPU 卡顿的时候界面渲染尽可能动画连贯，会尝试留几帧。此时会导致笔迹延迟。改不动显卡驱动的时候，可采用可等待交换链的方式，降低延迟，核心原理就是从系统到驱动层都不留帧画面
- 关注画面采集应用的影响，测量时应该关闭一切远程控制软件，录屏软件
- 关注 DWM 到 HDMI 输出的同步渲染问题，非 MPO（Multiplane overlay 多平面叠加）技术。这个可以和驱动厂商协商，开启模式让 DWM 完成的时候立刻推送画面
- 关注 Monitor 的耗时，如果带安卓的话，关注 HDMI 输出到安卓输出画面的延迟。如果有任何安卓画面需要做叠加到最终输出，则可能这个逻辑是最影响触摸延迟的
- 屏幕硬件渲染本身也有耗时，专业词语叫 Gray to Gray（灰阶响应时间）。这就意味着你采用不同的背景色画板，画不同颜色的笔迹，对最终测量时间是有直接影响的
- 如果能上预测，则预测能在纯对比数据时，有更好看的数据。但不一定能提升用户的体验。这也是 UWP 带预测情况下能比 WPF 好不少的重要原因
--&gt;
</description>
        <pubDate>Tue, 21 Jul 2026 23:26:14 +0000</pubDate>
        <link>https://blog.lindexi.com/post/WPF-%E7%AC%94%E8%BF%B9%E5%BB%B6%E8%BF%9F%E4%BC%98%E5%8C%96%E4%BB%8E%E7%A1%AC%E4%BB%B6%E5%88%B0%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%85%A8%E9%93%BE%E8%B7%AF%E5%88%86%E6%9E%90.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/WPF-%E7%AC%94%E8%BF%B9%E5%BB%B6%E8%BF%9F%E4%BC%98%E5%8C%96%E4%BB%8E%E7%A1%AC%E4%BB%B6%E5%88%B0%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%85%A8%E9%93%BE%E8%B7%AF%E5%88%86%E6%9E%90.html</guid>
        
        
        <category>WPF</category>
        
      </item>
    
      <item>
        <title>AI 时代的设备所见即用</title>
        <description>&lt;p&gt;本文记录的是我的思考内容，本篇是我从 2023 年思考到现在的内容。我感觉我大概对整个方向清晰了，于是记录了本文，期望能给大家带来一些灵感&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2026/06/30 07:03:31 --&gt;

&lt;!-- 发布 --&gt;

&lt;p&gt;我想做的事情很简单：让用户用自己的 AI App 就能操控任何设备。对着手机说话，设备就动。&lt;/p&gt;

&lt;p&gt;先说一下 AI App 是什么。我说的 AI App，就是未来每个人手机里那个懂自己的 AI 助手。它知道你的习惯、喜好、说话方式，你每天跟它聊天，让它帮你做事。可能是某个大厂做的，也可能是某个创业团队做的，形态也许就是一个 App，也许是系统内置的，不重要。重要的是用户会越来越依赖它，跟它越来越默契。&lt;/p&gt;

&lt;p&gt;但你熟悉的是这个 AI，不是每台设备。你走进一间教室、面对一台一体机、坐进一辆车——设备是陌生的。你不知道它的菜单在哪、不知道它有什么功能、不知道出问题该怎么办。最自然的想法就是：继续跟自己的 AI 说，让 AI 去搞定设备。&lt;/p&gt;

&lt;p&gt;这就是我想做的：设备和 AI App 之间的那一层东西。让 AI App 能理解设备、操作设备。用户只跟自己的 AI 对话，不需要学设备。&lt;/p&gt;

&lt;!-- ![](image/AI 时代的设备所见即用/AI 时代的设备所见即用0.png) --&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi-20266292038446146.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;说几个情景。&lt;/p&gt;

&lt;p&gt;科学课上，老师想把种子发芽的实物投到大屏上给全班看。点了展台图标，没反应。再点，还是没反应。学生开始交头接耳。课后才知道是摄像头驱动掉了。如果当时他对着自己的 AI App 说一句”展台打不开了，帮我看看”，AI 自己判断原因，释放占用，打开展台。课堂不会断。&lt;/p&gt;

&lt;p&gt;另一个老师每天早上到教室：开一体机，等启动，打开课件，登录，调音量，切输入源。每天三分钟，一学期五六个小时。对着手机说一句”上课”，全部自动跑完。&lt;/p&gt;

&lt;p&gt;还有个语文老师，公开课前打开 PPT，排版全乱，字体飞了。版本兼容问题，调不过来。说一句”课件排版乱了，帮我调回正常”，AI 识别字体问题，批量替换，两分钟搞定。&lt;/p&gt;

&lt;p&gt;美术课上，老师想用大屏展示梵高的《向日葵》，让学生感受色彩的层次。但屏幕颜色怎么看怎么怪，整幅画泛黄，像蒙了一层旧报纸。翻设置、找显示、点来点去，学生在下面哄堂大笑。老师越着急越是找不到在哪调好。如果她说一句”把屏幕颜色调正常”，AI 自己判断是护眼模式开着，自己找到开关位置，关掉。颜色瞬间对了。&lt;/p&gt;

&lt;p&gt;这些场景里设备功能都在。展台能开，字体能调，护眼模式能关。问题从来不是设备没能力，而是入口藏太深、步骤太多、出了事不知道原因。&lt;/p&gt;

&lt;p&gt;再往下说我要做的具体是什么。&lt;/p&gt;

&lt;p&gt;每台设备上跑一个程序，我们写的。设备出厂带上或者后续装上都行。我把它叫做设备连接器，它做几件事。&lt;/p&gt;

&lt;p&gt;第一是连接。让 AI App 靠近设备时能发现它。可能是扫码，可能是 NFC 碰一下，可能是蓝牙广播，也可能是超声波。方式不重要，重要的是用户不需要输入 IP、不需要手动配对、不需要注册账号。靠近就能连，交互方式便捷轻量。&lt;/p&gt;

&lt;p&gt;第二是理解。设备要能告诉 AI App “我是谁、我能做什么”。一份写给 AI 读的设备说明书，里面有设备身份、能力清单、每种操作怎么调用、已知问题怎么处理。没有人比厂商更懂设备，所以厂商来写基础版。但它不是固定的，这个后面再说。&lt;/p&gt;

&lt;p&gt;第三是执行。AI App 想做什么操作，把指令发过来，设备连接器负责真正去执行。调系统接口也好，改配置文件也好，走 IPC 也好，操作文件也好。这个执行器可以很轻——只做执行，不推理。&lt;/p&gt;

&lt;p&gt;这里有一个分叉，有两个方向。刚才说的是方向一：AI App 把所有事情想清楚，发结构化指令过来，设备端只执行。还有方向二：设备这边自己也带一些智能，AI App 把用户意图用自然语言描述发过来，设备侧的 Agent 自己理解意图、自己决定怎么做。两个方向不是非此即彼，可能并存。比如设备侧可以内置一些预制解决方案，遇到匹配的场景直接走预制方案，没有预制的再让 AI App 去推理。这个还没定。&lt;/p&gt;

&lt;p&gt;回到说明书。它不是静态的。AI 在实际使用中会遇到厂商没写进去的情况：某个隐藏更深的功能入口、某种异常状态的恢复手段、某个报错的真实原因。某次 OTA 应用更新后的行为变更。这些经验可以补充进说明书。一台设备被操作得越多，积累的经验越多，后来的 AI 连接这台设备时直接继承。设备越用越聪明。&lt;/p&gt;

&lt;p&gt;技术方面简单说一下。设备端用 C# .NET，跨平台，Windows 和 Linux 的设备都能跑。AI App 端试错阶段我自己做一个简单的来验证链路，调 DeepSeek 或者别的现成大模型，薄壳应用。甚至于用现成的 IM 工具，如 QQ 等这些。等跑通了，AI App 这边是各大厂的事情，我丝毫不想也不敢上这个赛道，我只做设备连接器这一层，以及我自己的可控设备的这一层。&lt;/p&gt;

&lt;p&gt;路径上，不是先写一份标准等人来接入。纯协议没人理的。得先自己对接具体的设备和场景，做出实际效果给人看。场景一个一个啃下来，连接器这一层在这个过程中自然长出来。积累够了，才有可能变成厂商愿意预装的东西。&lt;/p&gt;

&lt;!-- 目前聚焦教育场景：一体机、大屏、平板。还有很多没想好的，比如第一个突破口选哪个场景、设备侧要不要内置预制方案、软件架构怎么划。但大方向清楚：让用户的 AI App 能操控任何设备，用户只跟自己的 AI 说话，不需要学设备。 --&gt;

&lt;p&gt;还有很多没想好的，比如第一个突破口选哪个场景、设备侧要不要内置预制方案、软件架构怎么划。但大方向清楚：让用户的 AI App 能操控任何设备，用户只跟自己的 AI 说话，不需要学设备。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;现在这个世界上是有很多“屏”的，也有很多设备的。哪怕是像我一样的 IT 深度用户，也会遇到令我无助的设备，面向“屏”干瞪着。人类的与机器的交互形态都会在变化。从一开始的飞机驾驶舱的超级多按钮，到面向电脑的交互，到面向手机、触摸屏的交互。后面的车机上的语音交互，智能家居的语音交互。我不是在想有更新的人类与设备的通讯交互方式，而是想着是否有改变人类与哪台设备的通讯交互方式。是否在陌生设备与人类之间，放入一个人类熟悉的设备&lt;/p&gt;

&lt;p&gt;虽然我认为我自己是想明白了的，但是却很难将这个想法实施起来。我就想将这个想法公开发出来，也许能激发一些伙伴的灵感&lt;/p&gt;

&lt;p&gt;这是 2023 年的思考： &lt;a href=&quot;https://www.cnblogs.com/lindexi/p/17679583.html&quot;&gt;非技术 对以后各大应用功能与 AI 助手的思考 - lindexi - 博客园&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;我请了 AI 帮我润色了一下，以下内容看起来应该比较正式一些&lt;/p&gt;

&lt;p&gt;产品痛点：用户面对物理设备时的困境：功能存在但入口隐蔽、操作路径长、异常状态无法自行诊断。典型场景如教学一体机的护眼模式关闭、展台摄像头切换、侧边栏工具配置——这些操作需要用户具备超出日常经验的技术知识。延伸扩展为一切可操作的设备，甚至未来包括其他嵌入式一体机，或 IOT 设备&lt;/p&gt;

&lt;p&gt;用户侧效应：用户与自己的 AI App 对话，AI App 操作设备。用户不需要学习设备。&lt;/p&gt;

&lt;p&gt;核心卖点： 生态位+护城河建立&lt;/p&gt;

&lt;h2 id=&quot;技术细节&quot;&gt;技术细节&lt;/h2&gt;

&lt;h3 id=&quot;角色&quot;&gt;角色&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;AI App：用户侧 AI 端点。理解用户意图，持有设备能力描述，做推理决策。&lt;/li&gt;
  &lt;li&gt;设备连接器（Device Connector）：设备侧运行时。负责设备被发现、暴露能力描述、接收并执行指令、返回结果。&lt;/li&gt;
  &lt;li&gt;设备：物理硬件与其操作系统。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;组件&quot;&gt;组件&lt;/h3&gt;

&lt;p&gt;设备连接器包含以下模块：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;发现层（Discovery）：使 AI App 在物理邻近范围内感知到设备。途径包括二维码、NFC、BLE 广播、超声波编码等。不限定具体技术，输出统一为设备地址与获取能力描述的入口。&lt;/li&gt;
  &lt;li&gt;能力描述（Agent.md）：一份结构化的、面向 AI 消费的设备能力描述文件。内容包括设备身份、可调用能力列表及其接口定义、已知限制与异常处理方式。由设备厂商编写初始版本；运行时支持由 AI App 回写增量经验，实现设备使用经验的累积与跨用户继承。&lt;/li&gt;
  &lt;li&gt;执行器（Executor）：接收结构化操作指令，映射为系统调用、文件操作、协议指令（如 UDI）、进程管理等。执行器不做推理，仅做执行与状态返回。尺寸目标为极轻量，可嵌入资源受限设备。&lt;/li&gt;
  &lt;li&gt;可选智能层（Device Agent）：在模式 A（AI App 侧推理）之外提供模式 B——设备侧内置推理能力。AI App 将用户意图以自然语言转发，设备侧 Agent 自行理解并调度。两种模式可共存：预制解决方案优先匹配，未命中时回退至 AI App 推理。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;数据流&quot;&gt;数据流&lt;/h3&gt;

&lt;p&gt;模式 A（远端推理）：
用户语音 → AI App 转录与意图识别 → AI App 匹配设备能力描述 → 生成结构化操作指令 → 设备连接器执行 → 返回结果 → AI App 判断是否完成。&lt;/p&gt;

&lt;p&gt;模式 B（设备侧推理）：
用户语音 → AI App 转发自然语言意图 → 设备连接器接收 → 设备侧 Agent 匹配预制方案或自行推理 → 执行 → 返回结果。&lt;/p&gt;

&lt;h2 id=&quot;技术选型&quot;&gt;技术选型&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;设备连接器运行时：C# .NET，采用 Native AOT 编译。跨 Windows/Linux 平台。无运行时依赖。客户端与服务端、连接端与执行端均可统一使用相同的语言和框架，可在确保质量下限的前提下借助 AI 辅助编程。&lt;/li&gt;
  &lt;li&gt;通信协议：待定。初期考虑轻量 HTTP/WebSocket，后续可能针对局域网场景优化。&lt;/li&gt;
  &lt;li&gt;AI App 端：验证阶段为薄壳移动端应用，甚至依托于三方 IM 应用，接入第三方 LLM API（DeepSeek 、豆包 等）。非核心交付物。&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;评论摘要&quot;&gt;评论摘要&lt;/h2&gt;

&lt;p&gt;以下为我摘要在各个群+博客评论的内容，经过 AI 润色后的内容&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;哪个厂商愿意变成「透明硬件盒子」？&lt;/strong&gt; 这不是技术问题，是战略问题。这也是为什么 CarPlay 和 Android Auto 在汽车行业推了很多年，依然有大量车企拒绝——他们不想把车内体验的控制权交给苹果和Google。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Windows上关键的设备操作（显示色彩、驱动管理、系统设置）确实需要管理员权限，而学校IT管理员不给。产品能做，但只能做到「查状态」和「给建议」——不能自动执行。用户价值大打折扣，从「AI自动操控」降级为「AI操作指南」。产品找不到PMF（Product-Market Fit），做不下去。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;安全感+稳定性难以保证。现在有多少人习惯对着手机说「帮我做什么」？Siri、小爱、小艺这些语音助手存在了十年以上，但绝大多数人的使用方式还是「定闹钟」「问天气」「放音乐」——不是「帮我操作这台设备」。除非做得好，否则用户有几次无法达到预期，将会放弃&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;幻想未来某一天，移动设备上的 Agent 已经普及，设备上的协议也都开发完成、支持对接，用户起心动念便可完成对任意设备的调用。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;有没有可能，交互方式既不是触摸，也不是语音，而是人面向自己熟悉的 AI，让这个 AI 去跟各种不一样的设备、系统、应用打交道？&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;现在已经有一个类似的概念了，请看 &lt;a href=&quot;https://raft.build/&quot;&gt;https://raft.build/&lt;/a&gt; 项目，但是侧重点很不同&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;usb-的比喻&quot;&gt;USB 的比喻&lt;/h3&gt;

&lt;p&gt;在USB出现之前，键盘用PS/2口、鼠标用串口、打印机用并口、扫描仪用SCSI口。每接一个新外设都是一场噩梦。USB没有发明更好的鼠标或更好的打印机——它做了一个所有设备都说的「通用语言」。&lt;/p&gt;

&lt;p&gt;这个想法做的不是更好的设备，是&lt;strong&gt;设备与AI之间的USB&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;USB的价值不在于它有多复杂，而在于它让所有设备变得简单。这个连接器的价值不在于它有多聪明，而在于它让所有设备变得「不用学」。&lt;/p&gt;

&lt;p&gt;但谷歌推了这么多年 A2A 也没有起色，可能这个事情不好做。&lt;/p&gt;

&lt;h3 id=&quot;技术方向&quot;&gt;技术方向&lt;/h3&gt;

&lt;p&gt;AI APP 可能没机会，前有豆包、中兴，后有小米、华为。&lt;/p&gt;

&lt;p&gt;技术上有两个大方向：&lt;/p&gt;

&lt;p&gt;设备提供 “说明书” Agent.md 让 AI APP 感知到，再提供各种操作路径&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;优势：边际成本低，无 Token 费用。由 AI APP 掏 Token 费用&lt;/li&gt;
  &lt;li&gt;缺点：基础设施搭建、操作路径（各类工具，如前面提到的 CLI 等等）繁杂，适配工作量高&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;设备本身是一个 Agent，AI APP –(自然语言)–&amp;gt; 设备 Agent&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;优势：上限高，没有比厂商自己更懂自己的产品了，体验感可能更高&lt;/li&gt;
  &lt;li&gt;缺点：要烧 Token，每多一个设备都是成本&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 21 Jul 2026 11:57:20 +0000</pubDate>
        <link>https://blog.lindexi.com/post/AI-%E6%97%B6%E4%BB%A3%E7%9A%84%E8%AE%BE%E5%A4%87%E6%89%80%E8%A7%81%E5%8D%B3%E7%94%A8.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/AI-%E6%97%B6%E4%BB%A3%E7%9A%84%E8%AE%BE%E5%A4%87%E6%89%80%E8%A7%81%E5%8D%B3%E7%94%A8.html</guid>
        
        
      </item>
    
      <item>
        <title>Vortice 使用 DirectComposition 显示透明窗口</title>
        <description>&lt;p&gt;通过 DirectComposition 配合 WS_EX_LAYERED 或 WS_EX_NOREDIRECTIONBITMAP 窗口样式，可以让窗口高性能地背景透明，完全依靠 DWM 将窗口背景和桌面画面合成&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2026/02/04 07:15:58 --&gt;
&lt;!-- 发布 --&gt;
&lt;!-- 博客 --&gt;
&lt;!-- 标签：C#,D2D,DirectX,Vortice,Direct2D,渲染,DirectComposition --&gt;

&lt;p&gt;本文是&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-SharpDx-%E6%B8%B2%E6%9F%93%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;渲染相关系列博客&lt;/a&gt;中的一篇，该系列博客已按照逻辑顺序编排，方便大家依次阅读。如您对渲染相关感兴趣，可以通过以下链接访问整个系列：&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-SharpDx-%E6%B8%B2%E6%9F%93%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;渲染相关系列博客导航&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在 &lt;a href=&quot;https://blog.lindexi.com/post/DirectX-%E4%BD%BF%E7%94%A8-Vortice-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%88%9B%E5%BB%BA-Direct2D1-%E7%AA%97%E5%8F%A3%E4%BF%AE%E6%94%B9%E9%A2%9C%E8%89%B2.html&quot;&gt;DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色&lt;/a&gt; 博客中和大家介绍了最简方式创建了窗口和对接了 DirectX 层。在此基础上，大家也能看到此时创建的窗口是无法应用透明背景效果的&lt;/p&gt;

&lt;p&gt;即使强行设置 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SwapChainDescription1.AlphaMode&lt;/code&gt; 为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlphaMode.Premultiplied&lt;/code&gt; 也会在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IDXGIFactory2.CreateSwapChainForHwnd&lt;/code&gt; 报错：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;DXGI ERROR: IDXGIFactory::CreateSwapChain: Alpha blended swapchains must be created with CreateSwapChainForComposition, or CreateSwapChainForCoreWindow with the DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER flag.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;传统 Win32 应用可以通过 UpdateLayeredWindow 方法设置窗口透明，然而 UpdateLayeredWindow 是有比较大的性能代价的，详细请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BB%8E%E6%9C%80%E5%BA%95%E5%B1%82%E6%BA%90%E4%BB%A3%E7%A0%81%E4%BA%86%E8%A7%A3-AllowsTransparency-%E6%80%A7%E8%83%BD%E5%B7%AE%E7%9A%84%E5%8E%9F%E5%9B%A0.html&quot;&gt;WPF 从最底层源代码了解 AllowsTransparency 性能差的原因&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;性能较好的透明窗口实现可参阅 &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E6%94%AF%E6%8C%81%E7%82%B9%E5%87%BB%E7%A9%BF%E9%80%8F%E7%9A%84%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84%E9%80%8F%E6%98%8E%E8%83%8C%E6%99%AF%E5%BC%82%E5%BD%A2%E7%AA%97%E5%8F%A3.html&quot;&gt;WPF 制作支持点击穿透的高性能的透明背景异形窗口&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;以上是在 WPF 框架里面帮忙封装好的，现在咱只有纯控制台，需要自己手动干一些活&lt;/p&gt;

&lt;p&gt;为了方便大家阅读，本文将重新从零控制台开始，先创建好 WS_EX_LAYERED 的窗口，再将 DirectX 对接上去。总代码控制在 500 行左右。额外，为了方便 Win32 方法调用，本文还请出了 CsWin32 库，详细使用方法请参阅 
&lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-CsWin32-%E5%BA%93%E7%AE%80%E5%8C%96-Win32-%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E9%80%BB%E8%BE%91.html&quot;&gt;dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在本文的追加部分内容，补充了 DirectComposition + WS_EX_NOREDIRECTIONBITMAP 制作带标题栏的透明窗口内容方案&lt;/p&gt;

&lt;h2 id=&quot;准备工作&quot;&gt;准备工作&lt;/h2&gt;

&lt;p&gt;按照 .NET 惯例，先安装一些库。本文的 D2D 基本没有戏份，仅用于绘制一点用于辅助测试的内容，本身此技术就和 D2D 无关&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.Direct2D1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.Direct3D11&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.DirectComposition&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.DXGI&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.Win32&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2.3.0&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Microsoft.Windows.CsWin32&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.3.257&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;PrivateAssets&amp;gt;&lt;/span&gt;all&lt;span class=&quot;nt&quot;&gt;&amp;lt;/PrivateAssets&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;IncludeAssets&amp;gt;&lt;/span&gt;runtime; build; native; contentfiles; analyzers&lt;span class=&quot;nt&quot;&gt;&amp;lt;/IncludeAssets&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/PackageReference&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;安装之后的 csproj 项目文件代码如下&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Project&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Sdk=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Microsoft.NET.Sdk&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;OutputType&amp;gt;&lt;/span&gt;Exe&lt;span class=&quot;nt&quot;&gt;&amp;lt;/OutputType&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;net10.0&lt;span class=&quot;nt&quot;&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Nullable&amp;gt;&lt;/span&gt;enable&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Nullable&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;IsAotCompatible&amp;gt;&lt;/span&gt;true&lt;span class=&quot;nt&quot;&gt;&amp;lt;/IsAotCompatible&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PublishAot&amp;gt;&lt;/span&gt;true&lt;span class=&quot;nt&quot;&gt;&amp;lt;/PublishAot&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.Direct2D1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.Direct3D11&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.DirectComposition&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.DXGI&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3.8.2&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Vortice.Win32&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2.3.0&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Microsoft.Windows.CsWin32&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.3.257&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;PrivateAssets&amp;gt;&lt;/span&gt;all&lt;span class=&quot;nt&quot;&gt;&amp;lt;/PrivateAssets&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;IncludeAssets&amp;gt;&lt;/span&gt;runtime; build; native; contentfiles; analyzers&lt;span class=&quot;nt&quot;&gt;&amp;lt;/IncludeAssets&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/PackageReference&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如以上代码所示，本文提供的代码也是 AOT 友好的。在我的测试中，构建的 32 位的程序只需 2.12 MB 的体积。如果不知道本文的项目是如何组织的，可以在本文末尾找到本文全部代码的下载方法，拉取代码了解更多细节&lt;/p&gt;

&lt;p&gt;添加 NativeMethods.txt 文件，添加以下内容，让 CsWin32 辅助生成一些代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;EnumDisplayMonitors&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;GetMonitorInfo&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MONITORINFOEXW&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;EnumDisplaySettings&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;GetDisplayConfigBufferSizes&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;QueryDisplayConfig&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DisplayConfigGetDeviceInfo&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DISPLAYCONFIG_SOURCE_DEVICE_NAME&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DISPLAYCONFIG_TARGET_DEVICE_NAME&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;RegisterClassEx&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;GetModuleHandle&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;LoadCursor&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;IDC_ARROW&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;WndProc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;CreateWindowEx&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;CW_USEDEFAULT&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ShowWindow&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;SW_SHOW&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;GetMessage&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;TranslateMessage&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DispatchMessage&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DefWindowProc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;GetClientRect&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;WM&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;WM_PAINT&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;GetWindowLong&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;SetWindowLong&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DwmIsCompositionEnabled&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;UpdateLayeredWindow&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DwmExtendFrameIntoClientArea&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DCompositionCreateDevice&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上提供的列表是超过本文所用范围的，多了也没有什么关系，一来这是测试项目，二来发布的时候 AOT 带裁剪&lt;/p&gt;

&lt;h2 id=&quot;创建窗口&quot;&gt;创建窗口&lt;/h2&gt;

&lt;p&gt;创建窗口的步骤和 &lt;a href=&quot;https://blog.lindexi.com/post/DirectX-%E4%BD%BF%E7%94%A8-Vortice-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%88%9B%E5%BB%BA-Direct2D1-%E7%AA%97%E5%8F%A3%E4%BF%AE%E6%94%B9%E9%A2%9C%E8%89%B2.html&quot;&gt;上一篇博客&lt;/a&gt; 提供的方法十分接近，只是需要配置 WS_EX_LAYERED 样式，核心代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;n&quot;&gt;WINDOW_EX_STYLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WINDOW_EX_STYLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WS_EX_OVERLAPPEDWINDOW&lt;/span&gt;
                                  &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WINDOW_EX_STYLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WS_EX_LAYERED&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Layered 是透明窗口的关键（但即使没有设置也没关系）&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASS_STYLES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CS_OWNDC&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASS_STYLES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CS_HREDRAW&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASS_STYLES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CS_VREDRAW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultCursor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;LoadCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HINSTANCE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDC_ARROW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;className&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&quot;lindexi-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Guid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NewGuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;The Title&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;fixed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pClassName&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;fixed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pTitle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wndClassEx&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASSEXW&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;cbSize&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SizeOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WNDCLASSEXW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;lpfnWndProc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WNDPROC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WndProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 注： 这里没有作为字段，可能会被 GC 回收，请不要在实际项目这么编写&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;hInstance&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HINSTANCE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetModuleHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DangerousGetHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;hCursor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;hbrBackground&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HBRUSH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;lpszClassName&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pClassName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;ushort&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;atom&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RegisterClassEx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wndClassEx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dwStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WINDOW_STYLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WS_OVERLAPPEDWINDOW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowHwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CreateWindowEx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;exStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;atom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;dwStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1900&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HMENU&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HINSTANCE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上代码放在 CreateWindow 方法中。在开始之前，也先调用 DwmIsCompositionEnabled 方法，判断是否可用&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;nf&quot;&gt;DwmIsCompositionEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compositionEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$&quot;无法启用透明窗口效果&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;预期在 Win10 以上系统都是能使用的，除非系统被魔改&lt;/p&gt;

&lt;p&gt;窗口的消息处理代码 WndProc 先不着急写，等待完成渲染部分的逻辑再一起写&lt;/p&gt;

&lt;p&gt;完成窗口创建之后，即可将窗口显示出来，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CreateWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;ShowWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SHOW_WINDOW_CMD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SW_NORMAL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;随后先开启独立的线程作为渲染线程，再跑起来消息循环&lt;/p&gt;

&lt;p&gt;渲染线程相关逻辑，我封装到 RenderManager 类型里面，其代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;renderManager&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RenderManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;renderManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;StartRenderThread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;跑起来渲染线程之后，使用标准的消息循环跑起来应用&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MSG&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMessageResult&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getMessageResult&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;nf&quot;&gt;TranslateMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;DispatchMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在 RenderManager 里面也提供窗口尺寸变更的方法，可以在消息循环中调用。此时的消息循环的核心代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LRESULT&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WndProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WPARAM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LPARAM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WindowsMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowsMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_NCCALCSIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;LRESULT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowsMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;RenderManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ReSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DefWindowProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上的 WM_NCCALCSIZE 用于声明客户区，通过直接返回 0 告诉系统整个区域都是客户区。否则将出现标题栏不可见，但是点击有效，能拖动窗口也能在原本的最小化、最大化、关闭窗口按钮所在的位置点击响应对应的功能&lt;/p&gt;

&lt;p&gt;透明窗口的实现在窗口创建过程中，最关键点只有 WS_EX_LAYERED 和 WM_NCCALCSIZE 的逻辑 &lt;del&gt;。其中 WM_NCCALCSIZE 最为关键。不带 WS_EX_LAYERED 只会出现边框而已&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;以上为采用 WS_EX_LAYERED 的方式，此方法没有采用 WS_EX_NOREDIRECTIONBITMAP 来的高效。如 &lt;a href=&quot;https://blog.lindexi.com/post/Windows-%E7%AA%97%E5%8F%A3%E6%A0%B7%E5%BC%8F-%E4%BB%80%E4%B9%88%E6%98%AF-WS_EX_NOREDIRECTIONBITMAP-%E6%A0%B7%E5%BC%8F.html&quot;&gt;Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式&lt;/a&gt; 博客所述，可以知道，对比采用 WS_EX_LAYERED 分层窗口的方式需要由 CPU 处理分层窗口导致的性能损耗（不一定，详见注），采用 WS_EX_NOREDIRECTIONBITMAP 方式配合 DirectComposition 可以实现更加高性能的窗口透明效果，直接将 DirectComposition 的像素交给 DWM 合成，可让全过程发生在 GPU 中，无 CPU-GPU 的拷贝损耗和带宽占用&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;注： 从 Windows 8 和 8.1 开始，虽然 User32 一直没有发生显著变化，但细微变化也有，即完全支持 GPU 上的每像素 alpha 值混合处理，且将窗口表面传输到系统内存的费用也取消了。也就是说，如果我不需要执行每像素命中测试，现在就能够生成分层窗口效果，同时不会对性能造成影响
https://learn.microsoft.com/zh-cn/archive/msdn-magazine/2014/june/windows-with-c-high-performance-window-layering-using-the-windows-composition-engine&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;由于本文在编写的时候，本金鱼忘记了 WS_EX_NOREDIRECTIONBITMAP 配置，后面想加上时，担心破坏文章的连贯性，于是将 WS_EX_NOREDIRECTIONBITMAP 部分安排在本文末尾的追加内容中&lt;/p&gt;

&lt;h2 id=&quot;渲染线程&quot;&gt;渲染线程&lt;/h2&gt;

&lt;p&gt;独立的渲染线程也是 WPF 等 UI 框架所采用的方式，只需要新建一个线程跑起来就可以了，如果有心的话，再设置线程为 STA 的就更好，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RenderManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Format&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_colorFormat&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B8G8R8A8_UNorm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;StartRenderThread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thread&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RenderCore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;IsBackground&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Render&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;thread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Priority&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ThreadPriority&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Highest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;thread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上的 RenderCore 就是核心的渲染方法了&lt;/p&gt;

&lt;p&gt;由于渲染线程是独立的，不能在 ReSize 方法直接修改渲染线程相关的逻辑。本文这里简单使用一个字段表示窗口尺寸变更，需要渲染线程修改交换链尺寸&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RenderManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ReSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_isReSize&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_isReSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在 RenderCore 的一开始就是执行初始化逻辑，初始化为本文的关键，核心就是对接 DirectComposition 实现透明窗口效果&lt;/p&gt;

&lt;h2 id=&quot;初始化渲染&quot;&gt;初始化渲染&lt;/h2&gt;

&lt;p&gt;先获取客户区，即窗口尺寸，此尺寸用于后续交换链的创建&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;n&quot;&gt;RECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;GetClientRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;windowRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SizeI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;windowRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bottom&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;按照  &lt;a href=&quot;https://blog.lindexi.com/post/DirectX-%E4%BD%BF%E7%94%A8-Vortice-%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%88%9B%E5%BB%BA-Direct2D1-%E7%AA%97%E5%8F%A3%E4%BF%AE%E6%94%B9%E9%A2%9C%E8%89%B2.html&quot;&gt;上一篇博客&lt;/a&gt; 提供的方法获取显卡信息，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dxgiFactory2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DXGI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CreateDXGIFactory1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDXGIFactory2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;IDXGIAdapter1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hardwareAdapter&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetHardwareAdapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dxgiFactory2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 这里 ToList 只是想列出所有的 IDXGIAdapter1 在实际代码里，大部分都是获取第一个&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FirstOrDefault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hardwareAdapter&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;InvalidOperationException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Cannot detect D3D11 adapter&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IEnumerable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDXGIAdapter1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetHardwareAdapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDXGIFactory2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;IDXGIFactory6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factory6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QueryInterfaceOrNull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDXGIFactory6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;factory6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 这个系统的 DX 支持 IDXGIFactory6 类型&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 先告诉系统，要高性能的显卡&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapterIndex&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                 &lt;span class=&quot;n&quot;&gt;factory6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;EnumAdapterByGpuPreference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adapterIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GpuPreference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HighPerformance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                     &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IDXGIAdapter1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                 &lt;span class=&quot;n&quot;&gt;adapterIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;++)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;AdapterDescription1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;desc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Description1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;desc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Flags&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AdapterFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Software&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AdapterFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;// Don&apos;t select the Basic Render Driver adapter.&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$&quot;枚举到 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Description1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; 显卡&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 不支持就不支持咯，用旧版本的方式获取显示适配器接口&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// 如果枚举不到，那系统返回啥都可以&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapterIndex&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
             &lt;span class=&quot;n&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;EnumAdapters1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adapterIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IDXGIAdapter1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
             &lt;span class=&quot;n&quot;&gt;adapterIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;++)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;AdapterDescription1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;desc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Description1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;desc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Flags&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AdapterFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Software&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AdapterFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// Don&apos;t select the Basic Render Driver adapter.&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

                &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$&quot;枚举到 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Description1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; 显卡&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;尝试创建 ID3D11Device 设备，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;featureLevels&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_12_2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_12_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_12_0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_11_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_11_0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_10_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_10_0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_9_3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_9_2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_9_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;IDXGIAdapter1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hardwareAdapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;DeviceCreationFlags&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;creationFlags&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeviceCreationFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BgraSupport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;D3D11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;D3D11CreateDevice&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;DriverType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Unknown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;creationFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;featureLevels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ID3D11Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11Device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;featureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ID3D11DeviceContext&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11DeviceContext&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;本文以上的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FeatureLevel[]&lt;/code&gt; 中添加了 Level_12_2 等的不合理需求，如果创建失败了，则执行降级逻辑。按照技术原理，只需有 Level_11_1 即可&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 降低等级试试&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;featureLevels&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;//FeatureLevel.Level_12_2,&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;//FeatureLevel.Level_12_1,&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;//FeatureLevel.Level_12_0,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_11_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_11_0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_10_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_10_0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_9_3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_9_2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;FeatureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Level_9_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;D3D11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;D3D11CreateDevice&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;DriverType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Unknown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;creationFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;featureLevels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11Device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;featureLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11DeviceContext&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;将获取到的 ID3D11Device 当成 ID3D11Device1 设备来用，这一步基本不会遇到出错的，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;c1&quot;&gt;// 大部分情况下，用的是 ID3D11Device1 和 ID3D11DeviceContext1 类型&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// 从 ID3D11Device 转换为 ID3D11Device1 类型&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ID3D11Device1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11Device1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11Device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QueryInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ID3D11Device1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11DeviceContext1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11DeviceContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QueryInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ID3D11DeviceContext1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// 获取到了新的两个接口，就可以减少 `d3D11Device` 和 `d3D11DeviceContext` 的引用计数。调用 Dispose 不会释放掉刚才申请的 D3D 资源，只是减少引用计数&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;d3D11Device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;d3D11DeviceContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;准备交换链参数，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;c1&quot;&gt;// 缓存的数量，包括前缓存。大部分应用来说，至少需要两个缓存，这个玩过游戏的伙伴都知道&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FrameCount&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SwapChainDescription1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChainDescription&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Format&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_colorFormat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;BufferCount&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FrameCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;BufferUsage&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Usage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RenderTargetOutput&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;SampleDescription&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SampleDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Scaling&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scaling&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stretch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;SwapEffect&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SwapEffect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FlipSequential&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 使用 FlipSequential 配合 Composition&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;AlphaMode&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Premultiplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Flags&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SwapChainFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;交换链中有以下参数必须固定为此搭配：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scaling： Scaling.Stretch&lt;/li&gt;
  &lt;li&gt;SwapEffect： SwapEffect.FlipDiscard 或 SwapEffect.FlipSequential ，正常来说都会采用 FlipSequential 配合 Composition 使用&lt;/li&gt;
  &lt;li&gt;AlphaMode： AlphaMode.Premultiplied 。使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlphaMode.Ignore&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlphaMode.Unspecified&lt;/code&gt; 参数也是合法的，但是如此就丢失了窗口透明了，不是咱的需求。而 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlphaMode.Straight&lt;/code&gt; 参数则是不搭的&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果以上参数不搭配，则会在创建交换链时，返回 0x887A0001 错误&lt;/p&gt;

&lt;p&gt;上文提到了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlphaMode.Premultiplied&lt;/code&gt; 预乘，简单来说就是最终输出的值里的 RGB 分量都乘以透明度。更多细节请参阅 &lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows/win32/direct2d/supported-pixel-formats-and-alpha-modes#about-premultiplied-and-straight-alpha-modes&quot;&gt;支持的像素格式和 Alpha 模式 - Win32 apps - Microsoft Learn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;判断系统版本，决定能否使用 DirectComposition 功能，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;c1&quot;&gt;// 使用 DirectComposition 才能支持透明窗口&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;useDirectComposition&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// 使用 DirectComposition 时有系统版本要求&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;useDirectComposition&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;useDirectComposition&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OperatingSystem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IsWindowsVersionAtLeast&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如此可以让代码走两个分支，使用 DirectComposition 的分支的代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;n&quot;&gt;IDXGISwapChain1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;useDirectComposition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 使用 CreateSwapChainForComposition 创建支持预乘 Alpha 的 SwapChain&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;dxgiFactory2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateSwapChainForComposition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d3D11Device1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChainDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// 创建 DirectComposition 设备和目标&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;IDXGIDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dxgiDevice&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11Device1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QueryInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDXGIDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;IDCompositionDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionDevice&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DComp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DCompositionCreateDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDCompositionDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dxgiDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;compositionDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateTargetForHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IDCompositionTarget&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// 创建视觉对象并设置 SwapChain 作为内容&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;IDCompositionVisual&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionVisual&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;compositionVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;compositionTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetRoot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compositionVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;compositionDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Commit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;从上面代码可见核心步骤是先让 CreateSwapChainForComposition 创建出交换链对象。再将 ID3D11Device1 当成 IDXGIDevice 设备，用于调用 DComp.DCompositionCreateDevice 创建出 IDCompositionDevice 设备&lt;/p&gt;

&lt;p&gt;调用 IDCompositionDevice 的 CreateTargetForHwnd 方法即可为当前的窗口挂上 IDCompositionTarget 对象。随后再调用 IDCompositionDevice 设备的 CreateVisual 创建 IDCompositionVisual 视觉对象。将刚才创建出来的交换链作为视觉对象的内容，如此即可完成交换链与内容的绑定&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;c1&quot;&gt;// 创建视觉对象并设置 SwapChain 作为内容&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;IDCompositionVisual&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionVisual&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;compositionVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetContent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;现在交换链所渲染的画面已经能够到 IDCompositionVisual 里了，再将 IDCompositionVisual 作为 IDCompositionTarget 的根，即可让 IDCompositionVisual 参与 DWM 合成&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;n&quot;&gt;compositionTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetRoot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compositionVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;compositionDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Commit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果没有 DirectComposition 可用，则依然使用上一篇博客介绍的方法创建交换链，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;n&quot;&gt;IDXGISwapChain1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;useDirectComposition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fullscreenDescription&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SwapChainFullscreenDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;Windowed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// 比如设置为忽略，否则将会报错。错误信息如下，只有 CreateSwapChainForComposition 或 CreateSwapChainForCoreWindow 才能使用&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// DXGI ERROR: IDXGIFactory::CreateSwapChain: Alpha blended swapchains must be created with CreateSwapChainForComposition, or CreateSwapChainForCoreWindow with the DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER flag.&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;swapChainDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AlphaMode&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Ignore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dxgiFactory2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateSwapChainForHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d3D11Device1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChainDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;fullscreenDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上代码的 DirectComposition 为本文的核心，只需要创建出输出带预乘的交换链，配合 WS_EX_LAYERED 窗口，即可渲染出透明窗口&lt;/p&gt;

&lt;p&gt;接下来的逻辑就是和 D2D 对接，尝试渲染透明的界面用于测试&lt;/p&gt;

&lt;h2 id=&quot;对接渲染&quot;&gt;对接渲染&lt;/h2&gt;

&lt;p&gt;由于 D2D 没有什么戏份，本文就只贴出核心代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;D2D.ID2D1Factory1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d2DFactory&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;D2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2D1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2D1CreateFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ID2D1Factory1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;

                &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11Texture2D&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_renderContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SwapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ID3D11Texture2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

                &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dxgiSurface&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d3D11Texture2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QueryInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDXGISurface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;renderTargetProperties&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;D2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;RenderTargetProperties&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;PixelFormat&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PixelFormat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2DColorFormat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vortice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DCommon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AlphaMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Premultiplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;D2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RenderTargetType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;D2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ID2D1RenderTarget&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d2D1RenderTarget&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;d2DFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateDxgiSurfaceRenderTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dxgiSurface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;renderTargetProperties&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_isDisposed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;D2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ID2D1RenderTarget&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;renderTarget&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d2D1RenderTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;renderTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;BeginDraw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

                &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Color4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Shared&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NextSingle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Shared&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NextSingle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Shared&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NextSingle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.1f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;renderTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;renderTarget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;EndDraw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;_renderContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SwapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Present&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PresentFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;_renderContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D3D11DeviceContext1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果准备处理窗口尺寸改变，则需要在循环里面判断 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_isReSize&lt;/code&gt; 字段，调用交换链的 ResizeBuffers 方法，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_isReSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// 处理窗口大小变化&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;_isReSize&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

                &lt;span class=&quot;nf&quot;&gt;GetClientRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pClientRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SizeI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pClientRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pClientRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pClientRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bottom&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pClientRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

                &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_renderContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SwapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ResizeBuffers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;_colorFormat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;SwapChainFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;None&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;尝试运行代码，可见一个不断闪烁的背景透明的窗口&lt;/p&gt;

&lt;h2 id=&quot;代码&quot;&gt;代码&lt;/h2&gt;

&lt;p&gt;本文代码放在 &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/369de6b65c4122cec6a6c9ffbcc0b352a419e83e/DirectX/D2D/FarjairyakaBurnefuwache&quot;&gt;github&lt;/a&gt; 和 &lt;a href=&quot;https://gitee.com/lindexi/lindexi_gd/tree/369de6b65c4122cec6a6c9ffbcc0b352a419e83e/DirectX/D2D/FarjairyakaBurnefuwache&quot;&gt;gitee&lt;/a&gt; 上，可以使用如下命令行拉取代码。我整个代码仓库比较庞大，使用以下命令行可以进行部分拉取，拉取速度比较快&lt;/p&gt;

&lt;p&gt;先创建一个空文件夹，接着使用命令行 cd 命令进入此空文件夹，在命令行里面输入以下代码，即可获取到本文的代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 369de6b65c4122cec6a6c9ffbcc0b352a419e83e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上使用的是国内的 gitee 的源，如果 gitee 不能访问，请替换为 github 的源。请在命令行继续输入以下代码，将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码，可以发邮件向我要代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 369de6b65c4122cec6a6c9ffbcc0b352a419e83e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取代码之后，进入 DirectX/D2D/FarjairyakaBurnefuwache 文件夹，即可获取到源代码&lt;/p&gt;

&lt;p&gt;更多技术博客，请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;博客导航&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;采用-ws_ex_noredirectionbitmap-的方案&quot;&gt;采用 WS_EX_NOREDIRECTIONBITMAP 的方案&lt;/h2&gt;

&lt;p&gt;上文提及的是采用 WS_EX_LAYERED 分层窗口的方式，此方式与采用 WS_EX_NOREDIRECTIONBITMAP 的方案的代码写法非常接近，只是 WS_EX_NOREDIRECTIONBITMAP 可以带来更高的性能&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;注： 见下文的实际测试。实际上我在 Win10 多个版本、Win11 多个版本，分别对采用 WS_EX_LAYERED 和 WS_EX_NOREDIRECTIONBITMAP 的透明窗口进行实验测试，均获得十分接近的效果。如此可以说明，WS_EX_NOREDIRECTIONBITMAP 也许能带来更高的性能，但是高多少？比 WS_EX_LAYERED 高接近可以忽略的性能。根据此指导思想，无须将旧逻辑的 WS_EX_LAYERED 更换为 WS_EX_NOREDIRECTIONBITMAP 的方案&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;其改动全在 CreateWindow 中，只需将 WINDOW_EX_STYLE 从 WS_EX_LAYERED 换成 WS_EX_NOREDIRECTIONBITMAP 即可&lt;/p&gt;

&lt;p&gt;在使用 WS_EX_NOREDIRECTIONBITMAP 中，还可以在 WndProc 干掉 WM_NCCALCSIZE 用来保留窗口边框，即窗口标题栏&lt;/p&gt;

&lt;p&gt;修改之后的 CreateWindow 方法中的 WINDOW_EX_STYLE 配置如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CreateWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;DwmIsCompositionEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compositionEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compositionEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$&quot;无法启用透明窗口效果&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// [Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式](https://blog.lindexi.com/post/Windows-%E7%AA%97%E5%8F%A3%E6%A0%B7%E5%BC%8F-%E4%BB%80%E4%B9%88%E6%98%AF-WS_EX_NOREDIRECTIONBITMAP-%E6%A0%B7%E5%BC%8F.html )&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;WINDOW_EX_STYLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WINDOW_EX_STYLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WS_EX_NOREDIRECTIONBITMAP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASS_STYLES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CS_OWNDC&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASS_STYLES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CS_HREDRAW&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASS_STYLES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CS_VREDRAW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultCursor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;LoadCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HINSTANCE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDC_ARROW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;className&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&quot;lindexi-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Guid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NewGuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;The Title&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_myInstanceWndProc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WNDPROC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WndProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;fixed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pClassName&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;fixed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pTitle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wndClassEx&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDCLASSEXW&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;cbSize&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SizeOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WNDCLASSEXW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;lpfnWndProc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_myInstanceWndProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;hInstance&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HINSTANCE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetModuleHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DangerousGetHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;hCursor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;hbrBackground&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HBRUSH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;lpszClassName&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pClassName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;ushort&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;atom&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RegisterClassEx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wndClassEx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dwStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WINDOW_STYLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WS_OVERLAPPEDWINDOW&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WINDOW_STYLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WS_VISIBLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowHwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CreateWindowEx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;exStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;*)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;atom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PCWSTR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;dwStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1900&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HMENU&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HINSTANCE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WNDPROC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_myInstanceWndProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;可见核心关键改动只有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WINDOW_EX_STYLE exStyle = WINDOW_EX_STYLE.WS_EX_NOREDIRECTIONBITMAP;&lt;/code&gt; 这一行&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;注： 原博客代码里面，是直接使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;new WNDPROC(WndProc)&lt;/code&gt; 局部变量的写法，会导致当委托被回收的时候，抛出如下异常:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Process terminated.
A callback was made on a garbage collected delegate of type &apos;NearajurkeekallnoYabarfoge!Windows.Win32.UI.WindowsAndMessaging.WNDPROC::Invoke&apos;.
   at Windows.Win32.PInvoke.GetMessage(Windows.Win32.UI.WindowsAndMessaging.MSG*, Windows.Win32.Foundation.HWND, UInt32, UInt32)
   at NearajurkeekallnoYabarfoge.DemoWindow.Run()
   at NearajurkeekallnoYabarfoge.Program.Main(System.String[])
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;解决方法就是将委托放在字段里面，防止被回收。详细请看： &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/pull/85&quot;&gt;https://github.com/lindexi/lindexi_gd/pull/85&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果期望显示标题栏，则可以继续在 WndProc 进行改动，删除 WM_NCCALCSIZE 相关代码，删除之后的代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LRESULT&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WndProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HWND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WPARAM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LPARAM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WindowsMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowsMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_renderManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ReSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DefWindowProc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;更改使用 WS_EX_NOREDIRECTIONBITMAP 的代码放在 &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/5b79f1c45819750fa9e931d78b3797a81c877294/DirectX/D2D/NearajurkeekallnoYabarfoge&quot;&gt;github&lt;/a&gt; 和 &lt;a href=&quot;https://gitee.com/lindexi/lindexi_gd/tree/5b79f1c45819750fa9e931d78b3797a81c877294/DirectX/D2D/NearajurkeekallnoYabarfoge&quot;&gt;gitee&lt;/a&gt; 上，可以使用如下命令行拉取代码。我整个代码仓库比较庞大，使用以下命令行可以进行部分拉取，拉取速度比较快&lt;/p&gt;

&lt;p&gt;先创建一个空文件夹，接着使用命令行 cd 命令进入此空文件夹，在命令行里面输入以下代码，即可获取到本文的代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 5b79f1c45819750fa9e931d78b3797a81c877294
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上使用的是国内的 gitee 的源，如果 gitee 不能访问，请替换为 github 的源。请在命令行继续输入以下代码，将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码，可以发邮件向我要代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 5b79f1c45819750fa9e931d78b3797a81c877294
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取代码之后，进入 DirectX/D2D/NearajurkeekallnoYabarfoge 文件夹，即可获取到源代码&lt;/p&gt;

&lt;p&gt;此方案即可制作出保留窗口标题，窗口内容透明可与窗口背后的内容做 Alpha 透明合成叠加的窗口效果&lt;/p&gt;

&lt;h2 id=&quot;性能提醒&quot;&gt;性能提醒&lt;/h2&gt;

&lt;p&gt;无论是采用 WS_EX_LAYERED 还是 WS_EX_NOREDIRECTIONBITMAP 的方案，都会导致 DWM 需要更多的性能损耗&lt;/p&gt;

&lt;p&gt;如果自己的应用是没有透明背景需求的，建议不要带上这两个选项以降低 DWM 合成的损耗。或依然保持窗口样式，但在交换链配置 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;swapChainDescription.AlphaMode = AlphaMode.Ignore;&lt;/code&gt; 也能减少 DWM 的损耗&lt;/p&gt;

&lt;p&gt;只有在 4k 全屏应用里面，才能比较明显看到开启透明窗口带来的性能损耗&lt;/p&gt;

&lt;h3 id=&quot;性能测试&quot;&gt;性能测试&lt;/h3&gt;

&lt;p&gt;为了说明性能的差异，我做了对比测试&lt;/p&gt;

&lt;p&gt;本次实验的机器配置如下：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;屏幕： 3840x2160 (4K) + 百分百 DPI&lt;/li&gt;
  &lt;li&gt;CPU： i5-12450H&lt;/li&gt;
  &lt;li&gt;GPU： 集显&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;测试结果如下：&lt;/p&gt;

&lt;h4 id=&quot;directcompositionpremultipliedalphamode&quot;&gt;DirectCompositionPremultipliedAlphaMode&lt;/h4&gt;

&lt;p&gt;采用 DirectComposition 和配置交换链的 AlphaMode 为 Premultiplied 预乘，此为本文的演示透明窗口组合效果。代码片段如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &lt;span class=&quot;n&quot;&gt;WINDOW_EX_STYLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exStyle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WINDOW_EX_STYLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WS_EX_NOREDIRECTIONBITMAP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;SwapChainDescription1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChainDescription&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clientSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Format&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_colorFormat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;BufferCount&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FrameCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;BufferUsage&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Usage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RenderTargetOutput&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;SampleDescription&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SampleDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Scaling&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scaling&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stretch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;SwapEffect&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SwapEffect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FlipSequential&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 使用 FlipSequential 配合 Composition&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;AlphaMode&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AlphaMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Premultiplied&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Flags&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SwapChainFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChain&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dxgiFactory2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateSwapChainForComposition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d3D11Device1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;swapChainDescription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行效果：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CPU： 忽略不计&lt;/li&gt;
  &lt;li&gt;GPU： 占用 75-80&lt;/li&gt;
  &lt;li&gt;DWM： 占用 65-70&lt;/li&gt;
  &lt;li&gt;满帧率&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可见此时会让 DWM 非常繁忙。整体的 GPU 占用比较高&lt;/p&gt;

&lt;h4 id=&quot;directcompositionwithws_ex_layered&quot;&gt;DirectCompositionWithWS_EX_LAYERED&lt;/h4&gt;

&lt;p&gt;和 DirectCompositionPremultipliedAlphaMode 不同的是，仅将窗口样式从 WS_EX_NOREDIRECTIONBITMAP 换成 WS_EX_LAYERED 而已，代码差异如下&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;-       WINDOW_EX_STYLE exStyle = WINDOW_EX_STYLE.WS_EX_NOREDIRECTIONBITMAP;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+       WINDOW_EX_STYLE exStyle = WINDOW_EX_STYLE.WS_EX_LAYERED;
&lt;/span&gt;
        SwapChainDescription1 swapChainDescription = new()
        {
            Width = (uint) clientSize.Width,
            Height = (uint) clientSize.Height,
            Format = _colorFormat,
            BufferCount = FrameCount,
            BufferUsage = Usage.RenderTargetOutput,
            SampleDescription = SampleDescription.Default,
            Scaling = Scaling.Stretch,
            SwapEffect = SwapEffect.FlipSequential, // 使用 FlipSequential 配合 Composition
            AlphaMode = AlphaMode.Premultiplied,
            Flags = SwapChainFlags.None,
        };

        var swapChain = dxgiFactory2.CreateSwapChainForComposition(d3D11Device1, swapChainDescription);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行效果：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CPU： 忽略不计&lt;/li&gt;
  &lt;li&gt;GPU： 占用 77-85&lt;/li&gt;
  &lt;li&gt;DWM： 占用 75-80&lt;/li&gt;
  &lt;li&gt;满帧率&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可见采用 WS_EX_LAYERED 样式基本和 WS_EX_NOREDIRECTIONBITMAP 持平，差异几乎测试不到，符合文档说明内容&lt;/p&gt;

&lt;h4 id=&quot;directcompositionignorealphamode&quot;&gt;DirectCompositionIgnoreAlphaMode&lt;/h4&gt;

&lt;p&gt;和 DirectCompositionPremultipliedAlphaMode 不同的是，仅将 AlphaMode 设置为忽略，此时将丢失窗口透明效果&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        WINDOW_EX_STYLE exStyle = WINDOW_EX_STYLE.WS_EX_NOREDIRECTIONBITMAP;

-       swapChainDescription.AlphaMode = AlphaMode.Premultiplied;
&lt;span class=&quot;gi&quot;&gt;+       swapChainDescription.AlphaMode = AlphaMode.Ignore;
&lt;/span&gt;
        var swapChain = dxgiFactory2.CreateSwapChainForComposition(d3D11Device1, swapChainDescription);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行效果：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CPU： 忽略不计&lt;/li&gt;
  &lt;li&gt;GPU： 占用 5&lt;/li&gt;
  &lt;li&gt;DWM： 0-1&lt;/li&gt;
  &lt;li&gt;满帧率&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;此时的窗口没有透明效果，聪明的 DWM 也就没有需要执行合成逻辑，自然占用也就少了&lt;/p&gt;

&lt;h4 id=&quot;directcompositionwithoutws_ex_noredirectionbitmap&quot;&gt;DirectCompositionWithoutWS_EX_NOREDIRECTIONBITMAP&lt;/h4&gt;

&lt;p&gt;和 DirectCompositionPremultipliedAlphaMode 不同的是，去掉了窗口的 WS_EX_NOREDIRECTIONBITMAP 样式，此时也会丢失窗口的透明效果，且这个组合是不正确的，正常不会有人会这么做&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;-        WINDOW_EX_STYLE exStyle = WINDOW_EX_STYLE.WS_EX_NOREDIRECTIONBITMAP;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+        WINDOW_EX_STYLE exStyle = default;
&lt;/span&gt;
        swapChainDescription.AlphaMode = AlphaMode.Premultiplied;

        var swapChain = dxgiFactory2.CreateSwapChainForComposition(d3D11Device1, swapChainDescription);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行效果：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CPU： 忽略不计&lt;/li&gt;
  &lt;li&gt;GPU： 占用 45-50&lt;/li&gt;
  &lt;li&gt;DWM： 40&lt;/li&gt;
  &lt;li&gt;满帧率&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这个组合比较奇怪，跑出来的效果也比较奇怪。我感觉是因为此时需要重定向表面，导致存在一些带宽损耗&lt;/p&gt;

&lt;h4 id=&quot;createswapchainforhwnd&quot;&gt;CreateSwapChainForHwnd&lt;/h4&gt;

&lt;p&gt;直接使用 CreateSwapChainForHwnd 传统方式，不再使用 DirectComposition 创建，丢失窗口透明效果，代码差异如下&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        WINDOW_EX_STYLE exStyle = WINDOW_EX_STYLE.WS_EX_NOREDIRECTIONBITMAP;

-       swapChainDescription.AlphaMode = AlphaMode.Premultiplied;
&lt;span class=&quot;gi&quot;&gt;+       swapChainDescription.AlphaMode = AlphaMode.Ignore;
&lt;/span&gt;
-       var swapChain = dxgiFactory2.CreateSwapChainForComposition(d3D11Device1, swapChainDescription);
&lt;span class=&quot;gi&quot;&gt;+       var swapChain = dxgiFactory2.CreateSwapChainForHwnd(d3D11Device1, HWND, swapChainDescription, fullscreenDescription);        
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行效果：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CPU： 忽略不计&lt;/li&gt;
  &lt;li&gt;GPU： 占用 5&lt;/li&gt;
  &lt;li&gt;DWM： 0-1&lt;/li&gt;
  &lt;li&gt;满帧率&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;此时可见使用传统的 CreateSwapChainForHwnd 方式和 DirectComposition 忽略 AlphaMode 的性能持平，此时两者都能达到较好的效果&lt;/p&gt;

&lt;p&gt;无论是对 CreateSwapChainForHwnd 设置的 WINDOW_EX_STYLE 为无或 WS_EX_LAYERED 都对此结果没有影响&lt;/p&gt;

&lt;h3 id=&quot;性能测试代码&quot;&gt;性能测试代码&lt;/h3&gt;

&lt;p&gt;以上代码放在 &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/b678a0cc6d689aa63fd1239bb88113ff8a4b9fcd/DirectX/D2D/LurqificelgallRikurneawekearner&quot;&gt;github&lt;/a&gt; 和 &lt;a href=&quot;https://gitee.com/lindexi/lindexi_gd/tree/b678a0cc6d689aa63fd1239bb88113ff8a4b9fcd/DirectX/D2D/LurqificelgallRikurneawekearner&quot;&gt;gitee&lt;/a&gt; 上，可以使用如下命令行拉取代码。我整个代码仓库比较庞大，使用以下命令行可以进行部分拉取，拉取速度比较快&lt;/p&gt;

&lt;p&gt;先创建一个空文件夹，接着使用命令行 cd 命令进入此空文件夹，在命令行里面输入以下代码，即可获取到本文的代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin b678a0cc6d689aa63fd1239bb88113ff8a4b9fcd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上使用的是国内的 gitee 的源，如果 gitee 不能访问，请替换为 github 的源。请在命令行继续输入以下代码，将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码，可以发邮件向我要代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin b678a0cc6d689aa63fd1239bb88113ff8a4b9fcd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取代码之后，进入 DirectX/D2D/LurqificelgallRikurneawekearner 文件夹，即可获取到源代码&lt;/p&gt;

&lt;h2 id=&quot;特别感谢&quot;&gt;特别感谢&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;特别感谢 &lt;a href=&quot;https://github.com/luojunyuan&quot;&gt;@luojunyuan&lt;/a&gt; 帮忙修复博客示例代码&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;更多博客&quot;&gt;更多博客&lt;/h2&gt;

&lt;p&gt;渲染部分，关于 SharpDx 和 Vortice 的使用方法，包括入门级教程，请参阅：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-SharpDx-%E6%B8%B2%E6%9F%93%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;渲染博客导航&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.lindexi.com/post/sharpdx.html&quot;&gt;SharpDX 系列&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;更多关于我博客请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;博客导航&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Jul 2026 06:48:29 +0000</pubDate>
        <link>https://blog.lindexi.com/post/Vortice-%E4%BD%BF%E7%94%A8-DirectComposition-%E6%98%BE%E7%A4%BA%E9%80%8F%E6%98%8E%E7%AA%97%E5%8F%A3.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/Vortice-%E4%BD%BF%E7%94%A8-DirectComposition-%E6%98%BE%E7%A4%BA%E9%80%8F%E6%98%8E%E7%AA%97%E5%8F%A3.html</guid>
        
        
        <category>C#</category>
        
        <category>D2D</category>
        
        <category>DirectX</category>
        
        <category>Vortice</category>
        
        <category>Direct2D</category>
        
        <category>渲染</category>
        
        <category>DirectComposition</category>
        
      </item>
    
      <item>
        <title>WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹</title>
        <description>&lt;p&gt;本文将告诉大家如何在 WPF 里面，接收裸 Win 32 的 WM_Pointer 消息，从消息里面获取触摸点信息，使用触摸点信息绘制简单的笔迹&lt;/p&gt;

&lt;!--more--&gt;

&lt;!-- CreateTime:2024/09/01 07:15:43 --&gt;
&lt;!-- 发布 --&gt;
&lt;!-- 博客 --&gt;

&lt;p&gt;开始之前必须说明的是使用本文的方法不会带来什么优势，既不能带来笔迹书写上的加速，也不能带来笔迹效果的平滑，且代码复杂。本文唯一的作用只是让大家了解一下基础机制&lt;/p&gt;

&lt;p&gt;需要再次说明的是，在 WPF 里面，开启了 WM_Pointer 消息之后，通过 Touch 或 Stylus 事件收到的信息也是从 WM_Pointer 消息里面过来的。大家可以尝试在 Touch 事件监听函数添加断点，通过堆栈可以看到是从 Windows 消息循环来的&lt;/p&gt;

&lt;p&gt;可以从调用堆栈看到如下函数，此函数就是核心的 WPF 框架里面从 WM_Pointer 消息获取触摸信息的代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;gt;	PresentationCore.dll!System.Windows.Interop.HwndPointerInputProvider.System.Windows.Interop.IStylusInputProvider.FilterMessage(nint hwnd, MS.Internal.Interop.WindowMessage msg, nint wParam, nint lParam, ref bool handled)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个 FilterMessage 函数的大概代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;	&lt;span class=&quot;n&quot;&gt;nint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IStylusInputProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FilterMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessage&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PointerLogic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_ENABLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;IsWindowEnabled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Win32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NativeMethods&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;IntPtrToInt32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_POINTERENTER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ProcessMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetPointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RawStylusActions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InRange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TickCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_POINTERUPDATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ProcessMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetPointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RawStylusActions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Move&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TickCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_POINTERDOWN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ProcessMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetPointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RawStylusActions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Down&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TickCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_POINTERUP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ProcessMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetPointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RawStylusActions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Up&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TickCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WindowMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WM_POINTERLEAVE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ProcessMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetPointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RawStylusActions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;OutOfRange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TickCount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
				&lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;由此可以了解到，使用本文自己从 Win32 消息获取的触摸信息，和从 WPF 提供的 Touch 或 Stylus 事件里面获取的触摸信息的来源是相同的&lt;/p&gt;

&lt;p&gt;这时候也许有人会说，在 WPF 里面经过了一些封装，可能性能不如自己写的。我只想说，不要过于自信了哦。且别忘了消息是从 UI 线程里面获取的，无论你用不用 WPF 的事件，在 WPF 底层的解析消息获取触摸数据引发事件的代码都会跑，也就是无论你用不用，需要 WPF 干的活一点都没少。只有一个 UI 线程的情况下，如果用自己解析的，那还会多一点点处理逻辑，完全不如直接使用 WPF 的。再加上 WPF 的解析部分没有多少代码，如果有做性能分析的话，可以看到甚至做路由事件时的命中测试，判断命中到哪个控件和引发事件等逻辑的耗时远比解析来的多。且解析消息的数据耗时接近无法被直接测量出来，即测量所需时间大于解析的性能&lt;/p&gt;

&lt;p&gt;科普就到这里，如果对 WPF 触摸相关感兴趣，请看 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;WPF 触摸相关&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;为了能够在消息里面收到 POINTER 消息，我根据 &lt;a href=&quot;https://blog.lindexi.com/post/WPF-dotnet-core-%E5%A6%82%E4%BD%95%E5%BC%80%E5%90%AF-Pointer-%E6%B6%88%E6%81%AF%E7%9A%84%E6%94%AF%E6%8C%81.html&quot;&gt;WPF dotnet core 如何开启 Pointer 消息的支持&lt;/a&gt; 博客提供的方法，在 App 构造函数里面添加如下代码开启 Pointer 消息的支持。本文内容里面只给出关键代码片段，如需要全部的项目文件，可到本文末尾找到本文所有代码的下载方法&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;AppContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SetSwitch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Switch.System.Windows.Input.Stylus.EnablePointerSupport&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接下来按照 &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%90%AF%E4%BA%86-Pointer-%E8%A7%A6%E6%91%B8%E6%B6%88%E6%81%AF%E7%9A%84%E6%94%AF%E6%8C%81.html&quot;&gt;WPF 如何确定应用程序开启了 Pointer 触摸消息的支持&lt;/a&gt; 博客提供的方法添加消息监听处理逻辑，如以下代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MainWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;InitializeComponent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;SourceInitialized&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnSourceInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OnSourceInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowInteropHelper&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WindowInteropHelper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;windowInteropHelper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HwndSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FromHwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)!;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;AddHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Hook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Hook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wparam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lparam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 忽略其他代码&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;再定义上一些消息常量，然后跑起来代码确定 Pointer 消息开启成功&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Hook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wparam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lparam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERDOWN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0x0246&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERUPDATE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0x0245&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERUP&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0x0247&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERDOWN&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERUPDATE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERUP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
             &lt;span class=&quot;c1&quot;&gt;// 在这里打断点，如果能进断点则证明 Pointer 消息开启成功&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 忽略其他代码&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntPtr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Zero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以下逻辑需要调用一些 Win32 的 API 函数，为了方便使用，根据 &lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-CsWin32-%E5%BA%93%E7%AE%80%E5%8C%96-Win32-%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E9%80%BB%E8%BE%91.html&quot;&gt;dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑&lt;/a&gt; 博客提供的方法，使用 CsWin32 库简化 Win32 函数调用逻辑，可以减少大量的 PInvoke 定义&lt;/p&gt;

&lt;p&gt;可以避免定义错 PInvoke 函数导致的诡异失败&lt;/p&gt;

&lt;p&gt;编辑 csproj 项目文件，替换为如下代码用于快速安装 CsWin32 库&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Project&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Sdk=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Microsoft.NET.Sdk&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;OutputType&amp;gt;&lt;/span&gt;Exe&lt;span class=&quot;nt&quot;&gt;&amp;lt;/OutputType&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;net9.0-windows&lt;span class=&quot;nt&quot;&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;Nullable&amp;gt;&lt;/span&gt;enable&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Nullable&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;ImplicitUsings&amp;gt;&lt;/span&gt;enable&lt;span class=&quot;nt&quot;&gt;&amp;lt;/ImplicitUsings&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;UseWPF&amp;gt;&lt;/span&gt;true&lt;span class=&quot;nt&quot;&gt;&amp;lt;/UseWPF&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Include=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Microsoft.Windows.CsWin32&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;PrivateAssets=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;all&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.3.106&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;大家可以看到以上的项目文件代码的 OutputType 被我设置为 exe 类型，如此启动项目将会有默认的控制台，方便我在控制台输出内容&lt;/p&gt;

&lt;p&gt;按照 &lt;a href=&quot;https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-CsWin32-%E5%BA%93%E7%AE%80%E5%8C%96-Win32-%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E9%80%BB%E8%BE%91.html&quot;&gt;dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑&lt;/a&gt; 博客提供的方法添加 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NativeMethods.txt&lt;/code&gt; 文件，在此文件里面添加一些代码需要用到的 Win32 函数&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;GetPointerTouchInfo
ScreenToClient
RegisterTouchWindow
WM_TOUCH
GetTouchInputInfo
GetPointerDeviceRects
ClientToScreen
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NativeMethods.txt&lt;/code&gt; 文件添加的是所需的 Win32 函数名，添加之后将会由 CsWin32 库使用源代码生成器方式生成对应的 PInvoke 代码和参数所需的类型，如结构体和枚举&lt;/p&gt;

&lt;p&gt;根据 WPF 的源代码，先将消息过来的 wparam 转换为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pointerId&lt;/code&gt; 参数，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pointerId&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToInt32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wparam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0xFFFF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;PInvoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetPointerTouchInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里需要额外说明的是这个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pointerId&lt;/code&gt; 参数不等于设备 Id 号，即如 WPF 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TouchDevice.Id&lt;/code&gt; 等，这是不相同的，需要使用 &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getpointercursorid&quot;&gt;GetPointerCursorId&lt;/a&gt; 进行关联才能拿到和 WPF 一样的值。但是使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pointerId&lt;/code&gt; 参数去区分不同的触摸点还是可以的&lt;/p&gt;

&lt;p&gt;如此即可拿到核心的 &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-pointer_info&quot;&gt;POINTER_INFO&lt;/a&gt; 结构体对象&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;n&quot;&gt;POINTER_INFO&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pointerInfo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pointerInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;简单处理的话，拿到的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pointerInfo&lt;/code&gt; 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocation&lt;/code&gt; 字段就是当前触摸的坐标点了，采用的是像素坐标，使用屏幕坐标系&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pointerInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ptPixelLocation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;从屏幕坐标系转换为 WPF 坐标系，代码如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;n&quot;&gt;PInvoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ScreenToClient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;不考虑 DPI 的情况下，这样就可以使用了&lt;/p&gt;

&lt;p&gt;按照 &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%9C%80%E7%AE%80%E9%80%BB%E8%BE%91%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%8C%87%E9%A1%BA%E6%BB%91%E7%9A%84%E7%AC%94%E8%BF%B9%E4%B9%A6%E5%86%99.html&quot;&gt;WPF 最简逻辑实现多指顺滑的笔迹书写&lt;/a&gt; 博客提供的方法进行笔迹对接即可绘制出笔迹&lt;/p&gt;

&lt;p&gt;这就是最简单的从 Win32 消息接收 Pointer 消息绘制笔迹的方法&lt;/p&gt;

&lt;p&gt;然而以上的方法也存在不少的问题，比如忽略了 DPI 问题，以及精度问题。在大尺寸触摸屏上，直接使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocation&lt;/code&gt; 字段将会画出锯齿的笔迹。如下图，黑色的线是直接使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocation&lt;/code&gt; 字段收到的触摸点连接的折线&lt;/p&gt;

&lt;!-- ![](image/WPF 记一个特别简单的点集滤波平滑方法/WPF 记一个特别简单的点集滤波平滑方法2.png) --&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.lindexi.site/lindexi%2F2024830160364905.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;上图红色的曲线是使用 &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E8%AE%B0%E4%B8%80%E4%B8%AA%E7%89%B9%E5%88%AB%E7%AE%80%E5%8D%95%E7%9A%84%E7%82%B9%E9%9B%86%E6%BB%A4%E6%B3%A2%E5%B9%B3%E6%BB%91%E6%96%B9%E6%B3%95.html&quot;&gt;WPF 记一个特别简单的点集滤波平滑方法&lt;/a&gt; 博客提供的方法进行平滑的笔迹线
&lt;!-- [WPF 记一个特别简单的点集滤波平滑方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/18387840 ) --&gt;&lt;/p&gt;

&lt;p&gt;在大屏触摸设备上，从硬件层面就有一层平滑算法了，但是受限于硬件的计算资源，只有简单的平滑。在 Windows 的 WISPTIS 模块里面，也会对触摸做一定的平滑算法，如丢弃某些过于离谱的触摸点。关于 Windows 上的 WISPTIS 模块的平滑算法属于我和系统软件，即软硬件工程师，进行合作测试出来的，他输入的点和我使用 BusHound 抓到得点和 WPF 层报告的点做对比，可以看到硬件层发送过来的点和 BusHound 抓到的相同，而和 WPF 层报告的点大部分情况下相同，只有某些点被丢弃。被丢弃的点是我这边设计的杂点。但是如果报告的触摸点，有瞬间飞到 0,0 点的情况，那这个 0,0 点则不会被丢弃&lt;/p&gt;

&lt;p&gt;在 WPF 层上，从消息到 Touch 事件这里，是不会对点的坐标进行处理，不会执行平滑算法，最多只有做控件坐标转换。在 WPF 的 Ink 模块里面才会对输入的点做更进一步的平滑处理&lt;/p&gt;

&lt;p&gt;我对比了从 Pointer 消息的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocation&lt;/code&gt; 字段收到的触摸点对接的 &lt;a href=&quot;https://blog.lindexi.com/post/WPF-%E6%9C%80%E7%AE%80%E9%80%BB%E8%BE%91%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%8C%87%E9%A1%BA%E6%BB%91%E7%9A%84%E7%AC%94%E8%BF%B9%E4%B9%A6%E5%86%99.html&quot;&gt;WPF 最简逻辑实现多指顺滑的笔迹书写&lt;/a&gt; 博客提供的方法，和原始博客提供的程序，可以看到还是原来的笔迹更加顺滑&lt;/p&gt;

&lt;p&gt;其核心原因在于 Pointer 消息的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocation&lt;/code&gt; 字段拿到的是丢失精度的点，像素为单位。如果在精度稍微高的触摸屏下，将会有明显的锯齿效果&lt;/p&gt;

&lt;p&gt;如果想要获取比较高精度的触摸点，可以使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptHimetricLocationRaw&lt;/code&gt; 字段。这里需要对后缀 Raw 作出更多的说明，在微软&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-pointer_info&quot;&gt;官方文档&lt;/a&gt;里面说了不带 Raw 的是预测的值，即 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocation&lt;/code&gt; 是预测的像素坐标点，而 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocationRaw&lt;/code&gt; 是不带预测的像素坐标点。对于咱如果是使用在笔迹上，其实更应该使用的是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptPixelLocationRaw&lt;/code&gt; 是不带预测的像素坐标点。否则预测效果可能会导致毛刺&lt;/p&gt;

&lt;p&gt;使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptHimetricLocationRaw&lt;/code&gt; 字段会稍微复杂，由于 ptHimetricLocationRaw 采用的是 pointerDeviceRect 坐标系，需要转换到屏幕坐标系&lt;/p&gt;

&lt;p&gt;转换方法就是先将 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptHimetricLocationRaw&lt;/code&gt; 的 X 坐标，压缩到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[0-1]&lt;/code&gt; 范围内，然后乘以 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;displayRect&lt;/code&gt; 的宽度，再加上 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;displayRect&lt;/code&gt; 的 left 值，即得到了屏幕坐标系的 X 坐标。压缩到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[0-1]&lt;/code&gt; 范围内的方法就是除以 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pointerDeviceRect&lt;/code&gt; 的宽度。同理可以计算 Y 坐标&lt;/p&gt;

&lt;p&gt;以上的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;displayRect&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pointerDeviceRect&lt;/code&gt; 需要使用 &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getpointerdevicerects&quot;&gt;GetPointerDeviceRects&lt;/a&gt; 函数获取&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;k&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Windows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Win32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foundation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pointerDeviceRect&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Windows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Win32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foundation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayRect&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;PInvoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetPointerDeviceRects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pointerInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sourceDevice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pointerDeviceRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;displayRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上代码用到了不安全代码，记得给 Hook 函数标记上 unsafe 作为不安全代码&lt;/p&gt;

&lt;p&gt;根据上文提供的算法，编写如下代码将 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ptHimetricLocationRaw&lt;/code&gt; 转换为 WPF 坐标系的点&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;c1&quot;&gt;// 如果想要获取比较高精度的触摸点，可以使用 ptHimetricLocationRaw 字段&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 由于 ptHimetricLocationRaw 采用的是 pointerDeviceRect 坐标系，需要转换到屏幕坐标系&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 转换方法就是先将 ptHimetricLocationRaw 的 X 坐标，压缩到 [0-1] 范围内，然后乘以 displayRect 的宽度，再加上 displayRect 的 left 值，即得到了屏幕坐标系的 X 坐标。压缩到 [0-1] 范围内的方法就是除以 pointerDeviceRect 的宽度&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// 为什么需要加上 displayRect.left 的值？考虑多屏的情况，屏幕可能是副屏&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// Y 坐标同理&lt;/span&gt;
           &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;pointerInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ptHimetricLocationRaw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pointerDeviceRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Width&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;displayRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;pointerInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ptHimetricLocationRaw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pointerDeviceRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Height&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;displayRect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上代码的 Point2D 类型的定义如下&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;record&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上代码获取的是屏幕坐标系的点，需要转换到 WPF 坐标系&lt;/p&gt;

&lt;p&gt;转换过程的两个重点：&lt;/p&gt;

&lt;p&gt;1.底层 ClientToScreen 只支持整数类型，直接转换会丢失精度。即使是 WPF 封装的 PointFromScreen 或 PointToScreen 方法也会丢失精度&lt;/p&gt;

&lt;p&gt;2.需要进行 DPI 换算，必须要求 DPI 感知&lt;/p&gt;

&lt;p&gt;先测量窗口与屏幕的偏移量，这里直接取 0 0 点即可，因为这里获取到的是虚拟屏幕坐标系，不需要考虑多屏的情况&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;screenTranslate&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;PInvoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ClientToScreen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HWND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hwnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;screenTranslate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取当前的 DPI 值&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dpi&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VisualTreeHelper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetDpi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;先做平移，再做 DPI 换算&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;screenTranslate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;screenTranslate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dpi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DpiScaleX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dpi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DpiScaleY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;此时拿到的 point2D 就是 WPF 坐标系的点了，但是拿这个点对接笔迹，如以下代码&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERUPDATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strokeVisual&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GetStrokeVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;strokeVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;StylusPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;strokeVisual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Redraw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WM_POINTERUP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;StrokeVisualList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Remove&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pointerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;运行代码即可看到可以在较高精度触摸屏上绘制出比较顺滑的笔迹&lt;/p&gt;

&lt;p&gt;本文代码放在 &lt;a href=&quot;https://github.com/lindexi/lindexi_gd/tree/322313ee55d0eeaae7148b24ca279e1df087871e/WPFDemo/DefilireceHowemdalaqu&quot;&gt;github&lt;/a&gt; 和 &lt;a href=&quot;https://gitee.com/lindexi/lindexi_gd/tree/322313ee55d0eeaae7148b24ca279e1df087871e/WPFDemo/DefilireceHowemdalaqu&quot;&gt;gitee&lt;/a&gt; 上，可以使用如下命令行拉取代码。我整个代码仓库比较庞大，使用以下命令行可以进行部分拉取，拉取速度比较快&lt;/p&gt;

&lt;p&gt;先创建一个空文件夹，接着使用命令行 cd 命令进入此空文件夹，在命令行里面输入以下代码，即可获取到本文的代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 322313ee55d0eeaae7148b24ca279e1df087871e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上使用的是国内的 gitee 的源，如果 gitee 不能访问，请替换为 github 的源。请在命令行继续输入以下代码，将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码，可以发邮件向我要代码&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 322313ee55d0eeaae7148b24ca279e1df087871e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取代码之后，进入 WPFDemo/DefilireceHowemdalaqu 文件夹，即可获取到源代码&lt;/p&gt;

&lt;p&gt;更多 WPF 触摸相关技术博客，请参阅 &lt;a href=&quot;https://blog.lindexi.com/post/%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA.html&quot;&gt;博客导航&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Jul 2026 01:00:13 +0000</pubDate>
        <link>https://blog.lindexi.com/post/WPF-%E4%BB%8E%E8%A3%B8-Win-32-%E7%9A%84-WM_Pointer-%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96%E8%A7%A6%E6%91%B8%E7%82%B9%E7%BB%98%E5%88%B6%E7%AC%94%E8%BF%B9.html</link>
        <guid isPermaLink="true">https://blog.lindexi.com/post/WPF-%E4%BB%8E%E8%A3%B8-Win-32-%E7%9A%84-WM_Pointer-%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96%E8%A7%A6%E6%91%B8%E7%82%B9%E7%BB%98%E5%88%B6%E7%AC%94%E8%BF%B9.html</guid>
        
        
        <category>WPF</category>
        
      </item>
    
  </channel>
</rss>
