<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><author><name>wherewhere</name></author><generator uri="https://hexo.io/">Hexo</generator><id>https://wherewhere.github.io/</id><link href="https://wherewhere.github.io/" rel="alternate"/><link href="https://wherewhere.github.io/atom.xml" rel="self"/><rights>All rights reserved 2026, wherewhere</rights><subtitle>wherewhere的个人博客</subtitle><title>魔法薇ㄦ的书馆</title><updated>2026-03-21T01:56:00.000Z</updated><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="JS" scheme="https://wherewhere.github.io/tags/JS/"/><category term="WinJS" scheme="https://wherewhere.github.io/tags/WinJS/"/><category term="Web" scheme="https://wherewhere.github.io/tags/Web/"/><content><![CDATA[<p>如今微软网页套壳越来越变本加厉，到处都是一人一个浏览器，套壳大小已经成百上千，但殊不知微软曾经有过对网页套壳的原生支持，打包大小只按k记，那就是 MSAppHost 了，不过更为人所知的是其控件库 WinJS，所以这里就用 WinJS 代指 JS&#x2F;HTML 模式的 UWP 了。WinJS&#x2F;UWP 本质就是直接让 Edge (过去为 IE) 的 WebView 直接打开打包好的网页，同时给这个环境加上 WinRT 支持，由于 MSAppHost 是系统组件，所以只用打包 Web 资源就行了。WinJS 曾作为 WSA (Windows Store App) 的主推平台，甚至 Win8 应用商店都是 JS&#x2F;HTML 开发的，不过在进入 Win10 之后，有了 .NET Native 的加持，C#&#x2F;UWP 逐渐变为主流，MSAppHost 基本上只剩下了作为 PWA 的用途。然而随着 Edge HTML 的停更，Windows 再也没有了原生的 HTML 渲染平台，微软也在 VS 2019 中彻底删除了对 WinJS 的支持。</p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2662465/202603/2662465-20260318191241607-1755884115.png" alt="屏幕截图(911)" loading="lazy"></p><p>不过 MSAppHost 框架作为系统组件并没有被删除，利用 <a href="https://www.npmjs.com/package/electron-windows-msix" title="electron-windows-msix"><code>electron-windows-msix</code></a> 插件，我们可以轻松打包一个 NPM 项目，我们只需要将清单改为 MSAppHost 模式即可。接下来我们将演示如何新建一个 Vue&#x2F;UWP 项目。<span id="more"></span></p><p>首先我们根据 <a href="https://cn.vuejs.org/guide/quick-start" title="quick-start">Vue 官方教程</a>新建一个空白 Vue 项目：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm create vue@latest</span><br></pre></td></tr></table></figure><p>进入项目文件夹后安装依赖：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i</span><br></pre></td></tr></table></figure><p>然后我们测试一下它是否可以正常运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm run dev</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2662465/202603/2662465-20260318164033943-1972265517.png" alt="Snipaste_2026-03-18_16-39-44" loading="lazy"></p><p>由于 MSAppHost 永远留在了 Edge HTML 18，所以我们需要把 JS 编译到 Edge 18 兼容的版本，安装 <a href="https://www.npmjs.com/package/@vitejs/plugin-legacy" title="@vitejs&#x2F;plugin-legacy"><code>@vitejs/plugin-legacy</code></a>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i --save-dev @vitejs/plugin-legacy</span><br></pre></td></tr></table></figure><p>在 <code>vite.config.ts</code> 配置插件，由于 <code>vite</code> 使用到了新版 ESM 模块特性，所以 Edge 只能使用 Legacy 模式，注意 <code>base</code> 一定要设置为 <code>./</code>，因为打包插件会把编译结果打包进 <code>app</code> 文件夹：</p><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> legacy <span class="keyword">from</span> <span class="string">&#x27;@vitejs/plugin-legacy&#x27;</span></span><br><span class="line">...</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">  <span class="attr">base</span>: <span class="string">&#x27;./&#x27;</span>,</span><br><span class="line">  <span class="attr">plugins</span>: [</span><br><span class="line">    ...</span><br><span class="line">    <span class="title function_">legacy</span>(&#123;</span><br><span class="line">      <span class="attr">targets</span>: <span class="string">&#x27;Edge &gt;= 18&#x27;</span>,</span><br><span class="line">      <span class="attr">polyfills</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">renderModernChunks</span>: <span class="literal">false</span></span><br><span class="line">    &#125;)</span><br><span class="line">  ],</span><br><span class="line">  ...</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>验证可以正常运行后，我们安装 <a href="https://www.npmjs.com/package/electron-windows-msix" title="electron-windows-msix"><code>electron-windows-msix</code></a> 插件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i --save-dev electron-windows-msix</span><br></pre></td></tr></table></figure><p>然后编写打包脚本，可以参考 <a href="https://github.com/wherewhere/VueForUWP/blob/main/package.mjs" title="package.mjs"><code>package.mjs</code></a>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; packageMSIX &#125; <span class="keyword">from</span> <span class="string">&quot;electron-windows-msix&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">import(&quot;electron-windows-msix&quot;).WindowsSignOptions</span>&#125; */</span></span><br><span class="line"><span class="keyword">let</span> windowsSignOptions = <span class="literal">undefined</span>;</span><br><span class="line"><span class="keyword">const</span> certificateFileIndex = process.<span class="property">argv</span>.<span class="title function_">indexOf</span>(<span class="string">&quot;--certificateFile&quot;</span>);</span><br><span class="line"><span class="keyword">if</span> (certificateFileIndex != -<span class="number">1</span>) &#123;</span><br><span class="line">    windowsSignOptions = &#123;</span><br><span class="line">        <span class="attr">certificateFile</span>: process.<span class="property">argv</span>[certificateFileIndex + <span class="number">1</span>]</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">const</span> certificatePasswordIndex = process.<span class="property">argv</span>.<span class="title function_">indexOf</span>(<span class="string">&quot;--certificatePassword&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (certificatePasswordIndex != -<span class="number">1</span>) &#123;</span><br><span class="line">        windowsSignOptions.<span class="property">certificatePassword</span> = process.<span class="property">argv</span>[certificatePasswordIndex + <span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">const</span> timestampServerIndex = process.<span class="property">argv</span>.<span class="title function_">indexOf</span>(<span class="string">&quot;--timestampServer&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (timestampServerIndex != -<span class="number">1</span>) &#123;</span><br><span class="line">        windowsSignOptions.<span class="property">timestampServer</span> = process.<span class="property">argv</span>[timestampServerIndex + <span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> &#123; msixPackage &#125; = <span class="keyword">await</span> <span class="title function_">packageMSIX</span>(&#123;</span><br><span class="line">    <span class="attr">appManifest</span>: <span class="string">&quot;AppxManifest.xml&quot;</span>,</span><br><span class="line">    <span class="attr">appDir</span>: <span class="string">&quot;dist&quot;</span>,</span><br><span class="line">    <span class="attr">packageAssets</span>: <span class="string">&quot;assets&quot;</span>,</span><br><span class="line">    <span class="attr">outputDir</span>: <span class="string">&quot;appx&quot;</span>,</span><br><span class="line">    <span class="attr">packageName</span>: <span class="string">&quot;VueForUWP.msix&quot;</span>,</span><br><span class="line">    <span class="attr">windowsKitVersion</span>: <span class="string">&quot;10.0.26100.0&quot;</span>,</span><br><span class="line">    windowsSignOptions,</span><br><span class="line">    <span class="attr">sign</span>: !!windowsSignOptions</span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`MSIX package created at: <span class="subst">$&#123;msixPackage&#125;</span>`</span>);</span><br></pre></td></tr></table></figure><p>其中 <code>appManifest</code> 是 Appx 清单的路径；<code>appDir</code> 是 <code>vite</code> 编译结果文件夹；<code>packageAssets</code> 是 Appx 资源文件夹，如果不设置会使用插件默认的资源，下面的 Appx 清单使用的就是默认资源；<code>windowsKitVersion</code> 需要选择已安装的 Windows SDK 版本。</p><p>由于默认清单是 FullTrust Win32 打包项目，所以我们需要手动编写清单，新建 <a href="https://github.com/wherewhere/VueForUWP/blob/main/AppxManifest.xml" title="AppxManifest.xml"><code>AppxManifest.xml</code></a> 文件：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">Package</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xmlns</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/manifest/foundation/windows10&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xmlns:mp</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/2014/phone/manifest&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xmlns:uap</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/manifest/uap/windows10&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xmlns:uap5</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/manifest/uap/windows10/5&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">IgnorableNamespaces</span>=<span class="string">&quot;uap uap5 mp&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Identity</span> <span class="attr">Name</span>=<span class="string">&quot;wherewhere.VueForUWP&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">Publisher</span>=<span class="string">&quot;CN=where&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">Version</span>=<span class="string">&quot;0.0.1.0&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">mp:PhoneIdentity</span> <span class="attr">PhoneProductId</span>=<span class="string">&quot;2d5eb3c5-2697-7f48-4085-ba24fba35ad1&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">PhonePublisherId</span>=<span class="string">&quot;00000000-0000-0000-0000-000000000000&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Properties</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">DisplayName</span>&gt;</span>VueForUWP<span class="tag">&lt;/<span class="name">DisplayName</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PublisherDisplayName</span>&gt;</span>wherewhere<span class="tag">&lt;/<span class="name">PublisherDisplayName</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Logo</span>&gt;</span>assets\icon.png<span class="tag">&lt;/<span class="name">Logo</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Properties</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Dependencies</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">TargetDeviceFamily</span> <span class="attr">Name</span>=<span class="string">&quot;Windows.Universal&quot;</span> <span class="attr">MinVersion</span>=<span class="string">&quot;10.0.18362.0&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">MaxVersionTested</span>=<span class="string">&quot;10.0.26100.0&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Dependencies</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Resources</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Resource</span> <span class="attr">Language</span>=<span class="string">&quot;en-us&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Resources</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Applications</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Application</span> <span class="attr">Id</span>=<span class="string">&quot;VueForUWP&quot;</span> <span class="attr">StartPage</span>=<span class="string">&quot;ms-appx-web:///app/index.html&quot;</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">uap:VisualElements</span></span></span><br><span class="line"><span class="tag">        <span class="attr">DisplayName</span>=<span class="string">&quot;VueForUWP&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">Description</span>=<span class="string">&quot;UWP running with vue.js 3.0&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">BackgroundColor</span>=<span class="string">&quot;transparent&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">Square150x150Logo</span>=<span class="string">&quot;assets\Square150x150Logo.png&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">Square44x44Logo</span>=<span class="string">&quot;assets\Square44x44Logo.png&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">uap:DefaultTile</span></span></span><br><span class="line"><span class="tag">          <span class="attr">Wide310x150Logo</span>=<span class="string">&quot;assets\Wide310x150Logo.scale-200.png&quot;</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">uap:ShowNameOnTiles</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">uap:ShowOn</span> <span class="attr">Tile</span>=<span class="string">&quot;square150x150Logo&quot;</span> /&gt;</span></span><br><span class="line">          <span class="tag">&lt;/<span class="name">uap:ShowNameOnTiles</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">uap:DefaultTile</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">uap:SplashScreen</span> <span class="attr">Image</span>=<span class="string">&quot;assets\SplashScreen.scale-200.png&quot;</span> <span class="attr">uap5:Optional</span>=<span class="string">&quot;true&quot;</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">uap:InitialRotationPreference</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">uap:Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;landscape&quot;</span> /&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">uap:Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;portrait&quot;</span> /&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">uap:Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;landscapeFlipped&quot;</span> /&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">uap:Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;portraitFlipped&quot;</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">uap:InitialRotationPreference</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">uap:VisualElements</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">uap:ApplicationContentUriRules</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">uap:Rule</span> <span class="attr">Match</span>=<span class="string">&quot;ms-appx-web:///&quot;</span> <span class="attr">Type</span>=<span class="string">&quot;include&quot;</span> <span class="attr">WindowsRuntimeAccess</span>=<span class="string">&quot;all&quot;</span> /&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">uap:ApplicationContentUriRules</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">Application</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Applications</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Capabilities</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Capability</span> <span class="attr">Name</span>=<span class="string">&quot;internetClient&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Capabilities</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Package</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后编写部署脚本，可以参考 <a href="https://github.com/wherewhere/VueForUWP/blob/main/deploy.mjs" title="deploy.mjs"><code>deploy.mjs</code></a>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; powershell &#125; <span class="keyword">from</span> <span class="string">&quot;electron-windows-msix/lib/powershell.js&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> results = <span class="keyword">await</span> <span class="title function_">powershell</span>(<span class="string">&quot;Add-AppxPackage -Path appx/msix_layout/AppxManifest.xml -Register&quot;</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(results);</span><br></pre></td></tr></table></figure><p>最后在 <code>package.json</code> 中添加打包和部署指令：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="attr">&quot;scripts&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    ...</span><br><span class="line">    <span class="attr">&quot;pack&quot;</span><span class="punctuation">:</span> <span class="string">&quot;npm run build &amp;&amp; node package.mjs&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;deploy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;node deploy.mjs&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  ...</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>现在我们可以通过执行 <code>npm run pack</code> 打包项目，用 <code>npm run deploy</code> 部署项目了。</p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2662465/202603/2662465-20260318174954021-79782670.png" alt="Snipaste_2026-03-18_17-41-16" loading="lazy"></p><p>由于 MSAppHost 永远留在了 Edge HTML 18，所以新的 Vue 样式库基本上都无法使用，为了符合 Windows 样式，还是建议使用 WinJS 控件库，可以在这里找到示例：<a href="https://github.com/wherewhere/VueForUWP" title="VueForUWP">https://github.com/wherewhere/VueForUWP</a></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2662465/202603/2662465-20260318175449819-154943467.png" alt="Snipaste_2026-03-18_17-54-28" loading="lazy"></p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/19430420">【UWP】使用 Vue&#x2F;Vite 编写 WinJS&#x2F;UWP</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2026年3月21日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2026/03/21/%E3%80%90UWP%E3%80%91%E4%BD%BF%E7%94%A8-Vue-Vite-%E7%BC%96%E5%86%99-WinJS-UWP/</id><link href="https://wherewhere.github.io/2026/03/21/%E3%80%90UWP%E3%80%91%E4%BD%BF%E7%94%A8-Vue-Vite-%E7%BC%96%E5%86%99-WinJS-UWP/"/><published>2026-03-21T01:56:00.000Z</published><summary><![CDATA[<p>如今微软网页套壳越来越变本加厉，到处都是一人一个浏览器，套壳大小已经成百上千，但殊不知微软曾经有过对网页套壳的原生支持，打包大小只按k记，那就是 MSAppHost 了，不过更为人所知的是其控件库 WinJS，所以这里就用 WinJS 代指 JS&#x2F;HTML 模式的 UWP 了。WinJS&#x2F;UWP 本质就是直接让 Edge (过去为 IE) 的 WebView 直接打开打包好的网页，同时给这个环境加上 WinRT 支持，由于 MSAppHost 是系统组件，所以只用打包 Web 资源就行了。WinJS 曾作为 WSA (Windows Store App) 的主推平台，甚至 Win8 应用商店都是 JS&#x2F;HTML 开发的，不过在进入 Win10 之后，有了 .NET Native 的加持，C#&#x2F;UWP 逐渐变为主流，MSAppHost 基本上只剩下了作为 PWA 的用途。然而随着 Edge HTML 的停更，Windows 再也没有了原生的 HTML 渲染平台，微软也在 VS 2019 中彻底删除了对 WinJS 的支持。</p>
<p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2662465/202603/2662465-20260318191241607-1755884115.png" alt="屏幕截图(911)" loading="lazy"></p>
<p>不过 MSAppHost 框架作为系统组件并没有被删除，利用 <a href="https://www.npmjs.com/package/electron-windows-msix" title="electron-windows-msix"><code>electron-windows-msix</code></a> 插件，我们可以轻松打包一个 NPM 项目，我们只需要将清单改为 MSAppHost 模式即可。接下来我们将演示如何新建一个 Vue&#x2F;UWP 项目。]]></summary><title>【UWP】使用 Vue/Vite 编写 WinJS/UWP</title><updated>2026-03-21T01:56:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="WinRT" scheme="https://wherewhere.github.io/tags/WinRT/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><content><![CDATA[<p>众所周知，UWP 一般是运行在沙盒里面的，当我们需要访问沙盒外资源的时候，就需要通过沙盒外的代理服务器来获取。一般情况下我们都是利用 WinRT API 通过 Runtime Broker 来和沙盒外互通，遇到要自定义的情况则是手动开一个 Win32 服务器来互通，但是有没有可能我们可以直接拿 UWP 本体当服务器呢？</p><p>UWP 本体实际上就是一个普通的 Win32 EXE 程序，只是想要以 UWP 状态运行只能通过系统托管，但是如果我们不需要它以 UWP 状态执行的时候完全可以直接双击打开它，这时候它就是一个很普通的散装 Win32 程序了。</p><p>利用这个特性，我们可以制作一种假装双击打开的方法，只需要在发现是 Win32 状态下启动就去用 API 唤起 UWP 形态的自己就行了</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="built_in">bool</span> IsPackagedApp</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">get</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">uint</span> length = <span class="number">0</span>;</span><br><span class="line">        PWSTR str = <span class="keyword">new</span>();</span><br><span class="line">        _ = PInvoke.GetCurrentPackageFullName(<span class="keyword">ref</span> length, str);</span><br><span class="line"> </span><br><span class="line">        <span class="built_in">char</span>* ptr = <span class="keyword">stackalloc</span> <span class="built_in">char</span>[(<span class="built_in">int</span>)length];</span><br><span class="line">        str = <span class="keyword">new</span>(ptr);</span><br><span class="line">        WIN32_ERROR result = PInvoke.GetCurrentPackageFullName(<span class="keyword">ref</span> length, str);</span><br><span class="line">        <span class="keyword">return</span> result != WIN32_ERROR.APPMODEL_ERROR_NO_PACKAGE;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (IsPackagedApp)</span><br><span class="line">    &#123;</span><br><span class="line">        Application.Start(<span class="keyword">static</span> p =&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            DispatcherQueueSynchronizationContext context = <span class="keyword">new</span>(DispatcherQueue.GetForCurrentThread());</span><br><span class="line">            SynchronizationContext.SetSynchronizationContext(context);</span><br><span class="line">            _ = <span class="keyword">new</span> App();</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        StartCoreApplicationAsync().Wait();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">async</span> Task <span class="title">StartCoreApplicationAsync</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    PackageManager manager = <span class="keyword">new</span>();</span><br><span class="line">    <span class="built_in">string</span> basePath = AppDomain.CurrentDomain.BaseDirectory;</span><br><span class="line">    XmlDocument manifest = <span class="keyword">await</span> XmlDocument.LoadFromFileAsync(<span class="keyword">await</span> StorageFile.GetFileFromPathAsync(Path.Combine(basePath, <span class="string">&quot;AppxManifest.xml&quot;</span>)));</span><br><span class="line">    IXmlNode identity = manifest.GetElementsByTagName(<span class="string">&quot;Identity&quot;</span>)?[<span class="number">0</span>];</span><br><span class="line">    <span class="built_in">string</span> name = identity.Attributes.FirstOrDefault(x =&gt; x.NodeName == <span class="string">&quot;Name&quot;</span>)?.InnerText;</span><br><span class="line">    IXmlNode application = manifest.GetElementsByTagName(<span class="string">&quot;Application&quot;</span>)?[<span class="number">0</span>];</span><br><span class="line">    <span class="built_in">string</span> id = application.Attributes.FirstOrDefault(x =&gt; x.NodeName == <span class="string">&quot;Id&quot;</span>)?.InnerText;</span><br><span class="line">    IEnumerable&lt;Package&gt; packages = manager.FindPackagesForUser(<span class="built_in">string</span>.Empty).Where(x =&gt; x.Id.FamilyName.StartsWith(name));</span><br><span class="line">    <span class="keyword">if</span> (packages.FirstOrDefault() <span class="keyword">is</span> Package package)</span><br><span class="line">    &#123;</span><br><span class="line">        IReadOnlyList&lt;AppListEntry&gt; entries = <span class="keyword">await</span> package.GetAppListEntriesAsync();</span><br><span class="line">        <span class="keyword">if</span> (entries?[<span class="number">0</span>] <span class="keyword">is</span> AppListEntry entry)</span><br><span class="line">        &#123;</span><br><span class="line">            _ = <span class="keyword">await</span> entry.LaunchAsync();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>既然我们可以让自己唤起自己，那么自己和自己通信也不是什么难事了，我们只需要在 UWP 形态下唤起一个 Win32 的自己，就可以自己利用自己滥权(bushi)了。<span id="more"></span></p><p>既然知道了原理可行，那么我们就来尝试把它造出来，众所周知，通信的方法有很多，比如 UWP 扩展通信、TCP 通信、管道通信甚至是写文件通信，但是这些用起来都太复杂了，既然我们已经用了 WinRT，那么我们直接用 WinRT 通信就是了。</p><p>不过真正的 OOP&#x2F;WinRT 通信的例子并不多，我到目前为止也没有成功实现，所以就先用 COM 通信凑数了。现在微软到处都是 OOP&#x2F;COM 通信，比如小组件和 Dev Home，自从微软疯狂用 OOP&#x2F;COM 造插件之后这方面的示例已经非常多了，这里就展示一下如何用 C# 实现基于 OOP&#x2F;COM 的 WinRT 通信。</p><p>既然是通信，肯定要有服务器和客户端，这里这两个都是自己，所以我们就只需要创建一个 UWP 项目就行了。由于 C#&#x2F;WinRT 并不能实现 WinRT 类与非 WinRT 类混编，所以我们还需要创建一个 C++&#x2F;WinRT 项目来生成 winmd 清单，这个 C++ 项目可以精简一下，只需要能编译 IDL 文件就行了，当然不修改也可以，只是看起来不太清爽罢了。</p><p>由于 C++&#x2F;WinRT 项目只负责生成清单，如果直接引用该项目会报找不到 dll 实现，所以我们需要把 winmd 文件单独拿出来，在 vcxprj 中添加任务：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Target</span> <span class="attr">Name</span>=<span class="string">&quot;OutputWinMD&quot;</span> <span class="attr">BeforeTargets</span>=<span class="string">&quot;BuildCompile&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">PropertyGroup</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PlatformName</span> <span class="attr">Condition</span>=<span class="string">&quot;&#x27;$(Platform)&#x27; == &#x27;Win32&#x27;&quot;</span>&gt;</span>x86<span class="tag">&lt;/<span class="name">PlatformName</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PlatformName</span> <span class="attr">Condition</span>=<span class="string">&quot;&#x27;$(Platform)&#x27; == &#x27;ARM64EC&#x27;&quot;</span>&gt;</span>ARM64<span class="tag">&lt;/<span class="name">PlatformName</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PlatformName</span> <span class="attr">Condition</span>=<span class="string">&quot;&#x27;$(PlatformName)&#x27; == &#x27;&#x27;&quot;</span>&gt;</span>$(Platform)<span class="tag">&lt;/<span class="name">PlatformName</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">PropertyGroup</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Copy</span> <span class="attr">SourceFiles</span>=<span class="string">&quot;$(OutDir)\$(ProjectName).winmd&quot;</span> <span class="attr">DestinationFolder</span>=<span class="string">&quot;..\WinMD\$(PlatformName)\$(Configuration)\&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Message</span> <span class="attr">Text</span>=<span class="string">&quot;Copied output metadata file to &#x27;..\WinMD\$(PlatformName)\$(Configuration)\&#x27;.&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Target</span>&gt;</span></span><br></pre></td></tr></table></figure><p>接下来我们就可以开始写 COM 类了，首先我们要实现一个负责服务器管理的类，这个类用来管理服务器的声明周期和远程类的获取方法。</p><p>其中我们需要先实现一种让服务器可以在客户端关闭后自动关闭的方法，让客户端通知是很不合理的，因为客户端可能会突然暴毙，这样就会导致服务器永远也不会释放了，所以我们必须让服务器去感知客户端不再需要服务器了。在 C++，我们可以通过观察引用计数的方法来知道远程类是否被客户端释放了，但是在 C#，远程类被客户端释放后并不会真的释放，我暂时不清楚其中的原因，表现出来就是解构方法并不会被执行，所以我们就无法通过类释放来关闭服务器了。于是我们还有一种方法，当通信断开后，我们执行远程方法就会报错，这样我们就知道通信已经断开了，于是我们可以让客户端给服务器发送一个保活委托，服务器每隔一段时间就去执行一次，这样通信断开后再执行委托就会直接报错了。当然我们还可以让这个保活委托变成一个永远也不会结束的异步，让 WinRT 自己去等待，这样服务器在通信断开的一瞬间知道通信结束了，不过由于我们并不需要瞬间就反应，有时候我们还需要考虑应用被关闭后马上就又打开的情况，所以我还是选择自己开个间隔比较长的定时器自己喂狗了。</p><p>实现很简单，开个定时器喂狗就行了：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Represents a monitor that checks if a remote object is alive.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">RemoteMonitor</span> : <span class="title">IDisposable</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">bool</span> disposed;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> Timer _timer;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> Action _dispose;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Initializes a new instance of the <span class="doctag">&lt;see cref=&quot;RemoteMonitor&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;handler&quot;&gt;</span>The handler to check if the remote object is alive.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dispose&quot;&gt;</span>The action to dispose the remote object.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;period&quot;&gt;</span>The period to check if the remote object is alive.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">RemoteMonitor</span>(<span class="params">IsAliveHandler handler, Action dispose, TimeSpan period</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        _dispose = dispose;</span><br><span class="line">        _timer = <span class="keyword">new</span>(_ =&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">bool</span> isAlive = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">            &#123;</span><br><span class="line">                isAlive = handler.Invoke();</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">catch</span></span><br><span class="line">            &#123;</span><br><span class="line">                isAlive = <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">finally</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (!isAlive)</span><br><span class="line">                &#123;</span><br><span class="line">                    Dispose();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;, <span class="literal">null</span>, TimeSpan.Zero, period);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Finalizes the instance of the <span class="doctag">&lt;see cref=&quot;RemoteMonitor&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    ~RemoteMonitor() =&gt; Dispose();</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Dispose</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!disposed)</span><br><span class="line">        &#123;</span><br><span class="line">            disposed = <span class="literal">true</span>;</span><br><span class="line">            _timer.Dispose();</span><br><span class="line">            _dispose?.Invoke();</span><br><span class="line">            GC.SuppressFinalize(<span class="keyword">this</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>同时在 IDL 定义 <code>IsAliveHandler</code> 委托：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="built_in">delegate</span> Boolean <span class="title">IsAliveHandler</span>()</span>;</span><br></pre></td></tr></table></figure><p>接下来我们就可以写服务器管理类了，我们只需要让它能正确释放服务器就行了，分别写 IDL 定义和 C# 实现：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">interface</span> <span class="title">ISetMonitor</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">SetMonitor</span>(<span class="params">IsAliveHandler handler, Windows.Foundation.TimeSpan period</span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title">IRemoteThing</span> <span class="title">requires</span> <span class="title">ISetMonitor</span>, <span class="title">Windows.Foundation.IClosable</span>, <span class="title">Windows.Foundation.IStringable</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 其他远程操作</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> The manage class for remote object.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">RemoteThing</span> : <span class="title">IRemoteThing</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">bool</span> disposed;</span><br><span class="line">    <span class="keyword">private</span> RemoteMonitor _monitor;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Initializes a new instance of the <span class="doctag">&lt;see cref=&quot;RemoteThing&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">RemoteThing</span>()</span> =&gt; Program.RefCount++;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Finalizes the instance of the <span class="doctag">&lt;see cref=&quot;RemoteThing&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    ~RemoteThing() =&gt; Dispose();</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Sets the monitor to check if the remote object is alive.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;handler&quot;&gt;</span>The handler to check if the remote object is alive.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;period&quot;&gt;</span>The period to check if the remote object is alive.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">SetMonitor</span>(<span class="params">IsAliveHandler handler, TimeSpan period</span>)</span> =&gt; _monitor = <span class="keyword">new</span> RemoteMonitor(handler, Dispose, period);</span><br><span class="line"></span><br><span class="line">    <span class="meta">#<span class="keyword">region</span> 其他远程操作</span></span><br><span class="line"></span><br><span class="line">    <span class="meta">#<span class="keyword">endregion</span></span></span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Dispose</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!disposed)</span><br><span class="line">        &#123;</span><br><span class="line">            disposed = <span class="literal">true</span>;</span><br><span class="line">            _monitor?.Dispose();</span><br><span class="line">            GC.SuppressFinalize(<span class="keyword">this</span>);</span><br><span class="line">            <span class="keyword">if</span> (--Program.RefCount == <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                _ = Program.CheckComRefAsync();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 随便写点什么作为测试。</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="built_in">string</span> <span class="title">ToString</span>()</span> =&gt;</span><br><span class="line">        <span class="keyword">new</span> StringBuilder()</span><br><span class="line">            .AppendLine(<span class="string">&quot;Information&quot;</span>)</span><br><span class="line">            .AppendLine(<span class="string">$&quot;Framework: <span class="subst">&#123;RuntimeInformation.FrameworkDescription&#125;</span>&quot;</span>)</span><br><span class="line">            .AppendLine(<span class="string">$&quot;OSPlatform: <span class="subst">&#123;Environment.OSVersion&#125;</span>&quot;</span>)</span><br><span class="line">            .Append(<span class="string">$&quot;OSArchitecture: <span class="subst">&#123;RuntimeInformation.OSArchitecture&#125;</span>&quot;</span>)</span><br><span class="line">            .ToString();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>有了服务器管理类，我们就可以把它注册到 COM 服务器了。想要注册 COM 类，我们需要一个  Factory 工厂类来让 COM 服务器可以在通信时初始化 COM 类。首先我们需要导入 COM 相关 API，定义 <code>IClassFactory</code> 接口，其中 <code>Factory.CLSID_IRemoteThing</code> 为远程类的 <code>CLSID</code>。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">Factory</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">readonly</span> Guid CLSID_IRemoteThing = <span class="keyword">new</span>(<span class="string">&quot;01153FC5-2F29-4F60-93AD-EFFB97CC9E20&quot;</span>);</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">readonly</span> Guid CLSID_IUnknown = <span class="keyword">new</span>(<span class="string">&quot;00000000-0000-0000-C000-000000000046&quot;</span>);</span><br><span class="line"></span><br><span class="line">    [<span class="meta">LibraryImport(<span class="string">&quot;api-ms-win-core-com-l1-1-0.dll&quot;</span>)</span>]</span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> <span class="keyword">partial</span> <span class="built_in">int</span> <span class="title">CoRegisterClassObject</span>(<span class="params"><span class="keyword">in</span> Guid rclsid, IClassFactory pUnk, <span class="built_in">uint</span> dwClsContext, <span class="built_in">int</span> flags, <span class="keyword">out</span> <span class="built_in">uint</span> lpdwRegister</span>)</span>;</span><br><span class="line"></span><br><span class="line">    [<span class="meta">LibraryImport(<span class="string">&quot;api-ms-win-core-com-l1-1-0.dll&quot;</span>)</span>]</span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> <span class="keyword">partial</span> <span class="built_in">int</span> <span class="title">CoRevokeClassObject</span>(<span class="params"><span class="built_in">uint</span> dwRegister</span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// https://docs.microsoft.com/windows/win32/api/unknwn/nn-unknwn-iclassfactory</span></span><br><span class="line">[<span class="meta">GeneratedComInterface</span>]</span><br><span class="line">[<span class="meta">Guid(<span class="string">&quot;00000001-0000-0000-C000-000000000046&quot;</span>)</span>]</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">interface</span> <span class="title">IClassFactory</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">CreateInstance</span>(<span class="params"><span class="built_in">nint</span> pUnkOuter, <span class="keyword">in</span> Guid riid, <span class="keyword">out</span> <span class="built_in">nint</span> ppvObject</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">LockServer</span>(<span class="params">[MarshalAs(UnmanagedType.Bool</span>)] <span class="built_in">bool</span> fLock)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接下来我们可以制作一个抽象的工厂类，然后就可以直接继承这个工厂类来实现对应类的工厂类，不过由于 COM 源生成暂时不支持泛型，所以这个抽象的工厂类不能加 <code>GeneratedComClass</code>。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">Factory</span>&lt;<span class="title">T</span>, <span class="title">TInterface</span>&gt; : <span class="title">IActivationFactory</span>, <span class="title">IClassFactory</span> <span class="keyword">where</span> <span class="title">T</span> : <span class="title">TInterface</span>, <span class="title">new</span>()</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">int</span> E_NOINTERFACE = <span class="keyword">unchecked</span>((<span class="built_in">int</span>)<span class="number">0x80004002</span>);</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">int</span> CLASS_E_NOAGGREGATION = <span class="keyword">unchecked</span>((<span class="built_in">int</span>)<span class="number">0x80040110</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> Guid _iid = <span class="keyword">typeof</span>(TInterface).GUID;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="built_in">nint</span> <span class="title">ActivateInstance</span>()</span> =&gt; MarshalInspectable&lt;TInterface&gt;.FromManaged(<span class="keyword">new</span> T());</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">CreateInstance</span>(<span class="params"><span class="built_in">nint</span> pUnkOuter, <span class="keyword">in</span> Guid riid, <span class="keyword">out</span> <span class="built_in">nint</span> ppvObject</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        ppvObject = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (pUnkOuter != <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            Marshal.ThrowExceptionForHR(CLASS_E_NOAGGREGATION);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (riid == _iid || riid == Factory.CLSID_IUnknown)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// Create the instance of the .NET object</span></span><br><span class="line">            ppvObject = MarshalInspectable&lt;TInterface&gt;.FromManaged(<span class="keyword">new</span> T());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// The object that ppvObject points to does not support the</span></span><br><span class="line">            <span class="comment">// interface identified by riid.</span></span><br><span class="line">            Marshal.ThrowExceptionForHR(E_NOINTERFACE);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">LockServer</span>(<span class="params">[MarshalAs(UnmanagedType.Bool</span>)] <span class="built_in">bool</span> fLock)</span></span><br><span class="line">    &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">RegisterClassObject</span>()</span>;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">RevokeClassObject</span>()</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们继承这个抽象的工厂类来实现我们需要的工厂类：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">[<span class="meta">GeneratedComClass</span>]</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">RemoteThingFactory</span> : <span class="title">Factory</span>&lt;<span class="title">RemoteThing</span>, <span class="title">IRemoteThing</span>&gt;</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">uint</span> cookie;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">RegisterClassObject</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">int</span> hresult = Factory.CoRegisterClassObject(</span><br><span class="line">            Factory.CLSID_IRemoteThing,</span><br><span class="line">            <span class="keyword">this</span>,</span><br><span class="line">            (<span class="built_in">uint</span>)CLSCTX.CLSCTX_LOCAL_SERVER,</span><br><span class="line">            (<span class="built_in">int</span>)REGCLS.REGCLS_MULTIPLEUSE,</span><br><span class="line">            <span class="keyword">out</span> cookie);</span><br><span class="line">        <span class="keyword">if</span> (hresult &lt; <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            Marshal.ThrowExceptionForHR(hresult);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">RevokeClassObject</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">int</span> hresult = Factory.CoRevokeClassObject(cookie);</span><br><span class="line">        <span class="keyword">if</span> (hresult &lt; <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            Marshal.ThrowExceptionForHR(hresult);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们就可以在程序入口点注册这个 COM 类了：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> ManualResetEventSlim comServerExitEvent;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">int</span> RefCount &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] <span class="keyword">args</span></span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">args</span> <span class="keyword">is</span> [<span class="string">&quot;-RegisterProcessAsComServer&quot;</span>, ..])</span><br><span class="line">        &#123;</span><br><span class="line">            comServerExitEvent = <span class="keyword">new</span> ManualResetEventSlim(<span class="literal">false</span>);</span><br><span class="line">            comServerExitEvent.Reset();</span><br><span class="line">            RemoteThingFactory factory = <span class="keyword">new</span>();</span><br><span class="line">            factory.RegisterClassObject();</span><br><span class="line">            _ = CheckComRefAsync();</span><br><span class="line">            comServerExitEvent.Wait();</span><br><span class="line">            factory.RevokeClassObject();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            Application.Start(<span class="keyword">static</span> p =&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                DispatcherQueueSynchronizationContext context = <span class="keyword">new</span>(DispatcherQueue.GetForCurrentThread());</span><br><span class="line">                SynchronizationContext.SetSynchronizationContext(context);</span><br><span class="line">                _ = <span class="keyword">new</span> App();</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">async</span> Task <span class="title">CheckComRefAsync</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">await</span> Task.Delay(<span class="number">100</span>);</span><br><span class="line">        <span class="keyword">if</span> (RefCount == <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            comServerExitEvent?.Set();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最后我们需要在清单声明 COM 服务器，其中<code>SelfCOMServer.exe</code>为服务器所在的可执行文件，Class ID 填远程类的<code>CLSID</code>。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Applications</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Application</span>&gt;</span></span><br><span class="line">    ...</span><br><span class="line">    <span class="tag">&lt;<span class="name">Extensions</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">com:Extension</span> <span class="attr">Category</span>=<span class="string">&quot;windows.comServer&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">com:ComServer</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">com:ExeServer</span></span></span><br><span class="line"><span class="tag">            <span class="attr">Executable</span>=<span class="string">&quot;SelfCOMServer.exe&quot;</span></span></span><br><span class="line"><span class="tag">            <span class="attr">Arguments</span>=<span class="string">&quot;-RegisterProcessAsComServer&quot;</span></span></span><br><span class="line"><span class="tag">            <span class="attr">DisplayName</span>=<span class="string">&quot;COM Server&quot;</span></span></span><br><span class="line"><span class="tag">            <span class="attr">LaunchAndActivationPermission</span>=<span class="string">&quot;O:SYG:SYD:(A;;11;;;WD)(A;;11;;;RC)(A;;11;;;AC)(A;;11;;;AN)S:P(ML;;NX;;;S-1-16-0)&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">com:Class</span> <span class="attr">Id</span>=<span class="string">&quot;01153FC5-2F29-4F60-93AD-EFFB97CC9E20&quot;</span> <span class="attr">DisplayName</span>=<span class="string">&quot;COM Server&quot;</span> /&gt;</span></span><br><span class="line">          <span class="tag">&lt;/<span class="name">com:ExeServer</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">com:ComServer</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">com:Extension</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">Extensions</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Application</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Applications</span>&gt;</span></span><br></pre></td></tr></table></figure><p>现在我们已经完成了服务端的制作，接下来我们就可以让客户端调用服务器远程类了。</p><p>在 <code>Factory</code> 类继续添加获取远程类的相关内容：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">Factory</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">IsAlive</span>()</span> =&gt; <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> IRemoteThing <span class="title">CreateRemoteThing</span>()</span> =&gt;</span><br><span class="line">        CreateInstance&lt;IRemoteThing&gt;(CLSID_IRemoteThing, CLSCTX.CLSCTX_ALL, TimeSpan.FromMinutes(<span class="number">1</span>));</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> T <span class="title">CreateInstance</span>&lt;<span class="title">T</span>&gt;(<span class="params">Guid rclsid, CLSCTX dwClsContext = CLSCTX.CLSCTX_INPROC_SERVER</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">int</span> hresult = CoCreateInstance(rclsid, <span class="number">0</span>, (<span class="built_in">uint</span>)dwClsContext, CLSID_IUnknown, <span class="keyword">out</span> <span class="built_in">nint</span> result);</span><br><span class="line">        <span class="keyword">if</span> (hresult &lt; <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            Marshal.ThrowExceptionForHR(hresult);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> Marshaler&lt;T&gt;.FromAbi(result);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> T <span class="title">CreateInstance</span>&lt;<span class="title">T</span>&gt;(<span class="params">Guid rclsid, CLSCTX dwClsContext, TimeSpan period</span>) <span class="keyword">where</span> T : ISetMonitor</span></span><br><span class="line">    &#123;</span><br><span class="line">        T results = CreateInstance&lt;T&gt;(rclsid, dwClsContext);</span><br><span class="line">        results.SetMonitor(IsAlive, period);</span><br><span class="line">        <span class="keyword">return</span> results;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    [<span class="meta">LibraryImport(<span class="string">&quot;api-ms-win-core-com-l1-1-0.dll&quot;</span>)</span>]</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">partial</span> <span class="built_in">int</span> <span class="title">CoCreateInstance</span>(<span class="params"><span class="keyword">in</span> Guid rclsid, <span class="built_in">nint</span> pUnkOuter, <span class="built_in">uint</span> dwClsContext, <span class="keyword">in</span> Guid riid, <span class="keyword">out</span> <span class="built_in">nint</span> ppv</span>)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>现在我们只需要执行 <code>IRemoteThing remote = Factory.CreateRemoteThing();</code> 就能获取远程类了。</p><p>到这里我们已经完成了 OOP COM 的全部流程，我们想要实现什么内容就可以按照构建服务器管理类的方法来制作 COM 远程类，然后通过在服务器管理类添加一个构造方法来获取这个远程类，这样我们就不需要单独分配 CLSID 和注册 COM 类了。</p><p>比如我们可以给 <code>Process</code> 套个壳：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process&quot;/&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">RemoteProcess</span>(<span class="params">Process inner</span>) : IProcess</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.ProcessName&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> ProcessName =&gt; inner.ProcessName;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.StandardError&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> ITextReader StandardError =&gt; <span class="keyword">new</span> RemoteTextReader(inner.StandardError);</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.ProcessName&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> ITextWriter StandardInput =&gt; <span class="keyword">new</span> RemoteTextWriter(inner.StandardInput);</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.StandardOutput&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> ITextReader StandardOutput =&gt; <span class="keyword">new</span> RemoteTextReader(inner.StandardOutput);</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.StartInfo&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> IProcessStartInfo StartInfo</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">get</span> =&gt; <span class="keyword">new</span> RemoteProcessStartInfo(inner.StartInfo);</span><br><span class="line">        <span class="keyword">set</span> =&gt; <span class="keyword">value</span>.ToProcessStartInfo();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> ConditionalWeakTable&lt;CoDataReceivedEventHandler, DataReceivedEventHandler&gt; errorDataReceived = [];</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.ErrorDataReceived&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">event</span> CoDataReceivedEventHandler ErrorDataReceived</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">add</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="function"><span class="keyword">void</span> <span class="title">wrapper</span>(<span class="params"><span class="built_in">object</span> sender, DataReceivedEventArgs e</span>)</span> =&gt; <span class="keyword">value</span>(<span class="keyword">this</span>, <span class="keyword">new</span> CoDataReceivedEventArgs(e.Data));</span><br><span class="line">            DataReceivedEventHandler handler = wrapper;</span><br><span class="line">            inner.ErrorDataReceived += handler;</span><br><span class="line">            errorDataReceived.Add(<span class="keyword">value</span>, handler);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">remove</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (errorDataReceived.TryGetValue(<span class="keyword">value</span>, <span class="keyword">out</span> DataReceivedEventHandler handler))</span><br><span class="line">            &#123;</span><br><span class="line">                inner.ErrorDataReceived -= handler;</span><br><span class="line">                errorDataReceived.Remove(<span class="keyword">value</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> ConditionalWeakTable&lt;CoDataReceivedEventHandler, DataReceivedEventHandler&gt; outputDataReceived = [];</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.OutputDataReceived&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">event</span> CoDataReceivedEventHandler OutputDataReceived</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">add</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="function"><span class="keyword">void</span> <span class="title">wrapper</span>(<span class="params"><span class="built_in">object</span> sender, DataReceivedEventArgs e</span>)</span> =&gt; <span class="keyword">value</span>(<span class="keyword">this</span>, <span class="keyword">new</span> CoDataReceivedEventArgs(e.Data));</span><br><span class="line">            DataReceivedEventHandler handler = wrapper;</span><br><span class="line">            inner.OutputDataReceived += handler;</span><br><span class="line">            outputDataReceived.Add(<span class="keyword">value</span>, handler);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">remove</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (outputDataReceived.TryGetValue(<span class="keyword">value</span>, <span class="keyword">out</span> DataReceivedEventHandler handler))</span><br><span class="line">            &#123;</span><br><span class="line">                inner.OutputDataReceived -= handler;</span><br><span class="line">                outputDataReceived.Remove(<span class="keyword">value</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.BeginErrorReadLine&quot;/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">BeginErrorReadLine</span>()</span> =&gt; inner.BeginErrorReadLine();</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.BeginOutputReadLine&quot;/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">BeginOutputReadLine</span>()</span> =&gt; inner.BeginOutputReadLine();</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.CancelErrorRead&quot;/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">CancelErrorRead</span>()</span> =&gt; inner.CancelErrorRead();</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.CancelOutputRead&quot;/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">CancelOutputRead</span>()</span> =&gt; inner.CancelOutputRead();</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Component.Dispose&quot;/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Dispose</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        inner.Dispose();</span><br><span class="line">        GC.SuppressFinalize(<span class="keyword">this</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.ToString&quot;/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="built_in">string</span> <span class="title">ToString</span>()</span> =&gt; inner.ToString();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>静态部分可以弄一个假装的静态类：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process&quot;/&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">ProcessStatic</span> : <span class="title">IProcessStatic</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;Process.GetProcesses()&quot;/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> IProcess[] <span class="title">GetProcesses</span>()</span> =&gt; Process.GetProcesses().Select(x =&gt; <span class="keyword">new</span> RemoteProcess(x)).ToArray();</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> IProcess <span class="title">Start</span>(<span class="params">IProcessStartInfo startInfo</span>)</span> =&gt;</span><br><span class="line">        Process.Start(startInfo.ToProcessStartInfo()) <span class="keyword">is</span> Process process</span><br><span class="line">            ? <span class="keyword">new</span> RemoteProcess(process) : <span class="literal">null</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们在服务器管理类里增加构造方法：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> IProcessStatic <span class="title">CreateProcessStatic</span>()</span> =&gt; <span class="keyword">new</span> ProcessStatic();</span><br></pre></td></tr></table></figure><p>这样我们就可以在 UWP 里使用 Process 创建一个 cmd 进程了：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">IRemoteThing remote = Factory.CreateRemoteThing();</span><br><span class="line">process = remote.CreateProcessStatic().Start(<span class="keyword">new</span> RemoteProcessStartInfo</span><br><span class="line">&#123;</span><br><span class="line">    FileName = <span class="string">&quot;cmd&quot;</span>,</span><br><span class="line">    CreateNoWindow = <span class="literal">true</span>,</span><br><span class="line">    RedirectStandardError = <span class="literal">true</span>,</span><br><span class="line">    RedirectStandardInput = <span class="literal">true</span>,</span><br><span class="line">    RedirectStandardOutput = <span class="literal">true</span>,</span><br><span class="line">    UseShellExecute = <span class="literal">false</span></span><br><span class="line">&#125;);</span><br><span class="line">AppTitle.Text = process.ProcessName;</span><br><span class="line">process.OutputDataReceived += OnOutputDataReceived;</span><br><span class="line">process.ErrorDataReceived += OnErrorDataReceived;</span><br><span class="line">process.BeginOutputReadLine();</span><br><span class="line">process.BeginErrorReadLine();</span><br></pre></td></tr></table></figure><p>具体实现可以查看：<a href="https://github.com/wherewhere/SelfCOMServer/blob/main/SelfCOMServer/Common/RemoteProcess.cs">SelfCOMServer&#x2F;SelfCOMServer&#x2F;Common&#x2F;RemoteProcess.cs at main · wherewhere&#x2F;SelfCOMServer</a></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2662465/202503/2662465-20250315155931278-502546883.png" alt="Snipaste_2025-03-15_15-58-42" loading="lazy"></p><p>最后附上示例应用：<a href="https://github.com/wherewhere/SelfCOMServer">https://github.com/wherewhere/SelfCOMServer</a></p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/18677329">【UWP】让 UWP 自己和自己通信</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2025年4月1日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2025/04/01/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E5%92%8C%E8%87%AA%E5%B7%B1%E9%80%9A%E4%BF%A1/</id><link href="https://wherewhere.github.io/2025/04/01/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E5%92%8C%E8%87%AA%E5%B7%B1%E9%80%9A%E4%BF%A1/"/><published>2025-04-01T06:04:00.000Z</published><summary><![CDATA[<p>众所周知，UWP 一般是运行在沙盒里面的，当我们需要访问沙盒外资源的时候，就需要通过沙盒外的代理服务器来获取。一般情况下我们都是利用 WinRT API 通过 Runtime Broker 来和沙盒外互通，遇到要自定义的情况则是手动开一个 Win32 服务器来互通，但是有没有可能我们可以直接拿 UWP 本体当服务器呢？</p>
<p>UWP 本体实际上就是一个普通的 Win32 EXE 程序，只是想要以 UWP 状态运行只能通过系统托管，但是如果我们不需要它以 UWP 状态执行的时候完全可以直接双击打开它，这时候它就是一个很普通的散装 Win32 程序了。</p>
<p>利用这个特性，我们可以制作一种假装双击打开的方法，只需要在发现是 Win32 状态下启动就去用 API 唤起 UWP 形态的自己就行了</p>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="built_in">bool</span> IsPackagedApp</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">get</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">uint</span> length = <span class="number">0</span>;</span><br><span class="line">        PWSTR str = <span class="keyword">new</span>();</span><br><span class="line">        _ = PInvoke.GetCurrentPackageFullName(<span class="keyword">ref</span> length, str);</span><br><span class="line"> </span><br><span class="line">        <span class="built_in">char</span>* ptr = <span class="keyword">stackalloc</span> <span class="built_in">char</span>[(<span class="built_in">int</span>)length];</span><br><span class="line">        str = <span class="keyword">new</span>(ptr);</span><br><span class="line">        WIN32_ERROR result = PInvoke.GetCurrentPackageFullName(<span class="keyword">ref</span> length, str);</span><br><span class="line">        <span class="keyword">return</span> result != WIN32_ERROR.APPMODEL_ERROR_NO_PACKAGE;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (IsPackagedApp)</span><br><span class="line">    &#123;</span><br><span class="line">        Application.Start(<span class="keyword">static</span> p =&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            DispatcherQueueSynchronizationContext context = <span class="keyword">new</span>(DispatcherQueue.GetForCurrentThread());</span><br><span class="line">            SynchronizationContext.SetSynchronizationContext(context);</span><br><span class="line">            _ = <span class="keyword">new</span> App();</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        StartCoreApplicationAsync().Wait();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">async</span> Task <span class="title">StartCoreApplicationAsync</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    PackageManager manager = <span class="keyword">new</span>();</span><br><span class="line">    <span class="built_in">string</span> basePath = AppDomain.CurrentDomain.BaseDirectory;</span><br><span class="line">    XmlDocument manifest = <span class="keyword">await</span> XmlDocument.LoadFromFileAsync(<span class="keyword">await</span> StorageFile.GetFileFromPathAsync(Path.Combine(basePath, <span class="string">&quot;AppxManifest.xml&quot;</span>)));</span><br><span class="line">    IXmlNode identity = manifest.GetElementsByTagName(<span class="string">&quot;Identity&quot;</span>)?[<span class="number">0</span>];</span><br><span class="line">    <span class="built_in">string</span> name = identity.Attributes.FirstOrDefault(x =&gt; x.NodeName == <span class="string">&quot;Name&quot;</span>)?.InnerText;</span><br><span class="line">    IXmlNode application = manifest.GetElementsByTagName(<span class="string">&quot;Application&quot;</span>)?[<span class="number">0</span>];</span><br><span class="line">    <span class="built_in">string</span> id = application.Attributes.FirstOrDefault(x =&gt; x.NodeName == <span class="string">&quot;Id&quot;</span>)?.InnerText;</span><br><span class="line">    IEnumerable&lt;Package&gt; packages = manager.FindPackagesForUser(<span class="built_in">string</span>.Empty).Where(x =&gt; x.Id.FamilyName.StartsWith(name));</span><br><span class="line">    <span class="keyword">if</span> (packages.FirstOrDefault() <span class="keyword">is</span> Package package)</span><br><span class="line">    &#123;</span><br><span class="line">        IReadOnlyList&lt;AppListEntry&gt; entries = <span class="keyword">await</span> package.GetAppListEntriesAsync();</span><br><span class="line">        <span class="keyword">if</span> (entries?[<span class="number">0</span>] <span class="keyword">is</span> AppListEntry entry)</span><br><span class="line">        &#123;</span><br><span class="line">            _ = <span class="keyword">await</span> entry.LaunchAsync();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>既然我们可以让自己唤起自己，那么自己和自己通信也不是什么难事了，我们只需要在 UWP 形态下唤起一个 Win32 的自己，就可以自己利用自己滥权(bushi)了。]]></summary><title>【UWP】让 UWP 自己和自己通信</title><updated>2025-04-01T06:22:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><category term="UAP" scheme="https://wherewhere.github.io/tags/UAP/"/><content><![CDATA[<p>众所周知，2024年9月微软正式宣布了 .NET Core App 的 UWP 支持，至此我们终于可以在新版 csproj 用 .NET 8 及以上编写 UWP 了，那么我们可不可以通过修改清单的方式来让 UWP 变成 UAP 呢？</p><p><img src="https://github.com/user-attachments/assets/d8bdc64a-7a57-4c7c-861d-3a0b8b0f91ef" alt="屏幕截图(785)" loading="lazy"></p><p>UWP 和 UAP 使用的是同一套 WinRT API ，Windows 区分 UAP 和 UWP 的方式是看清单，只要是用 UAP 的清单就会仿真成 Win8.1 模式，于是我们只需要将清单变成 UAP 的样子就行了。所以首先我们新建一个 .NET 9 Native AOT 的 UWP 项目</p><p><img src="https://github.com/user-attachments/assets/4b9220a9-8fb6-4486-9f84-be58c4ed2c87" alt="Snipaste_2025-03-13_17-52-59" loading="lazy"></p><p>然后我们修改清单，Win8 App 清单如下，内容按需填写，Win8.1 App 的清单可以通过在 Github 搜索 <code>OSMaxVersionTested language:XML</code> 找到，<code>6.2</code> 是 Win8，<code>6.3</code> 是 Win8.1 (<code>$targetentrypoint$</code> 需配合 <code>ApplicationEntryPoint</code> 使用)<span id="more"></span></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">Package</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/2010/manifest&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Identity</span></span></span><br><span class="line"><span class="tag">    <span class="attr">Name</span>=<span class="string">&quot;wherewhere.CoreAppUAP&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">Publisher</span>=<span class="string">&quot;CN=where&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">Version</span>=<span class="string">&quot;0.0.1.0&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Properties</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">DisplayName</span>&gt;</span>CoreAppUAP<span class="tag">&lt;/<span class="name">DisplayName</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PublisherDisplayName</span>&gt;</span>wherewhere<span class="tag">&lt;/<span class="name">PublisherDisplayName</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Logo</span>&gt;</span>Assets\StoreLogo.png<span class="tag">&lt;/<span class="name">Logo</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Properties</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Prerequisites</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">OSMinVersion</span>&gt;</span>6.2.0<span class="tag">&lt;/<span class="name">OSMinVersion</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">OSMaxVersionTested</span>&gt;</span>6.3.0<span class="tag">&lt;/<span class="name">OSMaxVersionTested</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Prerequisites</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Resources</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Resource</span> <span class="attr">Language</span>=<span class="string">&quot;x-generate&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Resources</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Applications</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Application</span> <span class="attr">Id</span>=<span class="string">&quot;App&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">Executable</span>=<span class="string">&quot;$targetnametoken$.exe&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">EntryPoint</span>=<span class="string">&quot;$targetentrypoint$&quot;</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">VisualElements</span></span></span><br><span class="line"><span class="tag">        <span class="attr">DisplayName</span>=<span class="string">&quot;CoreAppUAP&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">Logo</span>=<span class="string">&quot;Assets\MediumTile.png&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">SmallLogo</span>=<span class="string">&quot;Assets\AppIcon.png&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">Description</span>=<span class="string">&quot;CoreAppUAP&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">ForegroundText</span>=<span class="string">&quot;light&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">BackgroundColor</span>=<span class="string">&quot;transparent&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">DefaultTile</span> <span class="attr">WideLogo</span>=<span class="string">&quot;Assets\WideTile.png&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">SplashScreen</span> <span class="attr">Image</span>=<span class="string">&quot;Assets\SplashScreen.png&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">InitialRotationPreference</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;landscape&quot;</span>/&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;portrait&quot;</span>/&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;landscapeFlipped&quot;</span>/&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">Rotation</span> <span class="attr">Preference</span>=<span class="string">&quot;portraitFlipped&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">InitialRotationPreference</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">LockScreen</span> <span class="attr">Notification</span>=<span class="string">&quot;badgeAndTileText&quot;</span> <span class="attr">BadgeLogo</span>=<span class="string">&quot;Assets\BadgeLogo.png&quot;</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">VisualElements</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">Application</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Applications</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">Capabilities</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Capability</span> <span class="attr">Name</span>=<span class="string">&quot;internetClient&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Capabilities</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Package</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后我们在 <code>csproj</code> 中添加以下内容来取消引用 <code>VC++</code> 和 <code>TargetDeviceFamily</code></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">PropertyGroup</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">AddMicrosoftVCLibsSDKReference</span>&gt;</span>False<span class="tag">&lt;/<span class="name">AddMicrosoftVCLibsSDKReference</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">EnableAppxWindowsUniversalTargetDeviceFamilyItem</span>&gt;</span>False<span class="tag">&lt;/<span class="name">EnableAppxWindowsUniversalTargetDeviceFamilyItem</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">PropertyGroup</span>&gt;</span></span><br></pre></td></tr></table></figure><p>不过删除了这些引用仍然会在清单生成 <code>Dependencies</code> 标签，如果 <code>Dependencies</code> 是空的注册时会报错，所以我们需要添加任务来删除清单中的 <code>Dependencies</code> 元素</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">UsingTask</span></span></span><br><span class="line"><span class="tag">  <span class="attr">TaskName</span>=<span class="string">&quot;RemoveDependencies&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">TaskFactory</span>=<span class="string">&quot;CodeTaskFactory&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">AssemblyFile</span>=<span class="string">&quot;$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">ParameterGroup</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">AppxManifestPath</span> <span class="attr">ParameterType</span>=<span class="string">&quot;System.String&quot;</span> <span class="attr">Required</span>=<span class="string">&quot;true&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">ParameterGroup</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Task</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Reference</span> <span class="attr">Include</span>=<span class="string">&quot;System.Xml&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Reference</span> <span class="attr">Include</span>=<span class="string">&quot;System.Xml.Linq&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Using</span> <span class="attr">Namespace</span>=<span class="string">&quot;System.Linq&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Using</span> <span class="attr">Namespace</span>=<span class="string">&quot;System.Xml.Linq&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Code</span> <span class="attr">Type</span>=<span class="string">&quot;Fragment&quot;</span> <span class="attr">Language</span>=<span class="string">&quot;cs&quot;</span>&gt;</span></span><br><span class="line">      &lt;![CDATA[</span><br><span class="line">          try</span><br><span class="line">          &#123;</span><br><span class="line">              var xdoc = XDocument.Load(AppxManifestPath);</span><br><span class="line">              var ns = xdoc.Root.Name.Namespace;</span><br><span class="line">              var dependencies = xdoc.Root.Descendants(ns + &quot;Dependencies&quot;);</span><br><span class="line">              if (dependencies != null)</span><br><span class="line">              &#123;</span><br><span class="line">                  foreach (var node in dependencies.ToArray())</span><br><span class="line">                  &#123;</span><br><span class="line">                      if (!node.HasElements)</span><br><span class="line">                      &#123;</span><br><span class="line">                          node.Remove();</span><br><span class="line">                      &#125;</span><br><span class="line">                  &#125;</span><br><span class="line">              &#125;</span><br><span class="line">              xdoc.Save(AppxManifestPath);</span><br><span class="line">          &#125;</span><br><span class="line">          catch</span><br><span class="line">          &#123;</span><br><span class="line">              Log.LogError(&quot;Failed to load Appx Manifest.&quot;);</span><br><span class="line">              _Success = false;</span><br><span class="line">          &#125;</span><br><span class="line">      ]]&gt;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">Code</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Task</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">UsingTask</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">Target</span></span></span><br><span class="line"><span class="tag">  <span class="attr">Name</span>=<span class="string">&quot;RemoveDependencies&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">AfterTargets</span>=<span class="string">&quot;AfterGenerateAppxManifest&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Message</span> <span class="attr">Importance</span>=<span class="string">&quot;high&quot;</span> <span class="attr">Text</span>=<span class="string">&quot;RemoveDependencies&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">RemoveDependencies</span> <span class="attr">AppxManifestPath</span>=<span class="string">&quot;%(FinalAppxManifest.Identity)&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Target</span>&gt;</span></span><br></pre></td></tr></table></figure><p>由于 XAML 编译器编译 <code>App.xaml</code> 时生成的入口点会使用 <code>DispatcherQueueSynchronizationContext</code> 来注册线程上下文，这是 <code>16299</code> 才加入的 API，UAP 在获取 <code>DispatcherQueue</code> 时会返回 <code>null</code>，所以我们需要手动生成入口点和注册线程上下文</p><p>首先我们需要添加 <code>DISABLE_XAML_GENERATED_MAIN</code> 来注释自动生成的入口点</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">DefineConstants</span>&gt;</span>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN<span class="tag">&lt;/<span class="name">DefineConstants</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后手动编写程序入口点</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] <span class="keyword">args</span></span>)</span> =&gt; Application.Start(<span class="keyword">static</span> p =&gt; _ = <span class="keyword">new</span> App());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接着我们需要手动创建一个使用 <code>CoreDispatcher</code> 的线程上下文</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Provides a synchronization context for <span class="doctag">&lt;see cref=&quot;CoreDispatcher&quot;/&gt;</span>.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dispatcher&quot;&gt;</span>The <span class="doctag">&lt;see cref=&quot;CoreDispatcher&quot;/&gt;</span> to associate this <span class="doctag">&lt;see cref=&quot;CoreDispatcherSynchronizationContext&quot;/&gt;</span> with.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">class</span> <span class="title">CoreDispatcherSynchronizationContext</span>(<span class="params">CoreDispatcher dispatcher</span>) : SynchronizationContext</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc /&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">Post</span>(<span class="params">SendOrPostCallback d, <span class="built_in">object</span>? state</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        ArgumentNullException.ThrowIfNull(d);</span><br><span class="line">        _ = dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt; d.Invoke(state));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc /&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> SynchronizationContext <span class="title">CreateCopy</span>()</span> =&gt; <span class="keyword">new</span> CoreDispatcherSynchronizationContext(dispatcher);</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc /&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">Send</span>(<span class="params">SendOrPostCallback d, <span class="built_in">object</span>? state</span>)</span> =&gt; <span class="keyword">throw</span> <span class="keyword">new</span> NotSupportedException(<span class="string">&quot;&#x27;SynchronizationContext.Send&#x27; is not supported.&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>并在合适的时间注册线程上下文，比如 <code>OnWindowCreated</code></p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">protected</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">OnWindowCreated</span>(<span class="params">WindowCreatedEventArgs e</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (SynchronizationContext.Current == <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        CoreDispatcherSynchronizationContext context = <span class="keyword">new</span>(e.Window.Dispatcher);</span><br><span class="line">        SynchronizationContext.SetSynchronizationContext(context);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">base</span>.OnWindowCreated(e);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后就可以点运行运行了</p><p><img src="https://github.com/user-attachments/assets/9f1e235a-ac73-4477-bb24-a12942b5e1ba" alt="Snipaste_2025-03-13_18-19-11" loading="lazy"></p><p>经测试，热重载等调试功能正常，UAP 可以调用一些与 UI 无关的新 WinRT API，甚至可以扩展标题栏，不过打包后无法成功在 Win8.1 安装，原因未知</p><p><img src="https://github.com/user-attachments/assets/c40b031f-2f83-4349-9b76-6971c99555e3" alt="Snipaste_2025-03-13_18-23-46" loading="lazy"></p><p>最后附上示例应用：<a href="https://github.com/wherewhere/CoreAppUAP">https://github.com/wherewhere/CoreAppUAP</a></p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/18770443">【UAP】使用 .NET Core App 编写 UAP</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2025年3月13日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2025/03/13/%E3%80%90UAP%E3%80%91%E4%BD%BF%E7%94%A8-NET-Core-App-%E7%BC%96%E5%86%99-UAP/</id><link href="https://wherewhere.github.io/2025/03/13/%E3%80%90UAP%E3%80%91%E4%BD%BF%E7%94%A8-NET-Core-App-%E7%BC%96%E5%86%99-UAP/"/><published>2025-03-13T10:44:00.000Z</published><summary><![CDATA[<p>众所周知，2024年9月微软正式宣布了 .NET Core App 的 UWP 支持，至此我们终于可以在新版 csproj 用 .NET 8 及以上编写 UWP 了，那么我们可不可以通过修改清单的方式来让 UWP 变成 UAP 呢？</p>
<p><img src="https://github.com/user-attachments/assets/d8bdc64a-7a57-4c7c-861d-3a0b8b0f91ef" alt="屏幕截图(785)" loading="lazy"></p>
<p>UWP 和 UAP 使用的是同一套 WinRT API ，Windows 区分 UAP 和 UWP 的方式是看清单，只要是用 UAP 的清单就会仿真成 Win8.1 模式，于是我们只需要将清单变成 UAP 的样子就行了。所以首先我们新建一个 .NET 9 Native AOT 的 UWP 项目</p>
<p><img src="https://github.com/user-attachments/assets/4b9220a9-8fb6-4486-9f84-be58c4ed2c87" alt="Snipaste_2025-03-13_17-52-59" loading="lazy"></p>
<p>然后我们修改清单，Win8 App 清单如下，内容按需填写，Win8.1 App 的清单可以通过在 Github 搜索 <code>OSMaxVersionTested language:XML</code> 找到，<code>6.2</code> 是 Win8，<code>6.3</code> 是 Win8.1 (<code>$targetentrypoint$</code> 需配合 <code>ApplicationEntryPoint</code> 使用)]]></summary><title>【UAP】使用 .NET Core App 编写 UAP</title><updated>2025-03-13T10:44:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><category term="XAML岛" scheme="https://wherewhere.github.io/tags/XAML%E5%B2%9B/"/><content><![CDATA[<p>众所周知，UWP 使用的窗口模型是 CoreWindow，但是 UWP 本身只是一个应用模型，所以完全可以创建 win32 窗口，那么我们可以不可以创建一个 win32 窗口，然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢？本篇将讲述如何在 UWP 创建一个 XAML 岛窗口。</p><p><img src="https://github.com/user-attachments/assets/ecffb39b-e268-4530-b2ca-d01bccad04a7" alt="示例" loading="lazy"></p><p>首先，XAML 岛会判断当前的应用模型是否为<code>ClassicDesktop</code>，所以我们需要利用<code>Detours</code>劫持<code>AppPolicyGetWindowingModel</code>方法。具体内容如下：<span id="more"></span></p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#r &quot;nuget:Detours.Win32Metadata&quot;</span></span><br><span class="line"><span class="meta">#r &quot;nuget:Microsoft.Windows.CsWin32&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Runtime.CompilerServices;</span><br><span class="line"><span class="keyword">using</span> System.Runtime.InteropServices;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32.Foundation;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32.Storage.Packaging.Appx;</span><br><span class="line"><span class="keyword">using</span> Detours = Microsoft.Detours.PInvoke;</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Represents a hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">HookWindowingModel</span> : <span class="title">IDisposable</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The value that indicates whether the class has been disposed.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">bool</span> disposed;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The reference count for the hook.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">int</span> refCount;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The value that represents the current process token.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">int</span> currentProcessToken = <span class="number">-6</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The original <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt; AppPolicyGetWindowingModel;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Initializes a new instance of the <span class="doctag">&lt;see cref=&quot;HookWindowingModel&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">HookWindowingModel</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        refCount++;</span><br><span class="line">        StartHook();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Finalizes this instance of the <span class="doctag">&lt;see cref=&quot;HookWindowingModel&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    ~HookWindowingModel()</span><br><span class="line">    &#123;</span><br><span class="line">        Dispose();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets the value that indicates whether the hook is active.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">bool</span> IsHooked &#123; <span class="keyword">get</span>; <span class="keyword">private</span> <span class="keyword">set</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets or sets the windowing model to use when the hooked <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function is called.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">internal</span> <span class="keyword">static</span> AppPolicyWindowingModel WindowingModel &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125; = AppPolicyWindowingModel.AppPolicyWindowingModel_ClassicDesktop;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Starts the hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="keyword">void</span> <span class="title">StartHook</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">using</span> FreeLibrarySafeHandle library = PInvoke.GetModuleHandle(<span class="string">&quot;KERNEL32.dll&quot;</span>);</span><br><span class="line">            <span class="keyword">if</span> (!library.IsInvalid &amp;&amp; NativeLibrary.TryGetExport(library.DangerousGetHandle(), <span class="keyword">nameof</span>(PInvoke.AppPolicyGetWindowingModel), <span class="keyword">out</span> <span class="built_in">nint</span> appPolicyGetWindowingModel))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">void</span>* appPolicyGetWindowingModelPtr = (<span class="keyword">void</span>*)appPolicyGetWindowingModel;</span><br><span class="line">                <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt; overrideAppPolicyGetWindowingModel = &amp;OverrideAppPolicyGetWindowingModel;</span><br><span class="line"></span><br><span class="line">                _ = Detours.DetourRestoreAfterWith();</span><br><span class="line"></span><br><span class="line">                _ = Detours.DetourTransactionBegin();</span><br><span class="line">                _ = Detours.DetourUpdateThread(PInvoke.GetCurrentThread());</span><br><span class="line">                _ = Detours.DetourAttach(<span class="keyword">ref</span> appPolicyGetWindowingModelPtr, overrideAppPolicyGetWindowingModel);</span><br><span class="line">                _ = Detours.DetourTransactionCommit();</span><br><span class="line"></span><br><span class="line">                AppPolicyGetWindowingModel = (<span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt;)appPolicyGetWindowingModelPtr;</span><br><span class="line">                IsHooked = <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Ends the hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="keyword">void</span> <span class="title">EndHook</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (--refCount == <span class="number">0</span> &amp;&amp; IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">void</span>* appPolicyGetWindowingModelPtr = AppPolicyGetWindowingModel;</span><br><span class="line">            <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt; overrideAppPolicyGetWindowingModel = &amp;OverrideAppPolicyGetWindowingModel;</span><br><span class="line"></span><br><span class="line">            _ = Detours.DetourTransactionBegin();</span><br><span class="line">            _ = Detours.DetourUpdateThread(PInvoke.GetCurrentThread());</span><br><span class="line">            _ = Detours.DetourDetach(&amp;appPolicyGetWindowingModelPtr, overrideAppPolicyGetWindowingModel);</span><br><span class="line">            _ = Detours.DetourTransactionCommit();</span><br><span class="line"></span><br><span class="line">            AppPolicyGetWindowingModel = <span class="literal">null</span>;</span><br><span class="line">            IsHooked = <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;policy&quot;&gt;</span>A pointer to a variable of the <span class="doctag">&lt;a href=&quot;https://docs.microsoft.com/windows/win32/api/appmodel/ne-appmodel-apppolicywindowingmodel&quot;&gt;</span>AppPolicyWindowingModel<span class="doctag">&lt;/a&gt;</span> enumerated type.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> When the function returns successfully, the variable contains the <span class="doctag">&lt;see cref=&quot;WindowingModel&quot;/&gt;</span> when the identified process is current; otherwise, the windowing model of the identified process.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The overridden <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span></span></span><br><span class="line">    [<span class="meta">UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)</span>])]</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> WIN32_ERROR <span class="title">OverrideAppPolicyGetWindowingModel</span>(<span class="params">HANDLE processToken, AppPolicyWindowingModel* policy</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> ((<span class="built_in">int</span>)processToken.Value == currentProcessToken)</span><br><span class="line">        &#123;</span><br><span class="line">            *policy = WindowingModel;</span><br><span class="line">            <span class="keyword">return</span> WIN32_ERROR.ERROR_SUCCESS;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> AppPolicyGetWindowingModel(processToken, policy);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Dispose</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!disposed &amp;&amp; IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            EndHook();</span><br><span class="line">        &#125;</span><br><span class="line">        GC.SuppressFinalize(<span class="keyword">this</span>);</span><br><span class="line">        disposed = <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>准备工作完成，接下来我们就可以创建窗口了，首先我们需要新创建一个线程，CoreWindow 线程无法新建 XAML 岛，新建线程只需要用<code>Thread</code>就行了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> Thread(() =&gt; &#123; ... &#125;);</span><br></pre></td></tr></table></figure><p>首先我们需要创建 XAML 岛，这时我们就需要利用上面劫持器来劫持获取应用模型的方法了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">DesktopWindowXamlSource source;</span><br><span class="line"><span class="keyword">using</span> (HookWindowingModel hook = <span class="keyword">new</span>())</span><br><span class="line">&#123;</span><br><span class="line">    source = <span class="keyword">new</span> DesktopWindowXamlSource();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>微软并没有单独提供一个 Win32 窗口管理的轮子，如果引用 Windows Forms 就太臃肿了，于是我们需要手动制作一个 Window 类：</p><p>由于 C#&#x2F;Win32 不支持源生成 COM 以支持 AOT，所以我们需要手写<code>IDesktopWindowXamlSourceNative</code>定义：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Windows.Win32.System.WinRT.Xaml</span></span><br><span class="line">&#123;</span><br><span class="line">    [<span class="meta">GeneratedComInterface</span>]</span><br><span class="line">    [<span class="meta">Guid(<span class="string">&quot;3CBCF1BF-2F76-4E9C-96AB-E84B37972554&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">internal</span> <span class="keyword">partial</span> <span class="keyword">interface</span> <span class="title">IDesktopWindowXamlSourceNative</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> Attaches the current **IDesktopWindowXamlSourceNative** instance to a parent UI element in your desktop app that is associated with a window handle.</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;parentWnd&quot;&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span>Type: **HWND** The window handle of the parent UI element in which you want to host a WinRT XAML control.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span><span class="doctag">&lt;see href=&quot;https://learn.microsoft.com/windows/win32/api/windows.ui.xaml.hosting.desktopwindowxamlsource/nf-windows-ui-xaml-hosting-desktopwindowxamlsource-idesktopwindowxamlsourcenative-attachtowindow#parameters&quot;&gt;</span>Read more on docs.microsoft.com<span class="doctag">&lt;/see&gt;</span>.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>If this method succeeds, it returns S_OK. Otherwise, it returns an **HRESULT** error code.<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span>For a code example that demonstrates how to use this method, see [XamlBridge.cpp](https://github.com/microsoft/Xaml-Islands-Samples/blob/master/Samples/Win32/SampleCppApp/XamlBridge.cpp) in the SampleCppApp sample in the XAML Island samples repo. &gt; [!IMPORTANT] &gt; Make sure that your code calls the **AttachToWindow** method only once per [DesktopWindowXamlSource](/uwp/api/windows.ui.xaml.hosting.desktopwindowxamlsource) object. Calling this method more than once for a **DesktopWindowXamlSource** object could result in a memory leak.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span><span class="doctag">&lt;see href=&quot;https://learn.microsoft.com/windows/win32/api/windows.ui.xaml.hosting.desktopwindowxamlsource/nf-windows-ui-xaml-hosting-desktopwindowxamlsource-idesktopwindowxamlsourcenative-attachtowindow#&quot;&gt;</span>Read more on docs.microsoft.com<span class="doctag">&lt;/see&gt;</span>.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">        [<span class="meta">PreserveSig</span>]</span><br><span class="line">        [<span class="meta">return: MarshalAs(UnmanagedType.Error)</span>]</span><br><span class="line">        <span class="function"><span class="built_in">int</span> <span class="title">AttachToWindow</span>(<span class="params"><span class="built_in">nint</span> parentWnd</span>)</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> Gets the window handle of the parent UI element that is associated with the current IDesktopWindowXamlSourceNative instance.</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>If this method succeeds, it returns S_OK. Otherwise, it returns an **HRESULT** error code.<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        [<span class="meta">PreserveSig</span>]</span><br><span class="line">        [<span class="meta">return: MarshalAs(UnmanagedType.Error)</span>]</span><br><span class="line">        <span class="function"><span class="built_in">int</span> <span class="title">get_WindowHandle</span>(<span class="params"><span class="keyword">out</span> <span class="built_in">nint</span> hWnd</span>)</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">file</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title">Extensions</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> Gets the window handle of the parent UI element that is associated with the current IDesktopWindowXamlSourceNative instance.</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> HWND <span class="title">WindowHandle</span>(<span class="params"><span class="keyword">this</span> IDesktopWindowXamlSourceNative source</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            _ = source.get_WindowHandle(<span class="keyword">out</span> <span class="built_in">nint</span> hWnd);</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> HWND(hWnd);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后就可以制作 Window 类了：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Represents a system-managed container for the content of an app.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">DesktopWindow</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">bool</span> m_bIsClosed = <span class="literal">false</span>;</span><br><span class="line">    <span class="keyword">private</span> DesktopWindowXamlSource m_source;</span><br><span class="line">    <span class="keyword">private</span> IDesktopWindowXamlSourceNative m_native;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> HWND m_hwnd;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> WNDCLASSEXW m_wndClassEx;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Initializes a new instance of the <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">DesktopWindow</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        m_wndClassEx = RegisterDesktopWindowClass(WNDPROC);</span><br><span class="line">        m_hwnd = CreateDesktopWindow();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets the event dispatcher for the window.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> CoreDispatcher Dispatcher &#123; <span class="keyword">get</span>; <span class="keyword">private</span> <span class="keyword">set</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets the <span class="doctag">&lt;see cref=&quot;DesktopWindowXamlSource&quot;/&gt;</span> to provide XAML for this window.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> DesktopWindowXamlSource WindowXamlSource</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">get</span> =&gt; m_source;</span><br><span class="line">        <span class="keyword">private</span> <span class="keyword">init</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (m_source != <span class="keyword">value</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                m_source = <span class="keyword">value</span>;</span><br><span class="line">                <span class="keyword">if</span> (<span class="keyword">value</span> != <span class="literal">null</span>)</span><br><span class="line">                &#123;</span><br><span class="line">                    Dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;</span><br><span class="line">                    m_native = <span class="keyword">value</span>.As&lt;IDesktopWindowXamlSourceNative&gt;();</span><br><span class="line">                    m_native.AttachToWindow(m_hwnd);</span><br><span class="line">                    ResizeWindowToDesktopWindowXamlSourceWindowDimensions();</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                &#123;</span><br><span class="line">                    m_native = <span class="literal">null</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Shows the window and activates it.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Show</span>()</span> =&gt; _ = PInvoke.ShowWindow(m_hwnd, SHOW_WINDOW_CMD.SW_NORMAL);</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> LRESULT <span class="title">WNDPROC</span>(<span class="params">HWND hWnd, <span class="built_in">uint</span> message, WPARAM wParam, LPARAM lParam</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">switch</span> (message)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_PAINT:</span><br><span class="line">                HDC hdc = PInvoke.BeginPaint(hWnd, <span class="keyword">out</span> PAINTSTRUCT ps);</span><br><span class="line">                _ = PInvoke.GetClientRect(hWnd, <span class="keyword">out</span> RECT rect);</span><br><span class="line">                _ = PInvoke.FillRect(hdc, rect, <span class="keyword">new</span> DefaultSafeHandle(PInvoke.GetStockObject(GET_STOCK_OBJECT_FLAGS.WHITE_BRUSH)));</span><br><span class="line">                _ = PInvoke.EndPaint(hWnd, ps);</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_CLOSE <span class="keyword">when</span> m_bIsClosed:</span><br><span class="line">                <span class="keyword">goto</span> <span class="literal">default</span>;</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_CLOSE:</span><br><span class="line">                m_bIsClosed = <span class="literal">true</span>;</span><br><span class="line">                <span class="keyword">goto</span> <span class="literal">default</span>;</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_SIZE:</span><br><span class="line">                ResizeWindowToDesktopWindowXamlSourceWindowDimensions();</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_CREATE:</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_DESTROY:</span><br><span class="line">                PInvoke.PostQuitMessage(<span class="number">0</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="literal">default</span>:</span><br><span class="line">                <span class="keyword">return</span> PInvoke.DefWindowProc(hWnd, message, wParam, lParam);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">ResizeWindowToDesktopWindowXamlSourceWindowDimensions</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (m_bIsClosed) <span class="keyword">return</span>;</span><br><span class="line">        _ = PInvoke.GetClientRect(m_hwnd, <span class="keyword">out</span> RECT rect);</span><br><span class="line">        _ = PInvoke.SetWindowPos(</span><br><span class="line">            m_native.WindowHandle(),</span><br><span class="line">            <span class="keyword">new</span> HWND(),</span><br><span class="line">            <span class="number">0</span>, <span class="number">0</span>,</span><br><span class="line">            rect.Width, rect.Height,</span><br><span class="line">            SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE | SET_WINDOW_POS_FLAGS.SWP_NOZORDER | SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">DesktopWindow</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">readonly</span> <span class="keyword">unsafe</span> HINSTANCE g_hInstance = <span class="keyword">new</span>((<span class="keyword">void</span>*)Process.GetCurrentProcess().Handle);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// win32 window class name for top-level WinUI desktop windows</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">string</span> s_windowClassName = <span class="string">&quot;WinUIDesktopWin32WindowClass&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Default window title for top-level WinUI desktop windows</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">string</span> s_defaultWindowTitle = <span class="string">&quot;WinUI Desktop&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> WNDCLASSEXW <span class="title">RegisterDesktopWindowClass</span>(<span class="params">WNDPROC lpfnWndProc</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!PInvoke.GetClassInfoEx(<span class="keyword">new</span> DefaultSafeHandle(g_hInstance), s_windowClassName, <span class="keyword">out</span> WNDCLASSEXW wndClassEx))</span><br><span class="line">        &#123;</span><br><span class="line">            wndClassEx.cbSize = (<span class="built_in">uint</span>)Marshal.SizeOf(wndClassEx);</span><br><span class="line">            wndClassEx.style = WNDCLASS_STYLES.CS_HREDRAW | WNDCLASS_STYLES.CS_VREDRAW;</span><br><span class="line">            wndClassEx.cbClsExtra = <span class="number">0</span>;</span><br><span class="line">            wndClassEx.cbWndExtra = <span class="number">0</span>;</span><br><span class="line">            wndClassEx.hCursor = PInvoke.LoadCursor(<span class="keyword">new</span> HINSTANCE(), PInvoke.IDC_ARROW);</span><br><span class="line">            wndClassEx.hbrBackground = (HBRUSH)((<span class="built_in">nint</span>)SYS_COLOR_INDEX.COLOR_WINDOW + <span class="number">1</span>);</span><br><span class="line">            wndClassEx.hInstance = g_hInstance;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">fixed</span> (<span class="built_in">char</span>* lps_windowClassName = s_windowClassName)</span><br><span class="line">            &#123;</span><br><span class="line">                wndClassEx.lpszClassName = lps_windowClassName;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            wndClassEx.lpfnWndProc = lpfnWndProc;</span><br><span class="line">            _ = PInvoke.RegisterClassEx(wndClassEx);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">return</span> wndClassEx;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">default</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> HWND <span class="title">CreateDesktopWindow</span>()</span> =&gt;</span><br><span class="line">        PInvoke.CreateWindowEx(</span><br><span class="line">            <span class="number">0</span>,                                  <span class="comment">// Extended Style</span></span><br><span class="line">            s_windowClassName,                  <span class="comment">// name of window class</span></span><br><span class="line">            s_defaultWindowTitle,               <span class="comment">// title-bar string</span></span><br><span class="line">            WINDOW_STYLE.WS_OVERLAPPEDWINDOW | WINDOW_STYLE.WS_VISIBLE,  <span class="comment">// top-level window</span></span><br><span class="line">            <span class="built_in">int</span>.MinValue,                       <span class="comment">// default horizontal position</span></span><br><span class="line">            (<span class="built_in">int</span>)SHOW_WINDOW_CMD.SW_HIDE,       <span class="comment">// If the y parameter is some other value,</span></span><br><span class="line">                                                <span class="comment">// then the window manager calls ShowWindow with that value as the nCmdShow parameter</span></span><br><span class="line">            <span class="built_in">int</span>.MinValue,                       <span class="comment">// default width</span></span><br><span class="line">            <span class="built_in">int</span>.MinValue,                       <span class="comment">// default height</span></span><br><span class="line">            <span class="keyword">new</span> HWND(),                         <span class="comment">// no owner window</span></span><br><span class="line">            <span class="literal">null</span>,                               <span class="comment">// use class menu</span></span><br><span class="line">            <span class="keyword">new</span> DefaultSafeHandle(g_hInstance),</span><br><span class="line">            <span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">DefaultSafeHandle</span>(<span class="params"><span class="built_in">nint</span> invalidHandleValue, <span class="built_in">bool</span> ownsHandle</span>) : <span class="title">SafeHandle</span>(<span class="params">invalidHandleValue, ownsHandle</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">DefaultSafeHandle</span>(<span class="params"><span class="built_in">nint</span> handle</span>) : <span class="title">this</span>(<span class="params">handle, <span class="literal">true</span></span>)</span> =&gt; SetHandle(handle);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">override</span> <span class="built_in">bool</span> IsInvalid =&gt; handle != <span class="built_in">nint</span>.Zero;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">protected</span> <span class="keyword">override</span> <span class="built_in">bool</span> <span class="title">ReleaseHandle</span>()</span> =&gt; <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们就可以初始化一个窗口了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DesktopWindow window = <span class="keyword">new</span>() &#123; WindowXamlSource = source &#125;;</span><br></pre></td></tr></table></figure><p>最后不要忘了用消息循环保持当前线程，不然这里跑完了窗口就退出了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">MSG msg = <span class="keyword">new</span>();</span><br><span class="line"><span class="keyword">while</span> (msg.message != PInvoke.WM_QUIT)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (PInvoke.PeekMessage(<span class="keyword">out</span> msg, <span class="keyword">new</span> HWND(), <span class="number">0</span>, <span class="number">0</span>, PEEK_MESSAGE_REMOVE_TYPE.PM_REMOVE))</span><br><span class="line">    &#123;</span><br><span class="line">        _ = PInvoke.DispatchMessage(msg);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最后把之前的东西组合起来，再加点东西：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Represents a system-managed container for the content of an app.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">DesktopWindow</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">bool</span> m_bIsClosed = <span class="literal">false</span>;</span><br><span class="line">    <span class="keyword">private</span> DesktopWindowXamlSource m_source;</span><br><span class="line">    <span class="keyword">private</span> IDesktopWindowXamlSourceNative m_native;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> HWND m_hwnd;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">readonly</span> WNDCLASSEXW m_wndClassEx;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Initializes a new instance of the <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">DesktopWindow</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        m_wndClassEx = RegisterDesktopWindowClass(WNDPROC);</span><br><span class="line">        m_hwnd = CreateDesktopWindow();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Get the handle of the window.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">nint</span> Hwnd =&gt; m_hwnd;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets the event dispatcher for the window.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> CoreDispatcher Dispatcher &#123; <span class="keyword">get</span>; <span class="keyword">private</span> <span class="keyword">set</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets or sets the visual root of an application window.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> UIElement Content</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">get</span> =&gt; WindowXamlSource.Content;</span><br><span class="line">        <span class="keyword">set</span> =&gt; WindowXamlSource.Content = <span class="keyword">value</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets or sets the XamlRoot in which this element is being viewed.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    [<span class="meta">SupportedOSPlatform(<span class="string">&quot;Windows10.0.18362.0&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">public</span> XamlRoot XamlRoot</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">get</span> =&gt; WindowXamlSource.Content.XamlRoot;</span><br><span class="line">        <span class="keyword">set</span> =&gt; WindowXamlSource.Content.XamlRoot = <span class="keyword">value</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets or sets a string used for the window title.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">unsafe</span> <span class="built_in">string</span> Title</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">get</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">int</span> windowTextLength = PInvoke.GetWindowTextLength(m_hwnd);</span><br><span class="line">            <span class="built_in">char</span>* windowText = <span class="keyword">stackalloc</span> <span class="built_in">char</span>[windowTextLength + <span class="number">1</span>];</span><br><span class="line">            _ = PInvoke.GetWindowText(m_hwnd, windowText, windowTextLength + <span class="number">1</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">string</span>(windowText);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">set</span> =&gt; _ = PInvoke.SetWindowText(m_hwnd, <span class="keyword">value</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets the <span class="doctag">&lt;see cref=&quot;DesktopWindowXamlSource&quot;/&gt;</span> to provide XAML for this window.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> DesktopWindowXamlSource WindowXamlSource</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">get</span> =&gt; m_source;</span><br><span class="line">        <span class="keyword">private</span> <span class="keyword">init</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (m_source != <span class="keyword">value</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                m_source = <span class="keyword">value</span>;</span><br><span class="line">                <span class="keyword">if</span> (<span class="keyword">value</span> != <span class="literal">null</span>)</span><br><span class="line">                &#123;</span><br><span class="line">                    Dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;</span><br><span class="line">                    m_native = <span class="keyword">value</span>.As&lt;IDesktopWindowXamlSourceNative&gt;();</span><br><span class="line">                    m_native.AttachToWindow(m_hwnd);</span><br><span class="line">                    ResizeWindowToDesktopWindowXamlSourceWindowDimensions();</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                &#123;</span><br><span class="line">                    m_native = <span class="literal">null</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Occurs when the window has closed.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">event</span> TypedEventHandler&lt;DesktopWindow, <span class="built_in">object</span>&gt; Closed;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Shows the window and activates it.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Show</span>()</span> =&gt; _ = PInvoke.ShowWindow(m_hwnd, SHOW_WINDOW_CMD.SW_NORMAL);</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Sets the icon for the window, using the specified icon path.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;iconPath&quot;&gt;</span>The path of the icon.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">unsafe</span> <span class="keyword">void</span> <span class="title">SetIcon</span>(<span class="params"><span class="built_in">string</span> iconPath</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">fixed</span> (<span class="built_in">char</span>* ptr = iconPath)</span><br><span class="line">        &#123;</span><br><span class="line">            HANDLE icon = PInvoke.LoadImage(<span class="keyword">new</span> HINSTANCE(), ptr, GDI_IMAGE_TYPE.IMAGE_ICON, <span class="number">0</span>, <span class="number">0</span>, IMAGE_FLAGS.LR_LOADFROMFILE);</span><br><span class="line">            _ = PInvoke.SendMessage(m_hwnd, PInvoke.WM_SETICON, PInvoke.ICON_BIG, <span class="keyword">new</span> LPARAM((<span class="built_in">nint</span>)icon.Value));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> LRESULT <span class="title">WNDPROC</span>(<span class="params">HWND hWnd, <span class="built_in">uint</span> message, WPARAM wParam, LPARAM lParam</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">switch</span> (message)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_PAINT:</span><br><span class="line">                HDC hdc = PInvoke.BeginPaint(hWnd, <span class="keyword">out</span> PAINTSTRUCT ps);</span><br><span class="line">                _ = PInvoke.GetClientRect(hWnd, <span class="keyword">out</span> RECT rect);</span><br><span class="line">                _ = PInvoke.FillRect(hdc, rect, <span class="keyword">new</span> DefaultSafeHandle(PInvoke.GetStockObject(GET_STOCK_OBJECT_FLAGS.WHITE_BRUSH)));</span><br><span class="line">                _ = PInvoke.EndPaint(hWnd, ps);</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_CLOSE <span class="keyword">when</span> m_bIsClosed:</span><br><span class="line">                <span class="keyword">goto</span> <span class="literal">default</span>;</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_CLOSE:</span><br><span class="line">                m_bIsClosed = <span class="literal">true</span>;</span><br><span class="line">                Closed?.Invoke(<span class="keyword">this</span>, <span class="literal">null</span>);</span><br><span class="line">                <span class="keyword">goto</span> <span class="literal">default</span>;</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_SIZE:</span><br><span class="line">                ResizeWindowToDesktopWindowXamlSourceWindowDimensions();</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_CREATE:</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="keyword">case</span> PInvoke.WM_DESTROY:</span><br><span class="line">                PInvoke.PostQuitMessage(<span class="number">0</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> LRESULT();</span><br><span class="line">            <span class="literal">default</span>:</span><br><span class="line">                <span class="keyword">return</span> PInvoke.DefWindowProc(hWnd, message, wParam, lParam);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">ResizeWindowToDesktopWindowXamlSourceWindowDimensions</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (m_bIsClosed) <span class="keyword">return</span>;</span><br><span class="line">        _ = PInvoke.GetClientRect(m_hwnd, <span class="keyword">out</span> RECT rect);</span><br><span class="line">        _ = PInvoke.SetWindowPos(</span><br><span class="line">            m_native.WindowHandle(),</span><br><span class="line">            <span class="keyword">new</span> HWND(),</span><br><span class="line">            <span class="number">0</span>, <span class="number">0</span>,</span><br><span class="line">            rect.Width, rect.Height,</span><br><span class="line">            SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE | SET_WINDOW_POS_FLAGS.SWP_NOZORDER | SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">DesktopWindow</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">readonly</span> <span class="keyword">unsafe</span> HINSTANCE g_hInstance = <span class="keyword">new</span>((<span class="keyword">void</span>*)Process.GetCurrentProcess().Handle);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// win32 window class name for top-level WinUI desktop windows</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">string</span> s_windowClassName = <span class="string">&quot;WinUIDesktopWin32WindowClass&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Default window title for top-level WinUI desktop windows</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">string</span> s_defaultWindowTitle = <span class="string">&quot;WinUI Desktop&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> WNDCLASSEXW <span class="title">RegisterDesktopWindowClass</span>(<span class="params">WNDPROC lpfnWndProc</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!PInvoke.GetClassInfoEx(<span class="keyword">new</span> DefaultSafeHandle(g_hInstance), s_windowClassName, <span class="keyword">out</span> WNDCLASSEXW wndClassEx))</span><br><span class="line">        &#123;</span><br><span class="line">            wndClassEx.cbSize = (<span class="built_in">uint</span>)Marshal.SizeOf(wndClassEx);</span><br><span class="line">            wndClassEx.style = WNDCLASS_STYLES.CS_HREDRAW | WNDCLASS_STYLES.CS_VREDRAW;</span><br><span class="line">            wndClassEx.cbClsExtra = <span class="number">0</span>;</span><br><span class="line">            wndClassEx.cbWndExtra = <span class="number">0</span>;</span><br><span class="line">            wndClassEx.hCursor = PInvoke.LoadCursor(<span class="keyword">new</span> HINSTANCE(), PInvoke.IDC_ARROW);</span><br><span class="line">            wndClassEx.hbrBackground = (HBRUSH)((<span class="built_in">nint</span>)SYS_COLOR_INDEX.COLOR_WINDOW + <span class="number">1</span>);</span><br><span class="line">            wndClassEx.hInstance = g_hInstance;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">fixed</span> (<span class="built_in">char</span>* lps_windowClassName = s_windowClassName)</span><br><span class="line">            &#123;</span><br><span class="line">                wndClassEx.lpszClassName = lps_windowClassName;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            wndClassEx.lpfnWndProc = lpfnWndProc;</span><br><span class="line">            _ = PInvoke.RegisterClassEx(wndClassEx);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">return</span> wndClassEx;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">default</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> HWND <span class="title">CreateDesktopWindow</span>()</span> =&gt;</span><br><span class="line">        PInvoke.CreateWindowEx(</span><br><span class="line">            <span class="number">0</span>,                                  <span class="comment">// Extended Style</span></span><br><span class="line">            s_windowClassName,                  <span class="comment">// name of window class</span></span><br><span class="line">            s_defaultWindowTitle,               <span class="comment">// title-bar string</span></span><br><span class="line">            WINDOW_STYLE.WS_OVERLAPPEDWINDOW | WINDOW_STYLE.WS_VISIBLE,  <span class="comment">// top-level window</span></span><br><span class="line">            <span class="built_in">int</span>.MinValue,                       <span class="comment">// default horizontal position</span></span><br><span class="line">            (<span class="built_in">int</span>)SHOW_WINDOW_CMD.SW_HIDE,       <span class="comment">// If the y parameter is some other value,</span></span><br><span class="line">                                                <span class="comment">// then the window manager calls ShowWindow with that value as the nCmdShow parameter</span></span><br><span class="line">            <span class="built_in">int</span>.MinValue,                       <span class="comment">// default width</span></span><br><span class="line">            <span class="built_in">int</span>.MinValue,                       <span class="comment">// default height</span></span><br><span class="line">            <span class="keyword">new</span> HWND(),                         <span class="comment">// no owner window</span></span><br><span class="line">            <span class="literal">null</span>,                               <span class="comment">// use class menu</span></span><br><span class="line">            <span class="keyword">new</span> DefaultSafeHandle(g_hInstance),</span><br><span class="line">            <span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">DefaultSafeHandle</span>(<span class="params"><span class="built_in">nint</span> invalidHandleValue, <span class="built_in">bool</span> ownsHandle</span>) : <span class="title">SafeHandle</span>(<span class="params">invalidHandleValue, ownsHandle</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">DefaultSafeHandle</span>(<span class="params"><span class="built_in">nint</span> handle</span>) : <span class="title">this</span>(<span class="params">handle, <span class="literal">true</span></span>)</span> =&gt; SetHandle(handle);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">override</span> <span class="built_in">bool</span> IsInvalid =&gt; handle != <span class="built_in">nint</span>.Zero;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">protected</span> <span class="keyword">override</span> <span class="built_in">bool</span> <span class="title">ReleaseHandle</span>()</span> =&gt; <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">DesktopWindow</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Create a new <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span> instance.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;launched&quot;&gt;</span>Do something after <span class="doctag">&lt;see cref=&quot;DesktopWindowXamlSource&quot;/&gt;</span> created.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>The new instance of <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span>.<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Task&lt;DesktopWindow&gt; <span class="title">CreateAsync</span>(<span class="params">Action&lt;DesktopWindowXamlSource&gt; launched</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        TaskCompletionSource&lt;DesktopWindow&gt; taskCompletionSource = <span class="keyword">new</span>();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">new</span> Thread(() =&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">            &#123;</span><br><span class="line">                DesktopWindowXamlSource source;</span><br><span class="line">                <span class="keyword">using</span> (HookWindowingModel hook = <span class="keyword">new</span>())</span><br><span class="line">                &#123;</span><br><span class="line">                    source = <span class="keyword">new</span> DesktopWindowXamlSource();</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                DesktopWindow window = <span class="keyword">new</span>() &#123; WindowXamlSource = source &#125;;</span><br><span class="line"></span><br><span class="line">                launched(source);</span><br><span class="line">                taskCompletionSource.SetResult(window);</span><br><span class="line"></span><br><span class="line">                MSG msg = <span class="keyword">new</span>();</span><br><span class="line">                <span class="keyword">while</span> (msg.message != PInvoke.WM_QUIT)</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">if</span> (PInvoke.PeekMessage(<span class="keyword">out</span> msg, <span class="keyword">new</span> HWND(), <span class="number">0</span>, <span class="number">0</span>, PEEK_MESSAGE_REMOVE_TYPE.PM_REMOVE))</span><br><span class="line">                    &#123;</span><br><span class="line">                        _ = PInvoke.DispatchMessage(msg);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">catch</span> (Exception e)</span><br><span class="line">            &#123;</span><br><span class="line">                taskCompletionSource.SetException(e);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;)</span><br><span class="line">        &#123;</span><br><span class="line">            Name = <span class="keyword">nameof</span>(DesktopWindowXamlSource)</span><br><span class="line">        &#125;.Start();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> taskCompletionSource.Task;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Windows.Win32.System.WinRT.Xaml</span></span><br><span class="line">&#123;</span><br><span class="line">    [<span class="meta">GeneratedComInterface</span>]</span><br><span class="line">    [<span class="meta">Guid(<span class="string">&quot;3CBCF1BF-2F76-4E9C-96AB-E84B37972554&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">internal</span> <span class="keyword">partial</span> <span class="keyword">interface</span> <span class="title">IDesktopWindowXamlSourceNative</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> Attaches the current **IDesktopWindowXamlSourceNative** instance to a parent UI element in your desktop app that is associated with a window handle.</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;parentWnd&quot;&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span>Type: **HWND** The window handle of the parent UI element in which you want to host a WinRT XAML control.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span><span class="doctag">&lt;see href=&quot;https://learn.microsoft.com/windows/win32/api/windows.ui.xaml.hosting.desktopwindowxamlsource/nf-windows-ui-xaml-hosting-desktopwindowxamlsource-idesktopwindowxamlsourcenative-attachtowindow#parameters&quot;&gt;</span>Read more on docs.microsoft.com<span class="doctag">&lt;/see&gt;</span>.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>If this method succeeds, it returns S_OK. Otherwise, it returns an **HRESULT** error code.<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span>For a code example that demonstrates how to use this method, see [XamlBridge.cpp](https://github.com/microsoft/Xaml-Islands-Samples/blob/master/Samples/Win32/SampleCppApp/XamlBridge.cpp) in the SampleCppApp sample in the XAML Island samples repo. &gt; [!IMPORTANT] &gt; Make sure that your code calls the **AttachToWindow** method only once per [DesktopWindowXamlSource](/uwp/api/windows.ui.xaml.hosting.desktopwindowxamlsource) object. Calling this method more than once for a **DesktopWindowXamlSource** object could result in a memory leak.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;para&gt;</span><span class="doctag">&lt;see href=&quot;https://learn.microsoft.com/windows/win32/api/windows.ui.xaml.hosting.desktopwindowxamlsource/nf-windows-ui-xaml-hosting-desktopwindowxamlsource-idesktopwindowxamlsourcenative-attachtowindow#&quot;&gt;</span>Read more on docs.microsoft.com<span class="doctag">&lt;/see&gt;</span>.<span class="doctag">&lt;/para&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">        [<span class="meta">PreserveSig</span>]</span><br><span class="line">        [<span class="meta">return: MarshalAs(UnmanagedType.Error)</span>]</span><br><span class="line">        <span class="function"><span class="built_in">int</span> <span class="title">AttachToWindow</span>(<span class="params"><span class="built_in">nint</span> parentWnd</span>)</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> Gets the window handle of the parent UI element that is associated with the current IDesktopWindowXamlSourceNative instance.</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>If this method succeeds, it returns S_OK. Otherwise, it returns an **HRESULT** error code.<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        [<span class="meta">PreserveSig</span>]</span><br><span class="line">        [<span class="meta">return: MarshalAs(UnmanagedType.Error)</span>]</span><br><span class="line">        <span class="function"><span class="built_in">int</span> <span class="title">get_WindowHandle</span>(<span class="params"><span class="keyword">out</span> <span class="built_in">nint</span> hWnd</span>)</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">file</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title">Extensions</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> Gets the window handle of the parent UI element that is associated with the current IDesktopWindowXamlSourceNative instance.</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> HWND <span class="title">WindowHandle</span>(<span class="params"><span class="keyword">this</span> IDesktopWindowXamlSourceNative source</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            _ = source.get_WindowHandle(<span class="keyword">out</span> <span class="built_in">nint</span> hWnd);</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> HWND(hWnd);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这样创建的窗口还存在一些问题，但是我不知道该怎么解决，所以该方法还是仅供参考。</p><p>最后附上示例应用：<a href="https://github.com/wherewhere/CoreAppUWP/tree/wuxc">https://github.com/wherewhere/CoreAppUWP/tree/wuxc</a></p><p>MUXC 篇：<a href="/2024/11/03/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E6%89%98%E7%AE%A1%E8%87%AA%E5%B7%B1-%E2%80%94%E2%80%94-Windows-App-SDK-%E7%AF%87">【UWP】让 UWP 自己托管自己 —— Windows App SDK 篇</a></p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/18446824">【UWP】让 UWP 自己托管自己 —— Windows SDK 篇</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2025年1月17日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2025/01/17/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E6%89%98%E7%AE%A1%E8%87%AA%E5%B7%B1-%E2%80%94%E2%80%94-Windows-SDK-%E7%AF%87/</id><link href="https://wherewhere.github.io/2025/01/17/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E6%89%98%E7%AE%A1%E8%87%AA%E5%B7%B1-%E2%80%94%E2%80%94-Windows-SDK-%E7%AF%87/"/><published>2025-01-17T08:06:00.000Z</published><summary><![CDATA[<p>众所周知，UWP 使用的窗口模型是 CoreWindow，但是 UWP 本身只是一个应用模型，所以完全可以创建 win32 窗口，那么我们可以不可以创建一个 win32 窗口，然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢？本篇将讲述如何在 UWP 创建一个 XAML 岛窗口。</p>
<p><img src="https://github.com/user-attachments/assets/ecffb39b-e268-4530-b2ca-d01bccad04a7" alt="示例" loading="lazy"></p>
<p>首先，XAML 岛会判断当前的应用模型是否为<code>ClassicDesktop</code>，所以我们需要利用<code>Detours</code>劫持<code>AppPolicyGetWindowingModel</code>方法。具体内容如下：]]></summary><title>【UWP】让 UWP 自己托管自己 —— Windows SDK 篇</title><updated>2025-01-30T07:52:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="WAS" scheme="https://wherewhere.github.io/tags/WAS/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><category term="XAML岛" scheme="https://wherewhere.github.io/tags/XAML%E5%B2%9B/"/><content><![CDATA[<p>众所周知，UWP 使用的窗口模型是 CoreWindow，但是 UWP 本身只是一个应用模型，所以完全可以创建 win32 窗口，那么我们可以不可以创建一个 win32 窗口，然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢？本篇将讲述如何利用 WAS (Windows App SDK，俗称 WinUI3) 在 UWP 创建一个 XAML 岛窗口。</p><p><img src="https://github.com/user-attachments/assets/a47b9647-37fe-4301-b27a-bc681aab4f93" alt="示例" loading="lazy"></p><p>演示视频：<a href="https://x.com/wherewhere7/status/1721570411388039587">https://x.com/wherewhere7/status/1721570411388039587</a></p><p>由于 WAS 在 win32 应用模型下本身就是个 XAML 岛，所以 WAS 对 XAML 岛的支持要比 WUXC (Windows.UI.Xaml.Controls) 要好多了，接下来的内容大多是将 WAS 中实现窗口的方法迁移到 C#。</p><p>首先，不管是 WUXC 还是 WAS 的 XAML 岛都会判断当前的应用模型是否为<code>ClassicDesktop</code>，所以我们需要利用Detours劫持<code>AppPolicyGetWindowingModel</code>方法。具体内容如下：<span id="more"></span></p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#r &quot;nuget:Detours.Win32Metadata&quot;</span></span><br><span class="line"><span class="meta">#r &quot;nuget:Microsoft.Windows.CsWin32&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Runtime.CompilerServices;</span><br><span class="line"><span class="keyword">using</span> System.Runtime.InteropServices;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32.Foundation;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32.Storage.Packaging.Appx;</span><br><span class="line"><span class="keyword">using</span> Detours = Microsoft.Detours.PInvoke;</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Represents a hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">HookWindowingModel</span> : <span class="title">IDisposable</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The value that indicates whether the class has been disposed.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">bool</span> disposed;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The reference count for the hook.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">int</span> refCount;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The value that represents the current process token.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">const</span> <span class="built_in">int</span> currentProcessToken = <span class="number">-6</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The original <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt; AppPolicyGetWindowingModel;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Initializes a new instance of the <span class="doctag">&lt;see cref=&quot;HookWindowingModel&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">HookWindowingModel</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        refCount++;</span><br><span class="line">        StartHook();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Finalizes this instance of the <span class="doctag">&lt;see cref=&quot;HookWindowingModel&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    ~HookWindowingModel()</span><br><span class="line">    &#123;</span><br><span class="line">        Dispose();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets the value that indicates whether the hook is active.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">bool</span> IsHooked &#123; <span class="keyword">get</span>; <span class="keyword">private</span> <span class="keyword">set</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets or sets the windowing model to use when the hooked <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function is called.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">internal</span> <span class="keyword">static</span> AppPolicyWindowingModel WindowingModel &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125; = AppPolicyWindowingModel.AppPolicyWindowingModel_ClassicDesktop;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Starts the hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="keyword">void</span> <span class="title">StartHook</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">using</span> FreeLibrarySafeHandle library = PInvoke.GetModuleHandle(<span class="string">&quot;KERNEL32.dll&quot;</span>);</span><br><span class="line">            <span class="keyword">if</span> (!library.IsInvalid &amp;&amp; NativeLibrary.TryGetExport(library.DangerousGetHandle(), <span class="keyword">nameof</span>(PInvoke.AppPolicyGetWindowingModel), <span class="keyword">out</span> <span class="built_in">nint</span> appPolicyGetWindowingModel))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">void</span>* appPolicyGetWindowingModelPtr = (<span class="keyword">void</span>*)appPolicyGetWindowingModel;</span><br><span class="line">                <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt; overrideAppPolicyGetWindowingModel = &amp;OverrideAppPolicyGetWindowingModel;</span><br><span class="line"></span><br><span class="line">                _ = Detours.DetourRestoreAfterWith();</span><br><span class="line"></span><br><span class="line">                _ = Detours.DetourTransactionBegin();</span><br><span class="line">                _ = Detours.DetourUpdateThread(PInvoke.GetCurrentThread());</span><br><span class="line">                _ = Detours.DetourAttach(<span class="keyword">ref</span> appPolicyGetWindowingModelPtr, overrideAppPolicyGetWindowingModel);</span><br><span class="line">                _ = Detours.DetourTransactionCommit();</span><br><span class="line"></span><br><span class="line">                AppPolicyGetWindowingModel = (<span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt;)appPolicyGetWindowingModelPtr;</span><br><span class="line">                IsHooked = <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Ends the hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="keyword">void</span> <span class="title">EndHook</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (--refCount == <span class="number">0</span> &amp;&amp; IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">void</span>* appPolicyGetWindowingModelPtr = AppPolicyGetWindowingModel;</span><br><span class="line">            <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HANDLE, AppPolicyWindowingModel*, WIN32_ERROR&gt; overrideAppPolicyGetWindowingModel = &amp;OverrideAppPolicyGetWindowingModel;</span><br><span class="line"></span><br><span class="line">            _ = Detours.DetourTransactionBegin();</span><br><span class="line">            _ = Detours.DetourUpdateThread(PInvoke.GetCurrentThread());</span><br><span class="line">            _ = Detours.DetourDetach(&amp;appPolicyGetWindowingModelPtr, overrideAppPolicyGetWindowingModel);</span><br><span class="line">            _ = Detours.DetourTransactionCommit();</span><br><span class="line"></span><br><span class="line">            AppPolicyGetWindowingModel = <span class="literal">null</span>;</span><br><span class="line">            IsHooked = <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;policy&quot;&gt;</span>A pointer to a variable of the <span class="doctag">&lt;a href=&quot;https://docs.microsoft.com/windows/win32/api/appmodel/ne-appmodel-apppolicywindowingmodel&quot;&gt;</span>AppPolicyWindowingModel<span class="doctag">&lt;/a&gt;</span> enumerated type.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> When the function returns successfully, the variable contains the <span class="doctag">&lt;see cref=&quot;WindowingModel&quot;/&gt;</span> when the identified process is current; otherwise, the windowing model of the identified process.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The overridden <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span></span></span><br><span class="line">    [<span class="meta">UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)</span>])]</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> WIN32_ERROR <span class="title">OverrideAppPolicyGetWindowingModel</span>(<span class="params">HANDLE processToken, AppPolicyWindowingModel* policy</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> ((<span class="built_in">int</span>)processToken.Value == currentProcessToken)</span><br><span class="line">        &#123;</span><br><span class="line">            *policy = WindowingModel;</span><br><span class="line">            <span class="keyword">return</span> WIN32_ERROR.ERROR_SUCCESS;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> AppPolicyGetWindowingModel(processToken, policy);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Dispose</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!disposed &amp;&amp; IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            EndHook();</span><br><span class="line">        &#125;</span><br><span class="line">        GC.SuppressFinalize(<span class="keyword">this</span>);</span><br><span class="line">        disposed = <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>准备工作完成，接下来我们就可以创建窗口了，如果顺利的话我们只需要<code>new Microsoft.UI.Xaml.Window()</code>就行了，但是很遗憾，经过测试在 UWP 并不能正常初始化这个类，有可能是我使用的方法不太正确，或许以后可能能找到正常使用的办法，不过现在我们只能去手动创建一个 Win32 窗口了。</p><p>首先我们需要新创建一个线程，CoreWindow 线程无法新建 XAML 岛，不过在 XAML 岛线程可以，新建线程只需要用<code>Thread</code>就行了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> Thread(() =&gt; &#123; ... &#125;);</span><br></pre></td></tr></table></figure><p>WAS 提供了<code>AppWindow</code>来管理 win32 窗口，我们只需要使用它创建一个窗口就行了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AppWindow window = AppWindow.Create();</span><br></pre></td></tr></table></figure><p>接下来我们需要创建 XAML 岛，这时我们就需要利用上面劫持器来劫持获取应用模型的方法了</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">DispatcherQueueController controller;</span><br><span class="line">DesktopWindowXamlSource source;</span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> (HookWindowingModel hook = <span class="keyword">new</span>())</span><br><span class="line">&#123;</span><br><span class="line">    controller = DispatcherQueueController.CreateOnCurrentThread();</span><br><span class="line">    source = <span class="keyword">new</span> DesktopWindowXamlSource();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们就可以把 XAML 岛糊到之前创建的 AppWindow 上了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">source.Initialize(window.Id);</span><br><span class="line">DesktopChildSiteBridge bridge = source.SiteBridge;</span><br><span class="line">bridge.ResizePolicy = ContentSizePolicy.ResizeContentToParentWindow;</span><br><span class="line">bridge.Show();</span><br><span class="line"></span><br><span class="line">DispatcherQueue dispatcherQueue = controller.DispatcherQueue;</span><br><span class="line">window.AssociateWithDispatcherQueue(dispatcherQueue);</span><br></pre></td></tr></table></figure><p>由于 XAML 岛存在的一些特性，当窗口扩展标题栏或者全屏化的时候窗口内容并不会跟着变化，所以我们需要一些小魔法来让它在变化时调整大小。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">window.Changed += (sender, <span class="keyword">args</span>) =&gt;</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">args</span>.DidPresenterChange)</span><br><span class="line">    &#123;</span><br><span class="line">        bridge.ResizePolicy = ContentSizePolicy.None;</span><br><span class="line">        bridge.ResizePolicy = ContentSizePolicy.ResizeContentToParentWindow;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>最后不要忘了保持当前线程，不然这里跑完了窗口就退出了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dispatcherQueue.RunEventLoop();</span><br><span class="line"><span class="keyword">await</span> controller.ShutdownQueueAsync();</span><br></pre></td></tr></table></figure><p>当窗口关闭后记得执行<code>DispatcherQueue.EnqueueEventLoopExit()</code>来释放保持的线程。</p><p>最后把之前的东西组合起来，再加点东西：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Create a new <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span> instance.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;launched&quot;&gt;</span>Do something after <span class="doctag">&lt;see cref=&quot;DesktopWindowXamlSource&quot;/&gt;</span> created.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>The new instance of <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span>.<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Task&lt;DesktopWindow&gt; <span class="title">CreateAsync</span>(<span class="params">Action&lt;DesktopWindowXamlSource&gt; launched</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    TaskCompletionSource&lt;DesktopWindow&gt; taskCompletionSource = <span class="keyword">new</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">new</span> Thread(<span class="keyword">async</span> () =&gt;</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">try</span></span><br><span class="line">        &#123;</span><br><span class="line">            DispatcherQueueController controller;</span><br><span class="line">            DesktopWindowXamlSource source;</span><br><span class="line">            AppWindow window = AppWindow.Create();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">using</span> (HookWindowingModel hook = <span class="keyword">new</span>())</span><br><span class="line">            &#123;</span><br><span class="line">                controller = DispatcherQueueController.CreateOnCurrentThread();</span><br><span class="line">                source = <span class="keyword">new</span> DesktopWindowXamlSource();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            source.Initialize(window.Id);</span><br><span class="line">            DesktopChildSiteBridge bridge = source.SiteBridge;</span><br><span class="line">            bridge.ResizePolicy = ContentSizePolicy.ResizeContentToParentWindow;</span><br><span class="line">            bridge.Show();</span><br><span class="line"></span><br><span class="line">            window.Changed += (sender, <span class="keyword">args</span>) =&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="keyword">args</span>.DidPresenterChange)</span><br><span class="line">                &#123;</span><br><span class="line">                    bridge.ResizePolicy = ContentSizePolicy.None;</span><br><span class="line">                    bridge.ResizePolicy = ContentSizePolicy.ResizeContentToParentWindow;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;;</span><br><span class="line"></span><br><span class="line">            DispatcherQueue dispatcherQueue = controller.DispatcherQueue;</span><br><span class="line">            window.AssociateWithDispatcherQueue(dispatcherQueue);</span><br><span class="line">            TrackWindow(window);</span><br><span class="line"></span><br><span class="line">            launched(source);</span><br><span class="line">            DesktopWindow desktopWindow = <span class="keyword">new</span>()</span><br><span class="line">            &#123;</span><br><span class="line">                AppWindow = window,</span><br><span class="line">                WindowXamlSource = source</span><br><span class="line">            &#125;;</span><br><span class="line">            taskCompletionSource.SetResult(desktopWindow);</span><br><span class="line"></span><br><span class="line">            dispatcherQueue.RunEventLoop();</span><br><span class="line">            <span class="keyword">await</span> controller.ShutdownQueueAsync();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">catch</span> (Exception e)</span><br><span class="line">        &#123;</span><br><span class="line">            taskCompletionSource.SetException(e);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">    &#123;</span><br><span class="line">        Name = <span class="keyword">nameof</span>(DesktopWindowXamlSource)</span><br><span class="line">    &#125;.Start();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> taskCompletionSource.Task;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Create a new <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span> instance.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dispatcherQueue&quot;&gt;</span>The <span class="doctag">&lt;see cref=&quot;DispatcherQueue&quot;/&gt;</span> to provide thread.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;launched&quot;&gt;</span>Do something after <span class="doctag">&lt;see cref=&quot;DesktopWindowXamlSource&quot;/&gt;</span> created.<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>The new instance of <span class="doctag">&lt;see cref=&quot;DesktopWindow&quot;/&gt;</span>.<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Task&lt;DesktopWindow&gt; <span class="title">CreateAsync</span>(<span class="params">DispatcherQueue dispatcherQueue, Action&lt;DesktopWindowXamlSource&gt; launched</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    TaskCompletionSource&lt;DesktopWindow&gt; taskCompletionSource = <span class="keyword">new</span>();</span><br><span class="line"></span><br><span class="line">    _ = dispatcherQueue.TryEnqueue(() =&gt;</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">try</span></span><br><span class="line">        &#123;</span><br><span class="line">            DesktopWindowXamlSource source;</span><br><span class="line">            AppWindow window = AppWindow.Create();</span><br><span class="line">            window.AssociateWithDispatcherQueue(dispatcherQueue);</span><br><span class="line">            TrackWindow(window);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">using</span> (HookWindowingModel hook = <span class="keyword">new</span>())</span><br><span class="line">            &#123;</span><br><span class="line">                source = <span class="keyword">new</span> DesktopWindowXamlSource();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            source.Initialize(window.Id);</span><br><span class="line">            DesktopChildSiteBridge bridge = source.SiteBridge;</span><br><span class="line">            bridge.ResizePolicy = ContentSizePolicy.ResizeContentToParentWindow;</span><br><span class="line">            bridge.Show();</span><br><span class="line"></span><br><span class="line">            window.Changed += (sender, <span class="keyword">args</span>) =&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="keyword">args</span>.DidPresenterChange)</span><br><span class="line">                &#123;</span><br><span class="line">                    bridge.ResizePolicy = ContentSizePolicy.None;</span><br><span class="line">                    bridge.ResizePolicy = ContentSizePolicy.ResizeContentToParentWindow;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;;</span><br><span class="line"></span><br><span class="line">            launched(source);</span><br><span class="line">            DesktopWindow desktopWindow = <span class="keyword">new</span>()</span><br><span class="line">            &#123;</span><br><span class="line">                AppWindow = window,</span><br><span class="line">                WindowXamlSource = source</span><br><span class="line">            &#125;;</span><br><span class="line">            taskCompletionSource.SetResult(desktopWindow);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">catch</span> (Exception e)</span><br><span class="line">        &#123;</span><br><span class="line">            taskCompletionSource.SetException(e);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> taskCompletionSource.Task;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">TrackWindow</span>(<span class="params">AppWindow window</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (ActiveDesktopWindows.ContainsKey(window.DispatcherQueue))</span><br><span class="line">    &#123;</span><br><span class="line">        ActiveDesktopWindows[window.DispatcherQueue] += <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        ActiveDesktopWindows[window.DispatcherQueue] = <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    window.Destroying -= AppWindow_Destroying;</span><br><span class="line">    window.Destroying += AppWindow_Destroying;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">AppWindow_Destroying</span>(<span class="params">AppWindow sender, <span class="built_in">object</span> <span class="keyword">args</span></span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (ActiveDesktopWindows.TryGetValue(sender.DispatcherQueue, <span class="keyword">out</span> <span class="built_in">ulong</span> num))</span><br><span class="line">    &#123;</span><br><span class="line">        num--;</span><br><span class="line">        <span class="keyword">if</span> (num == <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            ActiveDesktopWindows.Remove(sender.DispatcherQueue);</span><br><span class="line">            sender.DispatcherQueue.EnqueueEventLoopExit();</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        ActiveDesktopWindows[sender.DispatcherQueue] = num;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> Dictionary&lt;DispatcherQueue, <span class="built_in">ulong</span>&gt; ActiveDesktopWindows &#123; <span class="keyword">get</span>; &#125; = [];</span><br></pre></td></tr></table></figure><p>其中<code>DesktopWindow</code>是用来存放<code>AppWindow</code>和<code>DesktopWindowXamlSource</code>的类，如果不嫌麻烦的话可以包裹成一个和<code>Microsoft.UI.Xaml.Window</code>一样的东西。</p><p>最后附上示例应用：<a href="https://github.com/wherewhere/CoreAppUWP/tree/muxc">https://github.com/wherewhere/CoreAppUWP/tree/muxc</a></p><p>WUXC 篇：<a href="/2025/01/17/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E6%89%98%E7%AE%A1%E8%87%AA%E5%B7%B1-%E2%80%94%E2%80%94-Windows-SDK-%E7%AF%87">【UWP】让 UWP 自己托管自己 —— Windows SDK 篇</a></p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/18446822">【UWP】让 UWP 自己托管自己 —— Windows App SDK 篇</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2024年11月3日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2024/11/03/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E6%89%98%E7%AE%A1%E8%87%AA%E5%B7%B1-%E2%80%94%E2%80%94-Windows-App-SDK-%E7%AF%87/</id><link href="https://wherewhere.github.io/2024/11/03/%E3%80%90UWP%E3%80%91%E8%AE%A9-UWP-%E8%87%AA%E5%B7%B1%E6%89%98%E7%AE%A1%E8%87%AA%E5%B7%B1-%E2%80%94%E2%80%94-Windows-App-SDK-%E7%AF%87/"/><published>2024-11-03T08:10:00.000Z</published><summary><![CDATA[<p>众所周知，UWP 使用的窗口模型是 CoreWindow，但是 UWP 本身只是一个应用模型，所以完全可以创建 win32 窗口，那么我们可以不可以创建一个 win32 窗口，然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢？本篇将讲述如何利用 WAS (Windows App SDK，俗称 WinUI3) 在 UWP 创建一个 XAML 岛窗口。</p>
<p><img src="https://github.com/user-attachments/assets/a47b9647-37fe-4301-b27a-bc681aab4f93" alt="示例" loading="lazy"></p>
<p>演示视频：<a href="https://x.com/wherewhere7/status/1721570411388039587">https://x.com/wherewhere7/status/1721570411388039587</a></p>
<p>由于 WAS 在 win32 应用模型下本身就是个 XAML 岛，所以 WAS 对 XAML 岛的支持要比 WUXC (Windows.UI.Xaml.Controls) 要好多了，接下来的内容大多是将 WAS 中实现窗口的方法迁移到 C#。</p>
<p>首先，不管是 WUXC 还是 WAS 的 XAML 岛都会判断当前的应用模型是否为<code>ClassicDesktop</code>，所以我们需要利用Detours劫持<code>AppPolicyGetWindowingModel</code>方法。具体内容如下：]]></summary><title>【UWP】让 UWP 自己托管自己 —— Windows App SDK 篇</title><updated>2025-01-17T08:08:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="WAS" scheme="https://wherewhere.github.io/tags/WAS/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><content><![CDATA[<p>众所周知，WAS (Windows App SDK，俗称 WinUI3)在刚开始是支持 UWP 的，甚至最早<a href="https://blogs.windows.com/windowsdeveloper/2020/05/19/introducing-winui-3-preview-1" title="Introducing WinUI 3 Preview 1">只支持 UWP</a>，但是微软在正式版发布前删除了对 UWP 的支持，不过真的删除了吗？<a href="https://x.com/driver1998" title="@driver1998">初生之鸟</a>在<a href="https://x.com/driver1998/status/1716388306144137260">2023年10月发现</a>在 VS 调试下无视报错继续运行可以正常在 UWP 加载 WAS。随着 WAS 的开源，WAS 阻止在 UWP 上运行的原因也被找到，至此大家终于找到在 UWP 上使用 WAS 的方法了。</p><p>WAS 阻止在 UWP 上运行的方法很简单，就是检查注册表<code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WinUI\Xaml\EnableUWPWindow</code>是否为<code>00000001</code>，如果不是就直接报错。</p><details open><summary><a href="https://github.com/microsoft/microsoft-ui-xaml/blob/main/src/dxaml/xcp/dxaml/lib/Window_Partial.cpp#L80-L114" target="_blank" rel="noopener nofollow">Window_Partial.cpp#L80-L114</a></summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ----------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">//                               IWindow</span></span><br><span class="line"><span class="comment">// ----------------------------------------------------------------------</span></span><br><span class="line">Window::<span class="built_in">Window</span>()</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// The first window created internally by DXamlCore _must_ be a UWP Window.  DXamlCore</span></span><br><span class="line">    <span class="comment">// requires and controls the lifetime of a hidden UWP Microsoft.UI.Xaml.Window.</span></span><br><span class="line">    <span class="comment">// note that this Window instance will be the &#x27;real&#x27; window for UWP instances, but</span></span><br><span class="line">    <span class="comment">// serves as a dummy for all other instances. dummy behavior is deprecated and being removed.</span></span><br><span class="line">    <span class="keyword">auto</span> dxamlCore = DXamlCore::<span class="built_in">GetCurrent</span>();</span><br><span class="line">    Window* window = dxamlCore-&gt;<span class="built_in">GetDummyWindowNoRef</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!window)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// Do a runtime check to see if UWP should be enabled</span></span><br><span class="line">        <span class="type">static</span> <span class="keyword">auto</span> runtimeEnabledFeatureDetector = RuntimeFeatureBehavior::<span class="built_in">GetRuntimeEnabledFeatureDetector</span>();</span><br><span class="line">        <span class="keyword">auto</span> UWPWindowEnabled = runtimeEnabledFeatureDetector-&gt;<span class="built_in">IsFeatureEnabled</span>(RuntimeEnabledFeature::EnableUWPWindow);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// WinUI UWP</span></span><br><span class="line">        <span class="keyword">if</span> (!UWPWindowEnabled &amp;&amp; DXamlCore::<span class="built_in">GetCurrent</span>()-&gt;<span class="built_in">GetHandle</span>()-&gt;<span class="built_in">GetInitializationType</span>() != InitializationType::IslandsOnly)</span><br><span class="line">        &#123;</span><br><span class="line">            ::<span class="built_in">RoOriginateError</span>(</span><br><span class="line">                E_NOT_SUPPORTED,</span><br><span class="line">                wrl_wrappers::<span class="built_in">HStringReference</span>(</span><br><span class="line">                <span class="string">L&quot;WinUI: Error creating an UWP Window. Creating an UWP window is not allowed.&quot;</span></span><br><span class="line">                ).<span class="built_in">Get</span>());</span><br><span class="line">            <span class="built_in">XAML_FAIL_FAST</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        m_spWindowImpl = std::<span class="built_in">make_shared</span>&lt;UWPWindowImpl&gt;(<span class="keyword">this</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        m_spWindowImpl = std::<span class="built_in">make_shared</span>&lt;DesktopWindowImpl&gt;(<span class="keyword">this</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></details><span id="more"></span><details open><summary><a href="https://github.com/microsoft/microsoft-ui-xaml/blob/main/src/dxaml/xcp/components/runtimeEnabledFeatures/RuntimeFeatureData.cpp#L67" target="_blank" rel="noopener nofollow">RuntimeFeatureData.cpp#L67</a></summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123; <span class="string">L&quot;EnableUWPWindow&quot;</span>, RuntimeEnabledFeature::EnableUWPWindow, <span class="literal">false</span>, <span class="number">0</span>, <span class="number">0</span> &#125;</span><br></pre></td></tr></table></figure></details><p>所以我们只需要修改注册表就行了。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Windows Registry Editor Version 5.00</span><br><span class="line"></span><br><span class="line"><span class="section">[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WinUI\Xaml]</span></span><br><span class="line"><span class="attr">&quot;EnableUWPWindow&quot;</span>=dword:<span class="number">00000001</span></span><br></pre></td></tr></table></figure><p>但是到处修改注册表并不是一个好主意，于是<a href="https://github.com/driver1998" title="@driver1998">初生之鸟</a>便提出利用<code>Detours</code>来劫持读取注册表的方法：<a href="https://github.com/driver1998/HookCoreAppWinUI" title="HookCoreAppWinUI">HookCoreAppWinUI</a>。</p><p>我们将其翻译成 C#，再加一些小修改，便能得出如下内容：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#r &quot;nuget:Detours.Win32Metadata&quot;</span></span><br><span class="line"><span class="meta">#r &quot;nuget:Microsoft.Windows.CsWin32&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"><span class="keyword">using</span> System.Runtime.CompilerServices;</span><br><span class="line"><span class="keyword">using</span> System.Runtime.InteropServices;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32.Foundation;</span><br><span class="line"><span class="keyword">using</span> Windows.Win32.System.Registry;</span><br><span class="line"><span class="keyword">using</span> Detours = Microsoft.Detours.PInvoke;</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Represents a hook for getting the value of the <span class="doctag">&lt;c&gt;</span>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WinUI\Xaml\EnableUWPWindow<span class="doctag">&lt;/c&gt;</span> registry key always returning <span class="doctag">&lt;see langword=&quot;00000001&quot;/&gt;</span>.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">HookRegistry</span> : <span class="title">IDisposable</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The value that indicates whether the class has been disposed.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">bool</span> disposed;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The reference count for the hook.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">int</span> refCount;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The dictionary that maps the <span class="doctag">&lt;see cref=&quot;HKEY&quot;/&gt;</span> to a value that indicates whether the key is a real key.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">readonly</span> Dictionary&lt;HKEY, <span class="built_in">bool</span>&gt; xamlKeyMap = [];</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> The object used to synchronize access to the <span class="doctag">&lt;see cref=&quot;xamlKeyMap&quot;/&gt;</span> dictionary.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">readonly</span> <span class="built_in">object</span> locker = <span class="keyword">new</span>();</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The original <span class="doctag">&lt;see cref=&quot;PInvoke.RegOpenKeyEx(HKEY, PCWSTR, uint, REG_SAM_FLAGS, HKEY*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.RegOpenKeyEx(HKEY, PCWSTR, uint, REG_SAM_FLAGS, HKEY*)&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>, REG_SAM_FLAGS, HKEY*, WIN32_ERROR&gt; RegOpenKeyExW;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The original <span class="doctag">&lt;see cref=&quot;PInvoke.RegCloseKey(HKEY)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.RegCloseKey(HKEY)&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, WIN32_ERROR&gt; RegCloseKey;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The original <span class="doctag">&lt;see cref=&quot;PInvoke.RegQueryValueEx(HKEY, PCWSTR, uint*, REG_VALUE_TYPE*, byte*, uint*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.RegQueryValueEx(HKEY, PCWSTR, uint*, REG_VALUE_TYPE*, byte*, uint*)&quot;/&gt;</span></span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>*, REG_VALUE_TYPE*, <span class="built_in">byte</span>*, <span class="built_in">uint</span>*, WIN32_ERROR&gt; RegQueryValueExW;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Initializes a new instance of the <span class="doctag">&lt;see cref=&quot;HookRegistry&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">HookRegistry</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        refCount++;</span><br><span class="line">        StartHook();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Finalizes this instance of the <span class="doctag">&lt;see cref=&quot;HookRegistry&quot;/&gt;</span> class.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    ~HookRegistry()</span><br><span class="line">    &#123;</span><br><span class="line">        Dispose();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Gets the value that indicates whether the hook is active.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">bool</span> IsHooked &#123; <span class="keyword">get</span>; <span class="keyword">private</span> <span class="keyword">set</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Starts the hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="keyword">void</span> <span class="title">StartHook</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">using</span> FreeLibrarySafeHandle library = PInvoke.GetModuleHandle(<span class="string">&quot;ADVAPI32.dll&quot;</span>);</span><br><span class="line">            <span class="keyword">if</span> (!library.IsInvalid</span><br><span class="line">                &amp;&amp; NativeLibrary.TryGetExport(library.DangerousGetHandle(), <span class="string">&quot;RegOpenKeyExW&quot;</span>, <span class="keyword">out</span> <span class="built_in">nint</span> regOpenKeyExW)</span><br><span class="line">                &amp;&amp; NativeLibrary.TryGetExport(library.DangerousGetHandle(), <span class="keyword">nameof</span>(PInvoke.RegCloseKey), <span class="keyword">out</span> <span class="built_in">nint</span> regCloseKey)</span><br><span class="line">                &amp;&amp; NativeLibrary.TryGetExport(library.DangerousGetHandle(), <span class="string">&quot;RegQueryValueExW&quot;</span>, <span class="keyword">out</span> <span class="built_in">nint</span> regQueryValueExW))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">void</span>* regOpenKeyExWPtr = (<span class="keyword">void</span>*)regOpenKeyExW;</span><br><span class="line">                <span class="keyword">void</span>* regCloseKeyPtr = (<span class="keyword">void</span>*)regCloseKey;</span><br><span class="line">                <span class="keyword">void</span>* regQueryValueExWPtr = (<span class="keyword">void</span>*)regQueryValueExW;</span><br><span class="line"></span><br><span class="line">                <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>, REG_SAM_FLAGS, HKEY*, WIN32_ERROR&gt; overrideRegOpenKeyExW = &amp;OverrideRegOpenKeyExW;</span><br><span class="line">                <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, WIN32_ERROR&gt; overrideRegCloseKey = &amp;OverrideRegCloseKey;</span><br><span class="line">                <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>*, REG_VALUE_TYPE*, <span class="built_in">byte</span>*, <span class="built_in">uint</span>*, WIN32_ERROR&gt; overrideRegQueryValueExW = &amp;OverrideRegQueryValueExW;</span><br><span class="line"></span><br><span class="line">                _ = Detours.DetourRestoreAfterWith();</span><br><span class="line"></span><br><span class="line">                _ = Detours.DetourTransactionBegin();</span><br><span class="line">                _ = Detours.DetourUpdateThread(PInvoke.GetCurrentThread());</span><br><span class="line">                _ = Detours.DetourAttach(<span class="keyword">ref</span> regOpenKeyExWPtr, overrideRegOpenKeyExW);</span><br><span class="line">                _ = Detours.DetourAttach(<span class="keyword">ref</span> regCloseKeyPtr, overrideRegCloseKey);</span><br><span class="line">                _ = Detours.DetourAttach(<span class="keyword">ref</span> regQueryValueExWPtr, overrideRegQueryValueExW);</span><br><span class="line">                _ = Detours.DetourTransactionCommit();</span><br><span class="line"></span><br><span class="line">                RegOpenKeyExW = (<span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>, REG_SAM_FLAGS, HKEY*, WIN32_ERROR&gt;)regOpenKeyExWPtr;</span><br><span class="line">                RegCloseKey = (<span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, WIN32_ERROR&gt;)regCloseKeyPtr;</span><br><span class="line">                RegQueryValueExW = (<span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>*, REG_VALUE_TYPE*, <span class="built_in">byte</span>*, <span class="built_in">uint</span>*, WIN32_ERROR&gt;)regQueryValueExWPtr;</span><br><span class="line"></span><br><span class="line">                IsHooked = <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> Ends the hook for the <span class="doctag">&lt;see cref=&quot;PInvoke.AppPolicyGetWindowingModel(HANDLE, AppPolicyWindowingModel*)&quot;/&gt;</span> function.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> <span class="keyword">void</span> <span class="title">EndHook</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (--refCount == <span class="number">0</span> &amp;&amp; IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">void</span>* regOpenKeyExWPtr = RegOpenKeyExW;</span><br><span class="line">            <span class="keyword">void</span>* regCloseKeyPtr = RegCloseKey;</span><br><span class="line">            <span class="keyword">void</span>* regQueryValueExWPtr = RegQueryValueExW;</span><br><span class="line"></span><br><span class="line">            <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>, REG_SAM_FLAGS, HKEY*, WIN32_ERROR&gt; overrideRegOpenKeyExW = &amp;OverrideRegOpenKeyExW;</span><br><span class="line">            <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, WIN32_ERROR&gt; overrideRegCloseKey = &amp;OverrideRegCloseKey;</span><br><span class="line">            <span class="built_in">delegate</span>* <span class="keyword">unmanaged</span>[Stdcall]&lt;HKEY, PCWSTR, <span class="built_in">uint</span>*, REG_VALUE_TYPE*, <span class="built_in">byte</span>*, <span class="built_in">uint</span>*, WIN32_ERROR&gt; overrideRegQueryValueExW = &amp;OverrideRegQueryValueExW;</span><br><span class="line"></span><br><span class="line">            _ = Detours.DetourTransactionBegin();</span><br><span class="line">            _ = Detours.DetourUpdateThread(PInvoke.GetCurrentThread());</span><br><span class="line">            _ = Detours.DetourDetach(&amp;regOpenKeyExWPtr, overrideRegOpenKeyExW);</span><br><span class="line">            _ = Detours.DetourDetach(&amp;regCloseKeyPtr, overrideRegCloseKey);</span><br><span class="line">            _ = Detours.DetourDetach(&amp;regQueryValueExWPtr, overrideRegQueryValueExW);</span><br><span class="line">            _ = Detours.DetourTransactionCommit();</span><br><span class="line"></span><br><span class="line">            RegOpenKeyExW = <span class="literal">null</span>;</span><br><span class="line">            RegCloseKey = <span class="literal">null</span>;</span><br><span class="line">            RegQueryValueExW = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">            IsHooked = <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The overridden <span class="doctag">&lt;see cref=&quot;PInvoke.RegOpenKeyEx(HKEY, PCWSTR, uint, REG_SAM_FLAGS, HKEY*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.RegOpenKeyEx(HKEY, PCWSTR, uint, REG_SAM_FLAGS, HKEY*)&quot;/&gt;</span></span></span><br><span class="line">    [<span class="meta">UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)</span>])]</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> WIN32_ERROR <span class="title">OverrideRegOpenKeyExW</span>(<span class="params">HKEY hKey, PCWSTR lpSubKey, <span class="built_in">uint</span> ulOptions, REG_SAM_FLAGS samDesired, HKEY* phkResult</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        WIN32_ERROR result = RegOpenKeyExW(hKey, lpSubKey, ulOptions, samDesired, phkResult);</span><br><span class="line">        <span class="keyword">if</span> (hKey == HKEY.HKEY_LOCAL_MACHINE &amp;&amp; lpSubKey.ToString().Equals(<span class="string">@&quot;Software\Microsoft\WinUI\Xaml&quot;</span>, StringComparison.OrdinalIgnoreCase))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (result == WIN32_ERROR.ERROR_FILE_NOT_FOUND)</span><br><span class="line">            &#123;</span><br><span class="line">                HKEY key = <span class="keyword">new</span>(HANDLE.INVALID_HANDLE_VALUE);</span><br><span class="line">                xamlKeyMap[key] = <span class="literal">false</span>;</span><br><span class="line">                *phkResult = key;</span><br><span class="line">                result = WIN32_ERROR.ERROR_SUCCESS;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (result == WIN32_ERROR.ERROR_SUCCESS)</span><br><span class="line">            &#123;</span><br><span class="line">                xamlKeyMap[*phkResult] = <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The overridden <span class="doctag">&lt;see cref=&quot;PInvoke.RegCloseKey(HKEY)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.RegCloseKey(HKEY)&quot;/&gt;</span></span></span><br><span class="line">    [<span class="meta">UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)</span>])]</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> WIN32_ERROR <span class="title">OverrideRegCloseKey</span>(<span class="params">HKEY hKey</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">bool</span> isXamlKey;</span><br><span class="line">        <span class="keyword">lock</span> (locker)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (isXamlKey = xamlKeyMap.TryGetValue(hKey, <span class="keyword">out</span> <span class="built_in">bool</span> isRealKey))</span><br><span class="line">            &#123;</span><br><span class="line">                xamlKeyMap.Remove(hKey);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> isXamlKey</span><br><span class="line">                ? isRealKey</span><br><span class="line">                    ? RegCloseKey(hKey) <span class="comment">// real key</span></span><br><span class="line">                    : WIN32_ERROR.ERROR_SUCCESS <span class="comment">// simulated key</span></span><br><span class="line">                : hKey == HANDLE.INVALID_HANDLE_VALUE</span><br><span class="line">                    ? WIN32_ERROR.ERROR_INVALID_HANDLE</span><br><span class="line">                    : RegCloseKey(hKey);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;remarks&gt;</span>The overridden <span class="doctag">&lt;see cref=&quot;PInvoke.RegQueryValueEx(HKEY, PCWSTR, uint*, REG_VALUE_TYPE*, byte*, uint*)&quot;/&gt;</span> function.<span class="doctag">&lt;/remarks&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc cref=&quot;PInvoke.RegQueryValueEx(HKEY, PCWSTR, uint*, REG_VALUE_TYPE*, byte*, uint*)&quot;/&gt;</span></span></span><br><span class="line">    [<span class="meta">UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)</span>])]</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">unsafe</span> WIN32_ERROR <span class="title">OverrideRegQueryValueExW</span>(<span class="params">HKEY hKey, PCWSTR lpValueName, [Optional] <span class="built_in">uint</span>* lpReserved, [Optional] REG_VALUE_TYPE* lpType, [Optional] <span class="built_in">byte</span>* lpData, [Optional] <span class="built_in">uint</span>* lpcbData</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (lpValueName.Value != <span class="literal">default</span> &amp;&amp; lpValueName.ToString().Equals(<span class="string">&quot;EnableUWPWindow&quot;</span>, StringComparison.OrdinalIgnoreCase))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">lock</span> (locker)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (xamlKeyMap.TryGetValue(hKey, <span class="keyword">out</span> <span class="built_in">bool</span> isRealKey))</span><br><span class="line">                &#123;</span><br><span class="line">                    WIN32_ERROR result;</span><br><span class="line">                    <span class="keyword">if</span> (isRealKey)</span><br><span class="line">                    &#123;</span><br><span class="line">                        <span class="comment">// real key</span></span><br><span class="line">                        result = RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);</span><br><span class="line">                        <span class="keyword">if</span> (result == WIN32_ERROR.ERROR_SUCCESS &amp;&amp; lpData != <span class="literal">default</span>)</span><br><span class="line">                        &#123;</span><br><span class="line">                            *lpData = <span class="number">1</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                        <span class="keyword">else</span> <span class="keyword">if</span> (result == WIN32_ERROR.ERROR_FILE_NOT_FOUND)</span><br><span class="line">                        &#123;</span><br><span class="line">                            <span class="keyword">if</span> (lpData == <span class="literal">default</span> &amp;&amp; lpcbData != <span class="literal">default</span>)</span><br><span class="line">                            &#123;</span><br><span class="line">                                *lpcbData = <span class="keyword">sizeof</span>(<span class="built_in">int</span>);</span><br><span class="line">                                result = WIN32_ERROR.ERROR_SUCCESS;</span><br><span class="line">                            &#125;</span><br><span class="line">                            <span class="keyword">else</span> <span class="keyword">if</span> (lpData != <span class="literal">default</span> &amp;&amp; lpcbData != <span class="literal">default</span>)</span><br><span class="line">                            &#123;</span><br><span class="line">                                <span class="keyword">if</span> (*lpcbData &gt;= <span class="keyword">sizeof</span>(<span class="built_in">int</span>))</span><br><span class="line">                                &#123;</span><br><span class="line">                                    *lpData = <span class="number">1</span>;</span><br><span class="line">                                    result = WIN32_ERROR.ERROR_SUCCESS;</span><br><span class="line">                                &#125;</span><br><span class="line">                                <span class="keyword">else</span></span><br><span class="line">                                &#123;</span><br><span class="line">                                    result = WIN32_ERROR.ERROR_MORE_DATA;</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">else</span></span><br><span class="line">                    &#123;</span><br><span class="line">                        <span class="comment">// simulated key</span></span><br><span class="line">                        result = WIN32_ERROR.ERROR_FILE_NOT_FOUND;</span><br><span class="line">                        <span class="keyword">if</span> (lpData == <span class="literal">default</span> &amp;&amp; lpcbData != <span class="literal">default</span>)</span><br><span class="line">                        &#123;</span><br><span class="line">                            *lpcbData = <span class="keyword">sizeof</span>(<span class="built_in">int</span>);</span><br><span class="line">                            result = WIN32_ERROR.ERROR_SUCCESS;</span><br><span class="line">                        &#125;</span><br><span class="line">                        <span class="keyword">else</span> <span class="keyword">if</span> (lpData != <span class="literal">default</span> &amp;&amp; lpcbData != <span class="literal">default</span>)</span><br><span class="line">                        &#123;</span><br><span class="line">                            <span class="keyword">if</span> (*lpcbData &gt;= <span class="keyword">sizeof</span>(<span class="built_in">int</span>))</span><br><span class="line">                            &#123;</span><br><span class="line">                                *lpData = <span class="number">1</span>;</span><br><span class="line">                                result = WIN32_ERROR.ERROR_SUCCESS;</span><br><span class="line">                            &#125;</span><br><span class="line">                            <span class="keyword">else</span></span><br><span class="line">                            &#123;</span><br><span class="line">                                result = WIN32_ERROR.ERROR_MORE_DATA;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">return</span> result;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;inheritdoc/&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Dispose</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!disposed &amp;&amp; IsHooked)</span><br><span class="line">        &#123;</span><br><span class="line">            EndHook();</span><br><span class="line">        &#125;</span><br><span class="line">        GC.SuppressFinalize(<span class="keyword">this</span>);</span><br><span class="line">        disposed = <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>随后我们只需要在入口点创建<code>App</code>时进行劫持就行了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">bool</span> IsSupportCoreWindow</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">get</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">try</span></span><br><span class="line">        &#123;</span><br><span class="line">            RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(<span class="string">@&quot;SOFTWARE\Microsoft\WinUI\Xaml&quot;</span>);</span><br><span class="line">            <span class="keyword">return</span> registryKey?.GetValue(<span class="string">&quot;EnableUWPWindow&quot;</span>) <span class="keyword">is</span> &gt; <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">catch</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    ComWrappersSupport.InitializeComWrappers();</span><br><span class="line">    HookRegistry hookRegistry = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">try</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!IsSupportCoreWindow)</span><br><span class="line">        &#123;</span><br><span class="line">            hookRegistry = <span class="keyword">new</span> HookRegistry();</span><br><span class="line">        &#125;</span><br><span class="line">        XamlCheckProcessRequirements();</span><br><span class="line">        Application.Start(p =&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            DispatcherQueueSynchronizationContext context = <span class="keyword">new</span>(DispatcherQueue.GetForCurrentThread());</span><br><span class="line">            SynchronizationContext.SetSynchronizationContext(context);</span><br><span class="line">            _ = <span class="keyword">new</span> App();</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">finally</span></span><br><span class="line">    &#123;</span><br><span class="line">        hookRegistry?.Dispose();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当然想要自定义入口函数，我们需要在<code>csproj</code>加上定义。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">DefineConstants</span>&gt;</span>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN<span class="tag">&lt;/<span class="name">DefineConstants</span>&gt;</span></span><br></pre></td></tr></table></figure><p>同时还要记得在清单中明确入口点。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Package</span> <span class="attr">...</span>&gt;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="tag">&lt;<span class="name">Applications</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Application</span> <span class="attr">...</span></span></span><br><span class="line"><span class="tag">      <span class="attr">EntryPoint</span>=<span class="string">&quot;明确的入口点&quot;</span>&gt;</span></span><br><span class="line">      ...</span><br><span class="line">    <span class="tag">&lt;/<span class="name">Application</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Applications</span>&gt;</span></span><br><span class="line">  ...</span><br><span class="line"><span class="tag">&lt;/<span class="name">Package</span>&gt;</span></span><br></pre></td></tr></table></figure><p>随后我们就可以正常的使用 UWP&#x2F;WAS 了。</p><p>最后附上示例应用：<a href="https://github.com/wherewhere/CoreAppUWP/tree/muxc">https://github.com/wherewhere/CoreAppUWP/tree/muxc</a></p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/18447226">【UWP】在 UWP 中使用 Windows App SDK</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2024年10月8日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2024/10/18/%E3%80%90UWP%E3%80%91%E5%9C%A8-UWP-%E4%B8%AD%E4%BD%BF%E7%94%A8-Windows-App-SDK/</id><link href="https://wherewhere.github.io/2024/10/18/%E3%80%90UWP%E3%80%91%E5%9C%A8-UWP-%E4%B8%AD%E4%BD%BF%E7%94%A8-Windows-App-SDK/"/><published>2024-10-18T07:49:00.000Z</published><summary><![CDATA[<p>众所周知，WAS (Windows App SDK，俗称 WinUI3)在刚开始是支持 UWP 的，甚至最早<a href="https://blogs.windows.com/windowsdeveloper/2020/05/19/introducing-winui-3-preview-1" title="Introducing WinUI 3 Preview 1">只支持 UWP</a>，但是微软在正式版发布前删除了对 UWP 的支持，不过真的删除了吗？<a href="https://x.com/driver1998" title="@driver1998">初生之鸟</a>在<a href="https://x.com/driver1998/status/1716388306144137260">2023年10月发现</a>在 VS 调试下无视报错继续运行可以正常在 UWP 加载 WAS。随着 WAS 的开源，WAS 阻止在 UWP 上运行的原因也被找到，至此大家终于找到在 UWP 上使用 WAS 的方法了。</p>
<p>WAS 阻止在 UWP 上运行的方法很简单，就是检查注册表<code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WinUI\Xaml\EnableUWPWindow</code>是否为<code>00000001</code>，如果不是就直接报错。</p>
<details open>
<summary><a href="https://github.com/microsoft/microsoft-ui-xaml/blob/main/src/dxaml/xcp/dxaml/lib/Window_Partial.cpp#L80-L114" target="_blank" rel="noopener nofollow">Window_Partial.cpp#L80-L114</a></summary>

<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ----------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">//                               IWindow</span></span><br><span class="line"><span class="comment">// ----------------------------------------------------------------------</span></span><br><span class="line">Window::<span class="built_in">Window</span>()</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// The first window created internally by DXamlCore _must_ be a UWP Window.  DXamlCore</span></span><br><span class="line">    <span class="comment">// requires and controls the lifetime of a hidden UWP Microsoft.UI.Xaml.Window.</span></span><br><span class="line">    <span class="comment">// note that this Window instance will be the &#x27;real&#x27; window for UWP instances, but</span></span><br><span class="line">    <span class="comment">// serves as a dummy for all other instances. dummy behavior is deprecated and being removed.</span></span><br><span class="line">    <span class="keyword">auto</span> dxamlCore = DXamlCore::<span class="built_in">GetCurrent</span>();</span><br><span class="line">    Window* window = dxamlCore-&gt;<span class="built_in">GetDummyWindowNoRef</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!window)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// Do a runtime check to see if UWP should be enabled</span></span><br><span class="line">        <span class="type">static</span> <span class="keyword">auto</span> runtimeEnabledFeatureDetector = RuntimeFeatureBehavior::<span class="built_in">GetRuntimeEnabledFeatureDetector</span>();</span><br><span class="line">        <span class="keyword">auto</span> UWPWindowEnabled = runtimeEnabledFeatureDetector-&gt;<span class="built_in">IsFeatureEnabled</span>(RuntimeEnabledFeature::EnableUWPWindow);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// WinUI UWP</span></span><br><span class="line">        <span class="keyword">if</span> (!UWPWindowEnabled &amp;&amp; DXamlCore::<span class="built_in">GetCurrent</span>()-&gt;<span class="built_in">GetHandle</span>()-&gt;<span class="built_in">GetInitializationType</span>() != InitializationType::IslandsOnly)</span><br><span class="line">        &#123;</span><br><span class="line">            ::<span class="built_in">RoOriginateError</span>(</span><br><span class="line">                E_NOT_SUPPORTED,</span><br><span class="line">                wrl_wrappers::<span class="built_in">HStringReference</span>(</span><br><span class="line">                <span class="string">L&quot;WinUI: Error creating an UWP Window. Creating an UWP window is not allowed.&quot;</span></span><br><span class="line">                ).<span class="built_in">Get</span>());</span><br><span class="line">            <span class="built_in">XAML_FAIL_FAST</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        m_spWindowImpl = std::<span class="built_in">make_shared</span>&lt;UWPWindowImpl&gt;(<span class="keyword">this</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        m_spWindowImpl = std::<span class="built_in">make_shared</span>&lt;DesktopWindowImpl&gt;(<span class="keyword">this</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

</details>]]></summary><title>【UWP】在 UWP 中使用 Windows App SDK</title><updated>2024-10-18T07:49:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><content><![CDATA[<p>众所周知，UWP 是运行在沙盒里面的，所有权限都有严格限制，和沙盒外交互也需要特殊的通道，所以从根本杜绝了 UWP 毒瘤的存在。但是实际上 UWP 只是一个应用模型，本身是没有什么权限管理的，权限管理全靠 App Container 沙盒控制，如果我们脱离了这个沙盒，UWP 就会放飞自我了。那么有没有这种可能呢？</p><p>我们打开设置应用，通过任务管理器查看进程，就会发现它并没有 Runtime Broker 存在，这个进程是用来在沙盒间代理的，这说明微软给 UWP 开了一个后门。</p><p><img src="https://github.com/user-attachments/assets/b08540d0-de83-4afe-9a7c-c4e02decde4c" alt="任务管理器" loading="lazy"></p><p>那么我们是不是也有办法脱离沙盒运行呢？<a href="https://twitter.com/AhmedWalid605" title="@AhmedWalid605">Ahmed Walid</a> 在 2023年2月 发表了这样一个<a href="https://twitter.com/AhmedWalid605/status/1622010165053607943" title="推文">帖子</a>：<span id="more"></span></p><p><img src="https://github.com/user-attachments/assets/d403d7b3-f172-4be9-96e9-73d738f8989c" alt="推文" loading="lazy"></p><p>同时他还提交了一个名为 <a href="https://github.com/MicrosoftDocs/winrt-related/pull/" title="Added a remark about uap10:TrustLevel">Added a remark about uap10:TrustLevel</a> 的 PR，在这个 PR 中明确提到了如何通过设置 Custom Capability 来修改 UWP 的 TrustLevel</p><blockquote><p>Setting <code>uap10:TrustLevel=&quot;mediumIL&quot;</code> while <code>uap10:RuntimeBehavior=&quot;windowsApp&quot;</code> requires the <code>Microsoft.coreAppActivation_8wekyb3d8bbwe</code> Custom Capability.</p><p>This is also true if <code>uap10:TrustLevel=&quot;mediumIL&quot;</code> and <code>EntryPoint</code> is any other value than <code>&quot;windows.fullTrustApplication&quot;</code> or <code>&quot;windows.partialTrustApplication&quot;</code>.</p><p>You can read more about this custom capability here in <a href="https://learn.microsoft.com/zh-cn/windows/uwp/packaging/app-capability-declarations#custom-capabilities" title="Custom Capabilities">Custom Capabilities</a>.</p></blockquote><p>如今这个 PR 已经合并，现在可以直接在微软文档<a href="https://learn.microsoft.com/zh-cn/uwp/schemas/appxpackage/uapmanifestschema/element-application#combinations-of-activation-info-attributes" title="激活信息属性的组合">《应用程序 (Windows 10)》</a>中找到了</p><p>根据文档描述，我们需要添加一个名为 <code>Microsoft.coreAppActivation_8wekyb3d8bbwe</code> 的自定义权限，然后将 <code>uap10:TrustLevel</code> 设置为 <code>mediumIL</code> 即可</p><p>首先我们在清单中加入权限</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Package</span></span></span><br><span class="line"><span class="tag">  <span class="attr">...</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xmlns:uap4</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/manifest/uap/windows10/4&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xmlns:rescap</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">IgnorableNamespaces</span>=<span class="string">&quot;... uap4 rescap&quot;</span>&gt;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="tag">&lt;<span class="name">Capabilities</span>&gt;</span></span><br><span class="line">    ...</span><br><span class="line">    <span class="comment">&lt;!-- runFullTrust 权限是必不可少的 --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">rescap:Capability</span> <span class="attr">Name</span>=<span class="string">&quot;runFullTrust&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uap4:CustomCapability</span> <span class="attr">Name</span>=<span class="string">&quot;Microsoft.coreAppActivation_8wekyb3d8bbwe&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Capabilities</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Package</span>&gt;</span></span><br></pre></td></tr></table></figure><p>Custom Capability 不同于其他权限，这是用来给 OEM 自定义使用的，需要 SCCD 文件来证明你有使用权限的资格，所以想上架是基本没可能了，相关内容可以查看教程 <a href="https://www.cnblogs.com/cjw1115/p/7884876.html" title="[UWP] Custom Capability的使用">[UWP] Custom Capability的使用</a></p><p>我们在项目根目录新建一个名为 <code>CustomCapability.SCCD</code> 的文件，在其中写入</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">CustomCapabilityDescriptor</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/2018/sccd&quot;</span> <span class="attr">xmlns:s</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/2018/sccd&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">CustomCapabilities</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">CustomCapability</span> <span class="attr">Name</span>=<span class="string">&quot;Microsoft.coreAppActivation_8wekyb3d8bbwe&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">CustomCapability</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">CustomCapabilities</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">AuthorizedEntities</span> <span class="attr">AllowAny</span>=<span class="string">&quot;true&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Catalog</span>&gt;</span>FFFF<span class="tag">&lt;/<span class="name">Catalog</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">CustomCapabilityDescriptor</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后将该文件设置为内容，或者选择复制到输出，只要最后能出现在安装包里面就行了</p><p>最后我们将 <code>uap10:TrustLevel</code> 设置为 <code>mediumIL</code></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Package</span></span></span><br><span class="line"><span class="tag">  <span class="attr">...</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xmlns:uap10</span>=<span class="string">&quot;http://schemas.microsoft.com/appx/manifest/uap/windows10/10&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">IgnorableNamespaces</span>=<span class="string">&quot;... uap10&quot;</span>&gt;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="tag">&lt;<span class="name">Applications</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Application</span></span></span><br><span class="line"><span class="tag">      <span class="attr">...</span></span></span><br><span class="line"><span class="tag">      <span class="attr">uap10:TrustLevel</span>=<span class="string">&quot;mediumIL&quot;</span>&gt;</span></span><br><span class="line">      ...</span><br><span class="line">    <span class="tag">&lt;/<span class="name">Application</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Applications</span>&gt;</span></span><br><span class="line">  ...</span><br><span class="line"><span class="tag">&lt;/<span class="name">Package</span>&gt;</span></span><br></pre></td></tr></table></figure><p>我们调用<code>Process.GetProcesses()</code>获取进程列表（<code>UAP 10.0.15138.0</code>虽然加入了<code>Process</code>支持，但是并没有实现<code>Process</code>.<code>GetProcesses()</code>，所以这里是运行在 .NET 8.0 上的</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Microsoft.UI.Xaml.Controls;</span><br><span class="line"><span class="keyword">using</span> System.Diagnostics;</span><br><span class="line"></span><br><span class="line"><span class="comment">// To learn more about WinUI, the WinUI project structure,</span></span><br><span class="line"><span class="comment">// and more about our project templates, see: http://aka.ms/winui-project-info.</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">FullTrustUWP.Pages</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> An empty page that can be used on its own or navigated to within a Frame.</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">MainPage</span> : <span class="title">Page</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">MainPage</span>()</span> =&gt; InitializeComponent();</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Test</span>()</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// 这里使用了 Windows App SDK，实际上 WAS 是支持 UWP 的</span></span><br><span class="line">            Content = <span class="keyword">new</span> ItemsView</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="comment">// 必须使用 .NET Core App，因为微软没有给 .NET Core 5.0 实现这个方法</span></span><br><span class="line">                ItemsSource = Process.GetProcesses()</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行效果</p><p><img src="https://github.com/user-attachments/assets/7a0c3308-1f7e-4ebb-a702-5bf51eab8705" alt="Snipaste_2024-05-03_17-46-15" loading="lazy"></p><p>如果没有设置<code>uap10:TrustLevel</code> 为 <code>mediumIL</code>，则依然运行在沙盒中，<code>Process.GetProcesses()</code>只能获取到沙盒中的进程</p><p><img src="https://github.com/user-attachments/assets/c102c39f-d48f-4115-8d0c-5725e5f38a1f" alt="无权限" loading="lazy"></p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/18171253">【UWP】修改清单脱离沙盒运行</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2024年4月17日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2024/05/03/%E3%80%90UWP%E3%80%91%E4%BF%AE%E6%94%B9%E6%B8%85%E5%8D%95%E8%84%B1%E7%A6%BB%E6%B2%99%E7%9B%92%E8%BF%90%E8%A1%8C/</id><link href="https://wherewhere.github.io/2024/05/03/%E3%80%90UWP%E3%80%91%E4%BF%AE%E6%94%B9%E6%B8%85%E5%8D%95%E8%84%B1%E7%A6%BB%E6%B2%99%E7%9B%92%E8%BF%90%E8%A1%8C/"/><published>2024-05-03T08:37:00.000Z</published><summary><![CDATA[<p>众所周知，UWP 是运行在沙盒里面的，所有权限都有严格限制，和沙盒外交互也需要特殊的通道，所以从根本杜绝了 UWP 毒瘤的存在。但是实际上 UWP 只是一个应用模型，本身是没有什么权限管理的，权限管理全靠 App Container 沙盒控制，如果我们脱离了这个沙盒，UWP 就会放飞自我了。那么有没有这种可能呢？</p>
<p>我们打开设置应用，通过任务管理器查看进程，就会发现它并没有 Runtime Broker 存在，这个进程是用来在沙盒间代理的，这说明微软给 UWP 开了一个后门。</p>
<p><img src="https://github.com/user-attachments/assets/b08540d0-de83-4afe-9a7c-c4e02decde4c" alt="任务管理器" loading="lazy"></p>
<p>那么我们是不是也有办法脱离沙盒运行呢？<a href="https://twitter.com/AhmedWalid605" title="@AhmedWalid605">Ahmed Walid</a> 在 2023年2月 发表了这样一个<a href="https://twitter.com/AhmedWalid605/status/1622010165053607943" title="推文">帖子</a>：]]></summary><title>【UWP】修改清单脱离沙盒运行</title><updated>2024-05-03T10:05:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="逆向" scheme="https://wherewhere.github.io/tags/%E9%80%86%E5%90%91/"/><category term="IL" scheme="https://wherewhere.github.io/tags/IL/"/><category term="魔法" scheme="https://wherewhere.github.io/tags/%E9%AD%94%E6%B3%95/"/><content><![CDATA[<p>众所周知，C# 只支持对 <code>基类/接口/class/struct/new()</code> 以及一些 IDE 魔法的约束，比如这样</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">Test</span>&lt;<span class="title">T</span>&gt;(<span class="params">T <span class="keyword">value</span></span>) <span class="keyword">where</span> T : ITest</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">value</span>.Test();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title">ITest</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="built_in">string</span> <span class="title">Test</span>()</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但是如果我们想要随心所欲的约束就不行了</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">Test</span>&lt;<span class="title">T</span>&gt;(<span class="params">T <span class="keyword">value</span></span>) <span class="keyword">where</span> T :</span> &#123; <span class="function"><span class="built_in">string</span> <span class="title">Test</span>()</span>; &#125;</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">value</span>.Test();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最近无聊乱折腾 <code>MSIL</code>，弄出来好多不能跑的魔法，虽然不能跑但是反编译出的 C# 看着很神奇，其中正好就有想看看能不能弄个神奇的泛型出来，于是我胡写了一段代码<span id="more"></span></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">.assembly _</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.class public Test</span><br><span class="line">&#123;</span><br><span class="line">    .method public void .ctor()</span><br><span class="line">    &#123;</span><br><span class="line">        ldarg.0</span><br><span class="line">        call instance void object::.ctor()</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public static void Main()</span><br><span class="line">    &#123;</span><br><span class="line">        .entrypoint</span><br><span class="line">        newobj instance void Test::.ctor()</span><br><span class="line">        call string Test::Test&lt;class Test&gt;(!!0)</span><br><span class="line">        call void [mscorlib]System.Console::WriteLine(string)</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public static string Test&lt;T&gt;(!!T t)</span><br><span class="line">    &#123;</span><br><span class="line">        ldarg.s t</span><br><span class="line">        callvirt instance string !!T::Test()</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public string Test()</span><br><span class="line">    &#123;</span><br><span class="line">        ldstr &quot;Call instance string Test::Test()&quot;</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>反编译出来是这样的</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Test</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        Console.WriteLine(Test(<span class="keyword">new</span> Test()));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">unsafe</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">Test</span>&lt;<span class="title">T</span>&gt;(<span class="params">T t</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> ((T*)t)-&gt;Test();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="built_in">string</span> <span class="title">Test</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;Call instance string Test::Test()&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这段代码是无法运行的，在 .NET Framework 会直接无返回，而在 Mono 会报错</p><blockquote><p>[ERROR] FATAL UNHANDLED EXCEPTION: System.MissingMethodException: Method not found: string .T_REF.Test()<br>　　at Test.Main () [0x00005] in &lt;ddf64a5d94ef4722be4197eb692d9478&gt;:0</p></blockquote><p>于是我就当这是 .NET 泛型的局限性了，后来有群友提醒我说约束会影响运行时，于是我就尝试加上约束</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">.method public static string Test&lt;(Test) T&gt;(!!T t)</span><br><span class="line">&#123;</span><br><span class="line">    ldarg.s t</span><br><span class="line">    callvirt instance string !!T::Test()</span><br><span class="line">    ret</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现真的能跑了（Framework 依然无返回。。。），于是我就看看能不能同时约束两个类型</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">.method public static string Test&lt;(Test, Test2) T&gt;(!!T t)</span><br><span class="line">&#123;</span><br><span class="line">    ldarg.s t</span><br><span class="line">    callvirt instance string !!T::Test()</span><br><span class="line">    ret</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Mono 成功输出</p><blockquote><p>Call instance string Test::Test()<br>Call instance string Test2::Test()</p></blockquote><p>而 Framework 直接运行时约束了。。。</p><blockquote><p>未经处理的异常: System.Security.VerificationException: 方法 Test.Test: 类型参数“Test”与类型参数“T”的约束冲突。<br>　　在 Test.Main()</p></blockquote><p>很明显 Mono 给泛型开了洞</p><p>随后测试发现，只要约束的类有相关成员就可以正常调用，于是我就利用抽象类做接口</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br></pre></td><td class="code"><pre><span class="line">.assembly _</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.class public Test</span><br><span class="line">&#123;</span><br><span class="line">    .field string Test</span><br><span class="line"></span><br><span class="line">    .method public void .ctor()</span><br><span class="line">    &#123;</span><br><span class="line">        ldarg.0</span><br><span class="line">        ldstr &quot;This is Test&quot;</span><br><span class="line">        stfld string Test::Test</span><br><span class="line">        ldarg.0</span><br><span class="line">        call instance void object::.ctor()</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public static void Main()</span><br><span class="line">    &#123;</span><br><span class="line">        .entrypoint</span><br><span class="line">        .locals init (</span><br><span class="line">            class Test test,</span><br><span class="line">            class Test2 test2</span><br><span class="line">        )</span><br><span class="line">        newobj instance void Test::.ctor()</span><br><span class="line">        stloc.s test</span><br><span class="line">        ldloc.s test</span><br><span class="line">        call void Test::Test&lt;class Test&gt;(!!0)</span><br><span class="line">        ldloc.s test</span><br><span class="line">        call string Test::Test&lt;class Test&gt;(!!0)</span><br><span class="line">        call void [mscorlib]System.Console::WriteLine(string)</span><br><span class="line">        newobj instance void Test2::.ctor()</span><br><span class="line">        stloc.s test2</span><br><span class="line">        ldloc.s test2</span><br><span class="line">        call void Test::Test&lt;class Test2&gt;(!!0)</span><br><span class="line">        ldloc.s test2</span><br><span class="line">        call string Test::Test&lt;class Test2&gt;(!!0)</span><br><span class="line">        call void [mscorlib]System.Console::WriteLine(string)</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public static void Test&lt;(WithTest) T&gt;(!!T t)</span><br><span class="line">    &#123;</span><br><span class="line">        ldarg.s t</span><br><span class="line">        ldfld string !!T::Test</span><br><span class="line">        call void [mscorlib]System.Console::WriteLine(string)</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public static string Test&lt;(WithTest) T&gt;(!!T t)</span><br><span class="line">    &#123;</span><br><span class="line">        ldarg.s t</span><br><span class="line">        callvirt instance string !!T::Test()</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public string Test()</span><br><span class="line">    &#123;</span><br><span class="line">        ldstr &quot;Call instance string Test::Test()&quot;</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.class public Test2</span><br><span class="line">&#123;</span><br><span class="line">    .field string Test</span><br><span class="line"></span><br><span class="line">    .method public void .ctor()</span><br><span class="line">    &#123;</span><br><span class="line">        ldarg.0</span><br><span class="line">        ldstr &quot;This is Test2&quot;</span><br><span class="line">        stfld string Test2::Test</span><br><span class="line">        ldarg.0</span><br><span class="line">        call instance void object::.ctor()</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    .method public newslot virtual string Test()</span><br><span class="line">    &#123;</span><br><span class="line">        ldstr &quot;Call instance string Test2::Test()&quot;</span><br><span class="line">        ret</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.class public abstract WithTest</span><br><span class="line">&#123;</span><br><span class="line">    .field string Test</span><br><span class="line"></span><br><span class="line">    .method public newslot abstract virtual string Test()</span><br><span class="line">    &#123;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>正确输出</p><blockquote><p>This is Test<br>Call instance string Test::Test()<br>This is Test2<br>Call instance string Test2::Test()</p></blockquote><p>Framework 自然还是炸的</p><p>最后反编译出来长这样</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Test</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">string</span> m_Test = <span class="string">&quot;This is Test&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        Test t = <span class="keyword">new</span> Test();</span><br><span class="line">        <span class="keyword">global</span>::Test.Test&lt;Test&gt;(t);</span><br><span class="line">        Console.WriteLine(<span class="keyword">global</span>::Test.Test&lt;Test&gt;(t));</span><br><span class="line">        Test2 t2 = <span class="keyword">new</span> Test2();</span><br><span class="line">        <span class="keyword">global</span>::Test.Test&lt;Test2&gt;(t2);</span><br><span class="line">        Console.WriteLine(<span class="keyword">global</span>::Test.Test&lt;Test2&gt;(t2));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">unsafe</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Test</span>&lt;<span class="title">T</span>&gt;(<span class="params">T t</span>) <span class="keyword">where</span> T : WithTest</span></span><br><span class="line">    &#123;</span><br><span class="line">        Console.WriteLine(((T*)t)-&gt;Test);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">unsafe</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">Test</span>&lt;<span class="title">T</span>&gt;(<span class="params">T t</span>) <span class="keyword">where</span> T : WithTest</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> ((T*)t)-&gt;Test();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="built_in">string</span> <span class="title">Test</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;Call instance string Test::Test()&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Test2</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">string</span> m_Test = <span class="string">&quot;This is Test2&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">virtual</span> <span class="built_in">string</span> <span class="title">Test</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;Call instance string Test2::Test()&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">class</span> <span class="title">WithTest</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">string</span> m_Test;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="built_in">string</span> <span class="title">Test</span>()</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当然，这种操作仅限娱乐，经测试 .NET Framework 和 .NET Core App 都会卡在约束，所以 .NET 是别想有随意的约束了，不过 C# 题案 <a href="https://github.com/dotnet/csharplang/discussions/5496" title="[Proposal]: Roles and extensions">&quot;Roles and extensions&quot;</a> 倒是给出了曲线实现方案</p><blockquote><p><a href="https://www.cnblogs.com/wherewhere/p/18140783">【.NET】利用 IL 魔法实现随心随意的泛型约束</a> 作者 <a href="https://home.cnblogs.com/u/wherewhere">@where-where</a> 2024年4月17日 发表于 <a href="https://www.cnblogs.com/" title="CNBlogs">博客园</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2024/04/17/%E3%80%90-NET%E3%80%91%E5%88%A9%E7%94%A8-IL-%E9%AD%94%E6%B3%95%E5%AE%9E%E7%8E%B0%E9%9A%8F%E5%BF%83%E9%9A%8F%E6%84%8F%E7%9A%84%E6%B3%9B%E5%9E%8B%E7%BA%A6%E6%9D%9F/</id><link href="https://wherewhere.github.io/2024/04/17/%E3%80%90-NET%E3%80%91%E5%88%A9%E7%94%A8-IL-%E9%AD%94%E6%B3%95%E5%AE%9E%E7%8E%B0%E9%9A%8F%E5%BF%83%E9%9A%8F%E6%84%8F%E7%9A%84%E6%B3%9B%E5%9E%8B%E7%BA%A6%E6%9D%9F/"/><published>2024-04-17T09:10:00.000Z</published><summary><![CDATA[<p>众所周知，C# 只支持对 <code>基类/接口/class/struct/new()</code> 以及一些 IDE 魔法的约束，比如这样</p>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">Test</span>&lt;<span class="title">T</span>&gt;(<span class="params">T <span class="keyword">value</span></span>) <span class="keyword">where</span> T : ITest</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">value</span>.Test();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title">ITest</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="built_in">string</span> <span class="title">Test</span>()</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>但是如果我们想要随心所欲的约束就不行了</p>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">Test</span>&lt;<span class="title">T</span>&gt;(<span class="params">T <span class="keyword">value</span></span>) <span class="keyword">where</span> T :</span> &#123; <span class="function"><span class="built_in">string</span> <span class="title">Test</span>()</span>; &#125;</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">value</span>.Test();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>最近无聊乱折腾 <code>MSIL</code>，弄出来好多不能跑的魔法，虽然不能跑但是反编译出的 C# 看着很神奇，其中正好就有想看看能不能弄个神奇的泛型出来，于是我胡写了一段代码]]></summary><title>【.NET】利用 IL 魔法实现随心随意的泛型约束</title><updated>2024-05-04T06:59:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="公告" scheme="https://wherewhere.github.io/categories/%E5%85%AC%E5%91%8A/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="WinRT" scheme="https://wherewhere.github.io/tags/WinRT/"/><category term="ADB" scheme="https://wherewhere.github.io/tags/ADB/"/><category term="公告" scheme="https://wherewhere.github.io/tags/%E5%85%AC%E5%91%8A/"/><category term="资源" scheme="https://wherewhere.github.io/tags/%E8%B5%84%E6%BA%90/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><content><![CDATA[<h2 id="Announcing"><a href="#Announcing" class="headerlink" title="Announcing"></a>Announcing</h2><p>We have packaged this project into winrt. With the winrt version, we can use it in cpp&#x2F;winrt and other projects. You can find the winrt version in <a href="https://github.com/yungd1plomat/AdvancedSharpAdbClient/tree/winrt"><code>winrt branch</code></a>.</p><h2 id="How-to-use-it"><a href="#How-to-use-it" class="headerlink" title="How to use it"></a>How to use it</h2><p>There are two way to reference it.</p><ul><li><p>Reference to the project directly</p><p>Fork this repository and change the branch to <code>winrt</code>.</p><ul><li><p>If your project is face to uwp, add this to your <code>.vcproj</code></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">ProjectReference</span> <span class="attr">Include</span>=<span class="string">&quot;\path\to\AdvancedSharpAdbClient.WinRT.csproj&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Project</span>&gt;</span>&#123;083cdc04-9cc2-46e4-84c2-55b645be9d50&#125;<span class="tag">&lt;/<span class="name">Project</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">SetTargetFramework</span>&gt;</span>TargetFramework=uap10.0<span class="tag">&lt;/<span class="name">SetTargetFramework</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ProjectReference</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>If your project is face to desktop, add this to your <code>.vcproj</code></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">ProjectReference</span> <span class="attr">Include</span>=<span class="string">&quot;\path\to\AdvancedSharpAdbClient.WinRT.csproj&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Project</span>&gt;</span>&#123;083cdc04-9cc2-46e4-84c2-55b645be9d50&#125;<span class="tag">&lt;/<span class="name">Project</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">SetTargetFramework</span>&gt;</span>TargetFramework=net6.0-windows10.0.17763.0<span class="tag">&lt;/<span class="name">SetTargetFramework</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ProjectReference</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p>Reference to the nuget package<span id="more"></span></p><p>Download <a href="https://github.com/yungd1plomat/AdvancedSharpAdbClient/files/12092217/AdvancedSharpAdbClient.WinRT.0.0.1.zip">AdvancedSharpAdbClient.WinRT.zip</a>.</p><p>Unzip it into <code>nupkgs</code> folder of the root path of your project<br><img src="https://github.com/user-attachments/assets/da648eb2-d505-4fd2-ac78-f534f1ad018b" alt="image" loading="lazy"></p><p>Create <code>nuget.config</code> into the root path of your project and add</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">packageSources</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">add</span> <span class="attr">key</span>=<span class="string">&quot;Offline Nugets&quot;</span> <span class="attr">value</span>=<span class="string">&quot;nupkgs&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">packageSources</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br></pre></td></tr></table></figure><p>Open the manager of nuget and you will find it. Just install it like a normal nuget.<br><img src="https://github.com/user-attachments/assets/7d2ce405-5879-42e1-a27d-191a37ebb8f4" alt="image" loading="lazy"></p></li></ul><p>After that, if your project is not packaged into appx or misx, remember to create <code>ProjectName.exe.manifest</code> in the root of your project to register winrt class.</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">assembly</span> <span class="attr">manifestVersion</span>=<span class="string">&quot;1.0&quot;</span> <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:asm.v1&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">assemblyIdentity</span> <span class="attr">version</span>=<span class="string">&quot;1.0.0.0&quot;</span> <span class="attr">name</span>=<span class="string">&quot;ProjectName&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">file</span> <span class="attr">name</span>=<span class="string">&quot;WinRT.Host.dll&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.AdbClient&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.AdbCommandLineClient&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.AdbServer&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.AdbServerFeatures&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.AdbSocket&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.CrossPlatformFunc&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.DateTimeHelper&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.DeviceMonitor&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.Factories&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.SyncCommandConverter&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.SyncService&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.TcpSocket&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.DeviceCommands.LinuxPath&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.DeviceCommands.PackageManager&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activatableClass</span></span></span><br><span class="line"><span class="tag">      <span class="attr">name</span>=<span class="string">&quot;AdvancedSharpAdbClient.WinRT.Logs.LogReader&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">threadingModel</span>=<span class="string">&quot;both&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">xmlns</span>=<span class="string">&quot;urn:schemas-microsoft-com:winrt.v1&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">file</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">assembly</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p><a href="https://github.com/SharpAdb/AdvancedSharpAdbClient/issues/63">Announcing to the WinRT package of AdvancedSharpAdbClient</a> 作者 <a href="https://github.com/wherewhere" title="where where">@wherewhere</a> 2023年7月19日 发表于 <a href="https://github.com/">GitHub</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2023/07/19/Announcing-to-the-WinRT-package-of-AdvancedSharpAdbClient/</id><link href="https://wherewhere.github.io/2023/07/19/Announcing-to-the-WinRT-package-of-AdvancedSharpAdbClient/"/><published>2023-07-19T07:37:25.000Z</published><summary><![CDATA[<h2 id="Announcing"><a href="#Announcing" class="headerlink" title="Announcing"></a>Announcing</h2><p>We have packaged this project into winrt. With the winrt version, we can use it in cpp&#x2F;winrt and other projects. You can find the winrt version in <a href="https://github.com/yungd1plomat/AdvancedSharpAdbClient/tree/winrt"><code>winrt branch</code></a>.</p>
<h2 id="How-to-use-it"><a href="#How-to-use-it" class="headerlink" title="How to use it"></a>How to use it</h2><p>There are two way to reference it.</p>
<ul>
<li><p>Reference to the project directly</p>
<p>Fork this repository and change the branch to <code>winrt</code>.</p>
<ul>
<li><p>If your project is face to uwp, add this to your <code>.vcproj</code></p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">ProjectReference</span> <span class="attr">Include</span>=<span class="string">&quot;\path\to\AdvancedSharpAdbClient.WinRT.csproj&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Project</span>&gt;</span>&#123;083cdc04-9cc2-46e4-84c2-55b645be9d50&#125;<span class="tag">&lt;/<span class="name">Project</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">SetTargetFramework</span>&gt;</span>TargetFramework=uap10.0<span class="tag">&lt;/<span class="name">SetTargetFramework</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ProjectReference</span>&gt;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>If your project is face to desktop, add this to your <code>.vcproj</code></p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">ProjectReference</span> <span class="attr">Include</span>=<span class="string">&quot;\path\to\AdvancedSharpAdbClient.WinRT.csproj&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">Project</span>&gt;</span>&#123;083cdc04-9cc2-46e4-84c2-55b645be9d50&#125;<span class="tag">&lt;/<span class="name">Project</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">SetTargetFramework</span>&gt;</span>TargetFramework=net6.0-windows10.0.17763.0<span class="tag">&lt;/<span class="name">SetTargetFramework</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ProjectReference</span>&gt;</span></span><br></pre></td></tr></table></figure></li>
</ul>
</li>
<li><p>Reference to the nuget package]]></summary><title>Announcing to the WinRT package of AdvancedSharpAdbClient</title><updated>2023-07-23T21:16:44.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><content><![CDATA[<p><img src="https://github.com/user-attachments/assets/85655d62-1f07-4889-9191-143ce0be5971" alt="【UWP】开发小技巧――简单的增量加载" loading="lazy"></p><p><a href="https://www.coolapk.com/t/UWP">#UWP#</a> <a href="https://www.coolapk.com/t/%E7%88%B1%E7%BC%96%E7%A8%8B">#爱编程#</a> <a href="https://www.coolapk.com/t/%E7%94%B5%E8%84%91%E7%8E%A9%E5%AE%B6">#电脑玩家#</a></p><p>增量加载的原理这里就不多说了，具体是干什么的可以看 CNBlogs 的讲解：<a href="https://www.cnblogs.com/ms-uap/p/4155601.html">查看链接</a></p><p>这里只讲解如何使用 CNBlogs UAP 中使用的增量加载方案(我硬是看了一天才知道怎么用。。。</p><p>首先附上代码(已经被我修改过了)：<a href="https://github.com/Coolapk-UWP/Coolapk-Lite/tree/master/CoolapkLite/CoolapkLite.Core/Helpers/DataSource">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/1530f06c-0be9-4f1e-b915-b0b2175cfaea" alt="部分代码" loading="lazy"></p><figcaption class="figure">部分代码</figcaption><p>引用时不要忘了附上出处(不是我这，是CNBlogs</p><style>  figcaption.figure {    color: #999;    font-size: 0.875em;    font-weight: bold;    line-height: 1;    margin: 5px auto 15px;    text-align: center;  }  p+figcaption.figure,  p+div.code-line+.figure {    margin: -15px auto 15px;  }  @media (max-width: 567px) {    .post-body p+figcaption.figure {      margin: -5px auto 15px;    }  }</style><span id="more"></span><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Datasource base for Coolapk that enabled incremental loading (page based). <span class="doctag">&lt;br/&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> Clone from <span class="doctag">&lt;see cref=&quot;cnblogs UAP&quot; href=&quot;https://github.com/MS-UAP/cnblogs-UAP&quot; /&gt;</span>.</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br></pre></td></tr></table></figure><figcaption class="figure">引用</figcaption><p>接下来就是如何调用增量加载了(同样的，不解释代码</p><p>众所周知，UWP 中只有 <code>ListView</code> 系列支持增量加载，所以不要拿 <code>ItemsRepeater</code> 问我为什么不会自动加载。。。</p><p>首先，我们需要一个 <code>ListView</code>，光秃秃的，在不会用之前就先光秃秃的。。。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Page</span></span></span><br><span class="line"><span class="tag">    <span class="attr">x:Class</span>=<span class="string">&quot;CoolapkLite.Pages.BlankPage&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns</span>=<span class="string">&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:x</span>=<span class="string">&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:local</span>=<span class="string">&quot;using:CoolapkLite.Pages&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:d</span>=<span class="string">&quot;http://schemas.microsoft.com/expression/blend/2008&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:mc</span>=<span class="string">&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">Background</span>=<span class="string">&quot;&#123;ThemeResource ApplicationPageBackgroundThemeBrush&#125;&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">mc:Ignorable</span>=<span class="string">&quot;d&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ListView</span> <span class="attr">x:Name</span>=<span class="string">&quot;ListView&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Page</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后，新建一个集合，代码如下</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">internal</span> <span class="keyword">class</span> <span class="title">NewDS</span> : <span class="title">DataSourceBase</span>&lt;<span class="title">string</span>&gt;</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">int</span> _loadnum = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">async</span> <span class="keyword">override</span> Task&lt;IList&lt;<span class="built_in">string</span>&gt;&gt; LoadItemsAsync(<span class="built_in">uint</span> count)</span><br><span class="line">    &#123;</span><br><span class="line">        List&lt;<span class="built_in">string</span>&gt; items = <span class="keyword">new</span> List&lt;<span class="built_in">string</span>&gt;();</span><br><span class="line">        <span class="keyword">await</span> Task.Run(() =&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; count; i++)</span><br><span class="line">            &#123;</span><br><span class="line">                items.Add((i + _loadnum).ToString ());</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        _loadnum += items.Count;</span><br><span class="line">        <span class="keyword">return</span> items;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">AddItems</span>(<span class="params">IList&lt;<span class="built_in">string</span>&gt; items</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (items != <span class="literal">null</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">foreach</span> (<span class="built_in">string</span> item <span class="keyword">in</span> items)</span><br><span class="line">            &#123;</span><br><span class="line">                Add(item);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>其中，<code>LoadItemsAsync</code> 用来获取更多内容，这里是获取行数，<code>AddItems</code> 用来把东西丢进集合里，一般可以用来处理重复项。</p><p>接着，新建这个集合，直接把它绑定到 <code>ListView</code> 上就行了。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> 可用于自身或导航至 Frane 内部的空白页。</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">sealed</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">BlankPage</span> : <span class="title">Page</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">BlankPage</span>()</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">this</span>.InitializeComponent();</span><br><span class="line">        ListView.ItemsSource = <span class="keyword">new</span> NewDS();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figcaption class="figure">绑定集合</figcaption><p>我们来跑一跑看看</p><p><img src="https://github.com/user-attachments/assets/e7ac2f2a-334c-4e5e-ba84-5c606ca427b3" alt="运行" loading="lazy"></p><figcaption class="figure">运行</figcaption><p>如果真的要用在非 <code>ListView</code> 控件上或者自动加载不生效，可以通过 <code>LoadMoreItemsAsync</code> 方法手动来让它加载，所以一般刷新方法会写成这样，第一次加载时 <code>Refresh(-2)</code>，之后只要检测到滑到底了就执行一次 <code>Refresh</code> (不要问我为什么用数字，要问去问 Tan</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">async</span> Task <span class="title">Refresh</span>(<span class="params"><span class="built_in">int</span> p = <span class="number">-1</span></span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (p == <span class="number">-2</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">await</span> Reset();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (p == <span class="number">-1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        _ = <span class="keyword">await</span> LoadMoreItemsAsync(<span class="number">20</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figcaption class="figure">Tan 祖传的刷新方法</figcaption><p>这里的 <code>Reset</code> 方法在 CNBlogs UAP 里叫 <code>Refresh</code>，内容是清空集合并初始化，我为了不和 Tan 祖传的 <code>Refresh</code> 方法冲突就给改掉了，如果直接使用我给的代码的话就不用管了。</p><p><code>LoadMoreItemsAsync</code> 方法用来手动加载内容，输入的数字代表要加载的数量，自动加载的时候这个数是会自行计算出来的</p><p>好了，本次教程就先说这么多了，更多内容等我下次再说</p><blockquote><p><a href="https://www.coolapk.com/feed/33071083?shareKey=MGUwNzc1MzBlZGViNjYzZmNhZDA">【UWP】开发小技巧――简单的增量加载</a> 作者 <a href="https://www.coolapk.com/u/wherewhere">@wherewhere</a> 2022年1月24日 发表于 <a href="https://www.coolapk.com/" title="Coolapk">酷安</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2022/01/24/%E3%80%90UWP%E3%80%91%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7%E2%80%95%E2%80%95%E7%AE%80%E5%8D%95%E7%9A%84%E5%A2%9E%E9%87%8F%E5%8A%A0%E8%BD%BD/</id><link href="https://wherewhere.github.io/2022/01/24/%E3%80%90UWP%E3%80%91%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7%E2%80%95%E2%80%95%E7%AE%80%E5%8D%95%E7%9A%84%E5%A2%9E%E9%87%8F%E5%8A%A0%E8%BD%BD/"/><published>2022-01-24T14:46:06.000Z</published><summary><![CDATA[<p><img src="https://github.com/user-attachments/assets/85655d62-1f07-4889-9191-143ce0be5971" alt="【UWP】开发小技巧――简单的增量加载" loading="lazy"></p>
<p><a href="https://www.coolapk.com/t/UWP">#UWP#</a> <a href="https://www.coolapk.com/t/%E7%88%B1%E7%BC%96%E7%A8%8B">#爱编程#</a> <a href="https://www.coolapk.com/t/%E7%94%B5%E8%84%91%E7%8E%A9%E5%AE%B6">#电脑玩家#</a></p>
<p>增量加载的原理这里就不多说了，具体是干什么的可以看 CNBlogs 的讲解：<a href="https://www.cnblogs.com/ms-uap/p/4155601.html">查看链接</a></p>
<p>这里只讲解如何使用 CNBlogs UAP 中使用的增量加载方案(我硬是看了一天才知道怎么用。。。</p>
<p>首先附上代码(已经被我修改过了)：<a href="https://github.com/Coolapk-UWP/Coolapk-Lite/tree/master/CoolapkLite/CoolapkLite.Core/Helpers/DataSource">查看链接</a></p>
<p><img src="https://github.com/user-attachments/assets/1530f06c-0be9-4f1e-b915-b0b2175cfaea" alt="部分代码" loading="lazy"></p>
<figcaption class="figure">部分代码</figcaption>

<p>引用时不要忘了附上出处(不是我这，是CNBlogs</p>
<style>
  figcaption.figure {
    color: #999;
    font-size: 0.875em;
    font-weight: bold;
    line-height: 1;
    margin: 5px auto 15px;
    text-align: center;
  }

  p+figcaption.figure,
  p+div.code-line+.figure {
    margin: -15px auto 15px;
  }

  @media (max-width: 567px) {
    .post-body p+figcaption.figure {
      margin: -5px auto 15px;
    }
  }
</style>]]></summary><title>【UWP】开发小技巧――简单的增量加载</title><updated>2022-01-24T14:46:06.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="资源" scheme="https://wherewhere.github.io/categories/%E8%B5%84%E6%BA%90/"/><category term="资源" scheme="https://wherewhere.github.io/tags/%E8%B5%84%E6%BA%90/"/><category term="APK" scheme="https://wherewhere.github.io/tags/APK/"/><category term="WAS" scheme="https://wherewhere.github.io/tags/WAS/"/><category term="WPF" scheme="https://wherewhere.github.io/tags/WPF/"/><category term="WSA" scheme="https://wherewhere.github.io/tags/WSA/"/><category term="Win11" scheme="https://wherewhere.github.io/tags/Win11/"/><content><![CDATA[<img alt="APK Installer LOGO" src="https://github.com/user-attachments/assets/5ebcccb0-c607-41d3-8ffc-8481cfe3dba2" width="200px" style="display: inline;" /><h2 id="APK-Installer"><a href="#APK-Installer" class="headerlink" title="APK Installer"></a>APK Installer</h2><p>一个适用于 Windows 的 Android 应用安装程序</p><p><a href="https://crowdin.com/project/APKInstaller"><img class="badge" src="https://badges.crowdin.net/APKInstaller/localized.svg" alt="Crowdin"></a> <a href="https://crowdin.com/project/APK-Installer-Classic"><img class="badge" src="https://badges.crowdin.net/APK-Installer-Classic/localized.svg" alt="Crowdin"></a></p><h3 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h3><ul><li>本应用已上架应用商店，请认准作者为 wherewhere，请不要使用来历不明的版本，如果因为使用不明版本而出现的故障请自行解决。</li><li>本应用分为 <a href="https://github.com/Paving-Base/APK-Installer">WinUI3版</a> 和 <a href="https://github.com/Paving-Base/APK-Installer-Classic">WPF版</a>，请根据需要选取</li></ul><h3 id="下载链接"><a href="#下载链接" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://www.microsoft.com/store/apps/9P2JFQ43FPPG" title="APK 安装程序 - WinUI 3"><img class="badge" src="https://img.shields.io/badge/download-下载-magenta.svg?label=APK 安装程序 - WinUI 3&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2ZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TWljcm9zb2Z0IFN0b3JlPC90aXRsZT48cGF0aCBkPSJNMTEuNCA5LjZ2NC4ySDcuMlY5LjZoNC4yem0wIDkuNlYxNUg3LjJ2NC4yaDQuMnptNS40LTkuNnY0LjJoLTQuMlY5LjZoNC4yem0wIDkuNlYxNWgtNC4ydjQuMmg0LjJ6TTcuMiA1LjRWMi43YzAtMS4xNi45NC0yLjEgMi4xLTIuMWg1LjRjMS4xNiAwIDIuMS45NCAyLjEgMi4xdjIuN2g2LjNhLjkuOSAwIDAgMSAuOS45djEzLjhhMy4zIDMuMyAwIDAgMS0zLjMgMy4zSDMuM0EzLjMgMy4zIDAgMCAxIDAgMjAuMVY2LjNhLjkuOSAwIDAgMSAuOS0uOWg2LjN6TTkgMi43djIuN2g2VjIuN2EuMy4zIDAgMCAwLS4zLS4zSDkuM2EuMy4zIDAgMCAwLS4zLjN6TTEuOCAyMC4xYTEuNSAxLjUgMCAwIDAgMS41IDEuNWgxNy40YTEuNSAxLjUgMCAwIDAgMS41LTEuNVY3LjJIMS44djEyLjl6Ii8+PC9zdmc+&style=for-the-badge&color=11a2f8" alt="APK 安装程序 - WinUI 3"></a> <a href="https://www.microsoft.com/store/apps/9N3HJLJP8V15" title="APK 安装程序 - WPF"><img class="badge" src="https://img.shields.io/badge/download-下载-magenta.svg?label=APK 安装程序 - WPF&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2ZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TWljcm9zb2Z0IFN0b3JlPC90aXRsZT48cGF0aCBkPSJNMTEuNCA5LjZ2NC4ySDcuMlY5LjZoNC4yem0wIDkuNlYxNUg3LjJ2NC4yaDQuMnptNS40LTkuNnY0LjJoLTQuMlY5LjZoNC4yem0wIDkuNlYxNWgtNC4ydjQuMmg0LjJ6TTcuMiA1LjRWMi43YzAtMS4xNi45NC0yLjEgMi4xLTIuMWg1LjRjMS4xNiAwIDIuMS45NCAyLjEgMi4xdjIuN2g2LjNhLjkuOSAwIDAgMSAuOS45djEzLjhhMy4zIDMuMyAwIDAgMS0zLjMgMy4zSDMuM0EzLjMgMy4zIDAgMCAxIDAgMjAuMVY2LjNhLjkuOSAwIDAgMSAuOS0uOWg2LjN6TTkgMi43djIuN2g2VjIuN2EuMy4zIDAgMCAwLS4zLS4zSDkuM2EuMy4zIDAgMCAwLS4zLjN6TTEuOCAyMC4xYTEuNSAxLjUgMCAwIDAgMS41IDEuNWgxNy40YTEuNSAxLjUgMCAwIDAgMS41LTEuNVY3LjJIMS44djEyLjl6Ii8+PC9zdmc+&style=for-the-badge&color=11a2f8" alt="APK 安装程序 - WPF"></a></p><h3 id="如何安装应用"><a href="#如何安装应用" class="headerlink" title="如何安装应用"></a>如何安装应用</h3><h4 id="最低需求"><a href="#最低需求" class="headerlink" title="最低需求"></a>最低需求</h4><ul><li>Windows 10 Build 18362及以上</li><li>设备需支持ARM64&#x2F;x86&#x2F;x64</li><li>至少400MB的空余储存空间(用于储存安装包与安装应用)</li></ul><h4 id="使用应用安装脚本安装应用"><a href="#使用应用安装脚本安装应用" class="headerlink" title="使用应用安装脚本安装应用"></a>使用应用安装脚本安装应用</h4><style>  img.badge {    margin-bottom: 0 !important;    display: inline;  }</style><span id="more"></span><ul><li>下载并解压最新的<a href="https://github.com/Paving-Base/APK-Installer/releases/latest" title="下载安装包">安装包<code>(APKInstaller (Package)_x.x.x.0_Test.rar)</code></a></li><li>如果没有应用安装脚本，下载<a href="Install.ps1"><code>Install.ps1</code></a>到目标目录<br><img src="https://github.com/user-attachments/assets/6df30106-bb17-498c-b9bb-3e5b24cb9d0c" alt="Install.ps1" loading="lazy"></li><li>右击<code>Install.ps1</code>，选择“使用PowerShell运行”</li><li>应用安装脚本将会引导您完成此过程的剩余部分</li></ul><h4 id="使用应用安装程序安装应用"><a href="#使用应用安装程序安装应用" class="headerlink" title="使用应用安装程序安装应用"></a>使用应用安装程序安装应用</h4><ul><li>下载并解压最新的<a href="https://github.com/Paving-Base/APK-Installer/releases/latest" title="下载安装包">安装包<code>(APKInstaller (Package)_x.x.x.0_Test.rar)</code></a></li><li><a href="https://www.windowscentral.com/how-enable-windows-10-sideload-apps-outside-store">开启旁加载模式</a><ul><li>如果您想开发UWP应用，您可以开启<a href="https://docs.microsoft.com/zh-cn/windows/uwp/get-started/enable-your-device-for-development">开发人员模式</a>，<strong>对于大多数不需要做UWP开发的用户来说，开发人员模式是没有必要的</strong></li></ul></li><li>安装<code>Dependencies</code>文件夹下的适用于您的设备的所有依赖包<br><img src="https://github.com/user-attachments/assets/b07dbd77-cf7a-4e36-afc3-2b010438699a" alt="Dependencies" loading="lazy"></li><li>安装<code>*.cer</code>证书到<code>本地计算机</code>→<code>受信任的根证书颁发机构</code><ul><li>这项操作需要用到管理员权限，如果您安装证书时没有用到该权限，则可能是因为您将证书安装到了错误的位置或者您使用的是超级管理员账户<br><img src="https://github.com/user-attachments/assets/6eaf930d-efe4-44d9-bca0-f47d440b0b41" alt="安装证书" loading="lazy"><br><img src="https://github.com/user-attachments/assets/8fe96c0b-a733-4098-afe7-d22d03131280" alt="导入本地计算机" loading="lazy"><br><img src="https://github.com/user-attachments/assets/f083a0eb-1740-4130-9bcf-906f3df51f3a" alt="储存到受信任的根证书颁发机构" loading="lazy"></li></ul></li><li>双击<code>*.appxbundle</code>，单击安装，坐和放宽<br><img src="https://github.com/user-attachments/assets/c295ec21-828d-4349-a736-15338e6977df" alt="安装" loading="lazy"></li></ul><h4 id="更新应用"><a href="#更新应用" class="headerlink" title="更新应用"></a>更新应用</h4><ul><li>下载并解压最新的<a href="https://github.com/Paving-Base/APK-Installer/releases/latest" title="下载安装包">安装包<code>(APKInstaller (Package)_x.x.x.0_x86_x64_arm_arm64.appxbundle)</code></a></li><li>双击<code>*.appxbundle</code>，单击更新，坐和放宽<br><img src="https://github.com/user-attachments/assets/83dd8d6a-5558-4f5f-bb79-384c51bb0b8f" alt="更新" loading="lazy"></li></ul><h3 id="屏幕截图"><a href="#屏幕截图" class="headerlink" title="屏幕截图"></a>屏幕截图</h3><ul><li>WinUI3版<br><img src="https://github.com/user-attachments/assets/48b27291-2907-43c3-93a6-7a8a31e47d56" alt="安装" loading="lazy"></li><li>WPF版<br><img src="https://github.com/user-attachments/assets/f16090de-cb5d-4905-9aec-490977373061" alt="安装" loading="lazy"></li></ul><h3 id="使用到的模块"><a href="#使用到的模块" class="headerlink" title="使用到的模块"></a>使用到的模块</h3><ul><li><a href="https://github.com/microsoft/microsoft-ui-xaml" title="WinUI">WinUI</a></li><li><a href="https://github.com/canheo136/QuickLook.Plugin.ApkViewer" title="AAPTForNet">AAPTForNet</a></li><li><a href="https://github.com/yungd1plomat/AdvancedSharpAdbClient" title="Advanced Sharp Adb Client">Advanced Sharp Adb Client</a></li><li><a href="https://github.com/CommunityToolkit/WindowsCommunityToolkit" title="Windows Community Toolkit">Windows Community Toolkit</a></li></ul><blockquote><p><a href="https://www.52pojie.cn/thread-1571754-1-1.html">【开源】APK Installer —— 一个适用于 Windows 的 Android 应用安装程序</a> 作者 <a href="https://www.52pojie.cn/home.php?mod=space&uid=1092941">@wherewhere</a> 2022年1月5日 发表于 <a href="https://www.52pojie.cn/">吾爱破解</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2022/01/05/%E3%80%90%E5%BC%80%E6%BA%90%E3%80%91APK-Installer-%E2%80%94%E2%80%94-%E4%B8%80%E4%B8%AA%E9%80%82%E7%94%A8%E4%BA%8E-Windows-%E7%9A%84-Android-%E5%BA%94%E7%94%A8%E5%AE%89%E8%A3%85%E7%A8%8B%E5%BA%8F/</id><link href="https://wherewhere.github.io/2022/01/05/%E3%80%90%E5%BC%80%E6%BA%90%E3%80%91APK-Installer-%E2%80%94%E2%80%94-%E4%B8%80%E4%B8%AA%E9%80%82%E7%94%A8%E4%BA%8E-Windows-%E7%9A%84-Android-%E5%BA%94%E7%94%A8%E5%AE%89%E8%A3%85%E7%A8%8B%E5%BA%8F/"/><published>2022-01-05T06:50:00.000Z</published><summary><![CDATA[<img alt="APK Installer LOGO" src="https://github.com/user-attachments/assets/5ebcccb0-c607-41d3-8ffc-8481cfe3dba2" width="200px" style="display: inline;" />

<h2 id="APK-Installer"><a href="#APK-Installer" class="headerlink" title="APK Installer"></a>APK Installer</h2><p>一个适用于 Windows 的 Android 应用安装程序</p>
<p><a href="https://crowdin.com/project/APKInstaller"><img class="badge" src="https://badges.crowdin.net/APKInstaller/localized.svg" alt="Crowdin"></a> <a href="https://crowdin.com/project/APK-Installer-Classic"><img class="badge" src="https://badges.crowdin.net/APK-Installer-Classic/localized.svg" alt="Crowdin"></a></p>
<h3 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h3><ul>
<li>本应用已上架应用商店，请认准作者为 wherewhere，请不要使用来历不明的版本，如果因为使用不明版本而出现的故障请自行解决。</li>
<li>本应用分为 <a href="https://github.com/Paving-Base/APK-Installer">WinUI3版</a> 和 <a href="https://github.com/Paving-Base/APK-Installer-Classic">WPF版</a>，请根据需要选取</li>
</ul>
<h3 id="下载链接"><a href="#下载链接" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://www.microsoft.com/store/apps/9P2JFQ43FPPG" title="APK 安装程序 - WinUI 3"><img class="badge" src="https://img.shields.io/badge/download-下载-magenta.svg?label=APK 安装程序 - WinUI 3&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2ZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TWljcm9zb2Z0IFN0b3JlPC90aXRsZT48cGF0aCBkPSJNMTEuNCA5LjZ2NC4ySDcuMlY5LjZoNC4yem0wIDkuNlYxNUg3LjJ2NC4yaDQuMnptNS40LTkuNnY0LjJoLTQuMlY5LjZoNC4yem0wIDkuNlYxNWgtNC4ydjQuMmg0LjJ6TTcuMiA1LjRWMi43YzAtMS4xNi45NC0yLjEgMi4xLTIuMWg1LjRjMS4xNiAwIDIuMS45NCAyLjEgMi4xdjIuN2g2LjNhLjkuOSAwIDAgMSAuOS45djEzLjhhMy4zIDMuMyAwIDAgMS0zLjMgMy4zSDMuM0EzLjMgMy4zIDAgMCAxIDAgMjAuMVY2LjNhLjkuOSAwIDAgMSAuOS0uOWg2LjN6TTkgMi43djIuN2g2VjIuN2EuMy4zIDAgMCAwLS4zLS4zSDkuM2EuMy4zIDAgMCAwLS4zLjN6TTEuOCAyMC4xYTEuNSAxLjUgMCAwIDAgMS41IDEuNWgxNy40YTEuNSAxLjUgMCAwIDAgMS41LTEuNVY3LjJIMS44djEyLjl6Ii8+PC9zdmc+&style=for-the-badge&color=11a2f8" alt="APK 安装程序 - WinUI 3"></a> <a href="https://www.microsoft.com/store/apps/9N3HJLJP8V15" title="APK 安装程序 - WPF"><img class="badge" src="https://img.shields.io/badge/download-下载-magenta.svg?label=APK 安装程序 - WPF&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2ZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TWljcm9zb2Z0IFN0b3JlPC90aXRsZT48cGF0aCBkPSJNMTEuNCA5LjZ2NC4ySDcuMlY5LjZoNC4yem0wIDkuNlYxNUg3LjJ2NC4yaDQuMnptNS40LTkuNnY0LjJoLTQuMlY5LjZoNC4yem0wIDkuNlYxNWgtNC4ydjQuMmg0LjJ6TTcuMiA1LjRWMi43YzAtMS4xNi45NC0yLjEgMi4xLTIuMWg1LjRjMS4xNiAwIDIuMS45NCAyLjEgMi4xdjIuN2g2LjNhLjkuOSAwIDAgMSAuOS45djEzLjhhMy4zIDMuMyAwIDAgMS0zLjMgMy4zSDMuM0EzLjMgMy4zIDAgMCAxIDAgMjAuMVY2LjNhLjkuOSAwIDAgMSAuOS0uOWg2LjN6TTkgMi43djIuN2g2VjIuN2EuMy4zIDAgMCAwLS4zLS4zSDkuM2EuMy4zIDAgMCAwLS4zLjN6TTEuOCAyMC4xYTEuNSAxLjUgMCAwIDAgMS41IDEuNWgxNy40YTEuNSAxLjUgMCAwIDAgMS41LTEuNVY3LjJIMS44djEyLjl6Ii8+PC9zdmc+&style=for-the-badge&color=11a2f8" alt="APK 安装程序 - WPF"></a></p>

<h3 id="如何安装应用"><a href="#如何安装应用" class="headerlink" title="如何安装应用"></a>如何安装应用</h3><h4 id="最低需求"><a href="#最低需求" class="headerlink" title="最低需求"></a>最低需求</h4><ul>
<li>Windows 10 Build 18362及以上</li>
<li>设备需支持ARM64&#x2F;x86&#x2F;x64</li>
<li>至少400MB的空余储存空间(用于储存安装包与安装应用)</li>
</ul>
<h4 id="使用应用安装脚本安装应用"><a href="#使用应用安装脚本安装应用" class="headerlink" title="使用应用安装脚本安装应用"></a>使用应用安装脚本安装应用</h4><style>
  img.badge {
    margin-bottom: 0 !important;
    display: inline;
  }
</style>]]></summary><title>【开源】APK Installer —— 一个适用于 Windows 的 Android 应用安装程序</title><updated>2022-02-13T06:43:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term=".NET" scheme="https://wherewhere.github.io/tags/NET/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><category term="UWP" scheme="https://wherewhere.github.io/tags/UWP/"/><category term="C#" scheme="https://wherewhere.github.io/tags/C/"/><content><![CDATA[<p><img src="https://github.com/user-attachments/assets/85655d62-1f07-4889-9191-143ce0be5971" alt="【UWP】开发小技巧――判断类是否存在" loading="lazy"></p><p><a href="https://www.coolapk.com/t/UWP">#UWP#</a> <a href="https://www.coolapk.com/t/%E7%88%B1%E7%BC%96%E7%A8%8B">#爱编程#</a> <a href="https://www.coolapk.com/t/%E7%94%B5%E8%84%91%E7%8E%A9%E5%AE%B6">#电脑玩家#</a></p><p>不要问我这个需求是怎么冒出来的，自己没事找事要支持 10240，结果发现啥都不支持，真是太糟糕了。</p><p>一般而言，这类需求都是想办法通过类名新建对象，一开始我也是这么想的，不过网上那些教程都是单纯 .NET 的，不支持 UWP (也可能是我太菜了，不会用)，所以直接白嫖是不可能了。。。</p><p><img src="https://github.com/user-attachments/assets/e522a212-019a-48f3-a67c-a5552390a0de" alt="示例" loading="lazy"></p><p>不过判断是否存在不需要这么复杂，C# 有专门的 <code>GetType</code> 方法来找类，所以事情就简单了，直接 <code>Type.GetType(&quot;类名&quot;)</code> 就行了，不过真的是这样吗？<span id="more"></span></p><p><img src="https://github.com/user-attachments/assets/4b294780-7097-44cc-8df4-aff24c3c66ce" alt="Type.GetType()" loading="lazy"></p><p>经过调试，并没有成功找到这个类型，不过不止 <code>Type</code> 有 <code>GetType</code> ，在 C# 中 <code>Assembly</code> 也有 <code>GetType</code> ，我直接找到要找的类的程序集再找类应该就能找到了吧。</p><p><img src="https://github.com/user-attachments/assets/3be76a6a-550b-46d3-9e52-1d9ce08559cc" alt="Assembly.GetType()" loading="lazy"></p><p>很明显，这个方案才是对的。现在知道了方法，就搓个函数出来吧。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">IsTypePresent</span>(<span class="params"><span class="built_in">string</span> AssemblyName, <span class="built_in">string</span> TypeName</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">try</span></span><br><span class="line">    &#123;</span><br><span class="line">        Assembly asmb = Assembly.Load(<span class="keyword">new</span> AssemblyName(AssemblyName));</span><br><span class="line">        Type supType = asmb.GetType(<span class="string">$&quot;<span class="subst">&#123;AssemblyName&#125;</span>.<span class="subst">&#123;TypeName&#125;</span>&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> supType != <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">catch</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>额，好像不太对，10240 不支持和类在不在程序集里好像没关系吧。。。</p><p><img src="https://github.com/user-attachments/assets/47a8f34f-d7b4-4596-91e9-84aa521d7d1d" alt="调试" loading="lazy"></p><p>我们似乎还是要新建一个对象来判断它到底是不是支持，于是函数就变成这样了。。。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">IsTypePresent</span>(<span class="params"><span class="built_in">string</span> AssemblyName, <span class="built_in">string</span> TypeName</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">try</span></span><br><span class="line">    &#123;</span><br><span class="line">        Assembly asmb = Assembly.Load(<span class="keyword">new</span> AssemblyName(AssemblyName));</span><br><span class="line">        Type supType = asmb.GetType(<span class="string">$&quot;<span class="subst">&#123;AssemblyName&#125;</span>.<span class="subst">&#123;TypeName&#125;</span>&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span> (supType != <span class="literal">null</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123; Activator.CreateInstance(supType); &#125;</span><br><span class="line">            <span class="keyword">catch</span> (MissingMethodException) &#123; &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> supType != <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">catch</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>终于正常了。。。</p><p>判断 API 是否存在就不要用这个方法了，官方有 <code>ApiInformation</code>，肯定比这个好用</p><p><img src="https://github.com/user-attachments/assets/dcdcfd17-2c17-4d27-8857-8ec2ccd7075b" alt="ApiInformation" loading="lazy"></p><p>哦对了，记得把函数放在要用的项目里，不要问我怎么知道的。。。 </p><blockquote><p><a href="https://www.coolapk.com/feed/32229068?shareKey=ZTc3NmI0NTc1OGI4NjYzM2UxMTI">【UWP】开发小技巧――判断类是否存在</a> 作者 <a href="https://www.coolapk.com/u/wherewhere">@wherewhere</a> 2021年12月19日 发表于 <a href="https://www.coolapk.com/" title="Coolapk">酷安</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2021/12/19/%E3%80%90UWP%E3%80%91%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7%E2%80%95%E2%80%95%E5%88%A4%E6%96%AD%E7%B1%BB%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/</id><link href="https://wherewhere.github.io/2021/12/19/%E3%80%90UWP%E3%80%91%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7%E2%80%95%E2%80%95%E5%88%A4%E6%96%AD%E7%B1%BB%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/"/><published>2021-12-19T06:58:37.000Z</published><summary><![CDATA[<p><img src="https://github.com/user-attachments/assets/85655d62-1f07-4889-9191-143ce0be5971" alt="【UWP】开发小技巧――判断类是否存在" loading="lazy"></p>
<p><a href="https://www.coolapk.com/t/UWP">#UWP#</a> <a href="https://www.coolapk.com/t/%E7%88%B1%E7%BC%96%E7%A8%8B">#爱编程#</a> <a href="https://www.coolapk.com/t/%E7%94%B5%E8%84%91%E7%8E%A9%E5%AE%B6">#电脑玩家#</a></p>
<p>不要问我这个需求是怎么冒出来的，自己没事找事要支持 10240，结果发现啥都不支持，真是太糟糕了。</p>
<p>一般而言，这类需求都是想办法通过类名新建对象，一开始我也是这么想的，不过网上那些教程都是单纯 .NET 的，不支持 UWP (也可能是我太菜了，不会用)，所以直接白嫖是不可能了。。。</p>
<p><img src="https://github.com/user-attachments/assets/e522a212-019a-48f3-a67c-a5552390a0de" alt="示例" loading="lazy"></p>
<p>不过判断是否存在不需要这么复杂，C# 有专门的 <code>GetType</code> 方法来找类，所以事情就简单了，直接 <code>Type.GetType(&quot;类名&quot;)</code> 就行了，不过真的是这样吗？]]></summary><title>【UWP】开发小技巧――判断类是否存在</title><updated>2021-12-19T06:58:37.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="开发" scheme="https://wherewhere.github.io/categories/%E5%BC%80%E5%8F%91/"/><category term="开发" scheme="https://wherewhere.github.io/tags/%E5%BC%80%E5%8F%91/"/><content><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content><id>https://wherewhere.github.io/2021/03/13/hello-world/</id><link href="https://wherewhere.github.io/2021/03/13/hello-world/"/><published>2021-03-13T11:24:57.000Z</published><summary><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for]]></summary><title>Hello World</title><updated>2021-03-13T11:24:57.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="材质包" scheme="https://wherewhere.github.io/categories/%E6%9D%90%E8%B4%A8%E5%8C%85/"/><category term="MC" scheme="https://wherewhere.github.io/tags/MC/"/><category term="BE" scheme="https://wherewhere.github.io/tags/BE/"/><category term="游戏" scheme="https://wherewhere.github.io/tags/%E6%B8%B8%E6%88%8F/"/><category term="材质包" scheme="https://wherewhere.github.io/tags/%E6%9D%90%E8%B4%A8%E5%8C%85/"/><category term="红石" scheme="https://wherewhere.github.io/tags/%E7%BA%A2%E7%9F%B3/"/><content><![CDATA[<h2 id="材质简介"><a href="#材质简介" class="headerlink" title="材质简介"></a>材质简介</h2><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV19v411W7eo"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/367afe4dc94f54f71b0073dff5d8338d2bd36ac1.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">01:24</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】预告-Bare Bones塑料材质红石辅助显示预览</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1151</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p>由于基岩版没有红石百搭包，于是就自己做了一套红石显示，基于 BareBones 材质包，借鉴了 XeKr 红石显示。</p><p>材质自用，按照个人喜好设计，如果有建议欢迎提出，但不一定接受</p><p>BareBones 材质简介：<a href="https://www.minebbs.com/threads/bare-bones-texture-pack.4371">Bare Bones Texture Pack 官方都在用的朴素真理材质包</a></p><h2 id="屏幕截图"><a href="#屏幕截图" class="headerlink" title="屏幕截图"></a>屏幕截图</h2><p><img src="https://github.com/user-attachments/assets/40139ea2-d666-4b12-a1e8-c4a05fbee255" alt="Screenshot_20210204-201635_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><p><img src="https://github.com/user-attachments/assets/65f2abb0-add6-475e-bdef-6d2975d56d16" alt="Screenshot_20210204-201715_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><style>  :root {    --bilibili-accent-color: #fb7299;    --bilibili-card-border-color: #e7e7e7;    --bilibili-card-background-color: white;    --bilibili-card-cover-color: #c9c9c9;    --bilibili-card-cover-background-color: #f4f4f4;    --bilibili-card-title-color: #505050;    --bilibili-card-subtitle-color: white;    --bilibili-card-subtitle-background-color: rgba(0, 0, 0, .4);    --bilibili-card-content-color: #999;  }  @media (prefers-color-scheme: dark) {    :root {        --bilibili-accent-color: #eb7093;        --bilibili-card-border-color: #2a2a2a;        --bilibili-card-background-color: #141414;        --bilibili-card-cover-color: #464646;        --bilibili-card-cover-background-color: #1f1f1f;        --bilibili-card-title-color: #b5b5b5;        --bilibili-card-content-color: #727272;    }  }  .video-holder a {    border-bottom: none;  }</style><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-tag-bilibili-card/components/bilibili-card/bilibili-card.css"><span id="more"></span><p><img src="https://github.com/user-attachments/assets/a998772e-c00a-43aa-ba97-b6f1c62e4fb1" alt="Screenshot_20210204-201739_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><p><img src="https://github.com/user-attachments/assets/ad7c4520-da97-4f49-b236-b02fa11b91b7" alt="Screenshot_20210204-201620_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><p><img src="https://github.com/user-attachments/assets/b921c6df-5582-4ccc-9063-2ffdab3227d3" alt="Screenshot_20210204-201706_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><p><img src="https://github.com/user-attachments/assets/a78e5875-806c-4ac8-ada7-80e9078f28cc" alt="Screenshot_20210204-201820_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><h2 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h2><h3 id="2021-01-24"><a href="#2021-01-24" class="headerlink" title="2021-01-24"></a>2021-01-24</h3><h4 id="v0-0-1-更新日志"><a href="#v0-0-1-更新日志" class="headerlink" title="v0.0.1 更新日志"></a>v0.0.1 更新日志</h4><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1Df4y1k7mz"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/11ca3dcf44e46a423dcbc3e78baa55c006db5fab.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">05:34</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】BareBones红石显示v0.0.1发布了！</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">4240</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><ol><li>第一个版本发布</li><li>基于BareBones 1.1.1 适用于Minecraft BE 1.16</li></ol><h3 id="2021-01-30"><a href="#2021-01-30" class="headerlink" title="2021-01-30"></a>2021-01-30</h3><h4 id="v0-0-2-更新日志"><a href="#v0-0-2-更新日志" class="headerlink" title="v0.0.2 更新日志"></a>v0.0.2 更新日志</h4><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1ft4y1q7RF"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i1.hdslb.com/bfs/archive/13ba453dbe449cae39dff8878afea0d0026912b1.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">04:51</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】BareBones红石显示v0.0.2发布了！</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">5336</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">5</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><ol><li>更新版本号至v0.0.2</li><li>炉子侧面现在可以动态显示状态了</li><li>重生锚顶部现在可以显示能量等级了</li><li>普通箱子现在可以显示方向了</li><li>末地传送门框架现在可以显示方向了</li><li>修复了观察者侧面高低不平的Bug</li><li>现在可以分辨南瓜和西瓜梗了</li><li>炼药锅现在可以分辨是否承装岩浆了</li><li>教育版方块和特殊方块现在可以正常显示名称了</li><li>数据更新方块现在可以作为绿幕和蓝幕使用</li></ol><h3 id="2021-03-19​"><a href="#2021-03-19​" class="headerlink" title="2021-03-19​"></a>2021-03-19​</h3><h4 id="v0-0-3-更新日志​"><a href="#v0-0-3-更新日志​" class="headerlink" title="v0.0.3 更新日志​"></a>v0.0.3 更新日志​</h4><ol><li>更新版本号至v0.0.3</li><li>优化了线的贴图</li><li>更正了炉子动态的速度</li><li>为炉子背面贴图添加动画</li><li>修复了重生锚顶部贴图错误</li><li>现在可以显示铁傀儡破损了</li></ol><h3 id="2022-01-21​"><a href="#2022-01-21​" class="headerlink" title="2022-01-21​"></a>2022-01-21​</h3><h4 id="v0-0-4-更新日志​"><a href="#v0-0-4-更新日志​" class="headerlink" title="v0.0.4 更新日志​"></a>v0.0.4 更新日志​</h4><ol><li>更新版本号至v0.0.4</li><li>适配新版 BareBones 样式</li><li>岩浆箭头现在不再不流畅了</li><li>修复了岩浆坩埚的材质方向</li><li>添加 missing_tile 方块</li></ol><h3 id="2023-06-19​"><a href="#2023-06-19​" class="headerlink" title="2023-06-19​"></a>2023-06-19​</h3><h4 id="v0-0-5-更新日志​"><a href="#v0-0-5-更新日志​" class="headerlink" title="v0.0.5 更新日志​"></a>v0.0.5 更新日志​</h4><ol><li>更新版本号至v0.0.5</li><li>更新虫蚀方块材质</li></ol><h3 id="2025-04-19​"><a href="#2025-04-19​" class="headerlink" title="2025-04-19​"></a>2025-04-19​</h3><h4 id="v0-1-6-更新日志​"><a href="#v0-1-6-更新日志​" class="headerlink" title="v0.1.6 更新日志​"></a>v0.1.6 更新日志​</h4><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1TL5xzuEx5"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/aabc4ee7fec0ab9944d470d5b30afb7db8d14113.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">10:05</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】BareBones 红石显示 v0.1.6 发布了！</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1085</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><ol><li>更新版本号至v0.1.6</li><li>适配新版 BareBones 样式</li><li>删除铁傀儡破损</li><li>更新教育版与基岩版特供方块贴图</li><li>更新语言文本</li><li>现在虫蚀方块使用蠹虫贴图表示</li><li>添加校频/幽匿感测体、幽匿尖啸体、幽匿催发体</li><li>添加铜系列方块</li><li>添加一键合成和交易解锁</li><li>添加合成器</li><li>添加雕纹书架</li></ol><h3 id="2025-06-26​"><a href="#2025-06-26​" class="headerlink" title="2025-06-26​"></a>2025-06-26​</h3><h4 id="v0-1-7-更新日志​"><a href="#v0-1-7-更新日志​" class="headerlink" title="v0.1.7 更新日志​"></a>v0.1.7 更新日志​</h4><ol><li>更新版本号至v0.1.7</li><li>适配新版 BareBones 样式</li><li>更改蜂巢与蜂箱底部样式</li><li>更改一些贴图的命名方式</li><li>修复旧版本虫蚀方块贴图</li></ol><h3 id="2026-02-25​"><a href="#2026-02-25​" class="headerlink" title="2026-02-25​"></a>2026-02-25​</h3><h4 id="v0-1-8-更新日志​"><a href="#v0-1-8-更新日志​" class="headerlink" title="v0.1.8 更新日志​"></a>v0.1.8 更新日志​</h4><ol><li>更新版本号至v0.1.8</li><li>适配新版 BareBones 样式</li><li>适配向上的漏斗</li><li>更改熏炉火焰位置</li><li>添加英文文本和国际化</li></ol><h2 id="下载链接"><a href="#下载链接" class="headerlink" title="下载链接"></a>下载链接</h2><ul><li><a href="https://github.com/wherewhere/RedStone-Assistive/releases">Github</a></li><li><a href="https://www.androidfilehost.com/?w=files&amp;flid=322278">Android File Host</a></li><li><a href="https://pan.baidu.com/s/12dZHtQmn216qPxEILeZZ6Q?pwd=bbhx">百度网盘</a> 密码：<code>bbhx</code></li></ul><blockquote><p><a href="https://www.minebbs.com/resources/barebones.2116">BareBones红石显示材质包</a> 作者 <a href="https://www.minebbs.com/members/wherewhere.5555">@wherewhere</a> 2021年2月4日 发表于 <a href="https://www.minebbs.com/" title="minebbs">MineBBS</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2021/02/04/%E3%80%90%E6%9D%90%E8%B4%A8%E3%80%91BareBones%E7%BA%A2%E7%9F%B3%E6%98%BE%E7%A4%BA%E6%9D%90%E8%B4%A8%E5%8C%85/</id><link href="https://wherewhere.github.io/2021/02/04/%E3%80%90%E6%9D%90%E8%B4%A8%E3%80%91BareBones%E7%BA%A2%E7%9F%B3%E6%98%BE%E7%A4%BA%E6%9D%90%E8%B4%A8%E5%8C%85/"/><published>2021-02-04T12:53:59.000Z</published><summary><![CDATA[<h2 id="材质简介"><a href="#材质简介" class="headerlink" title="材质简介"></a>材质简介</h2><p><bilibili-card vid="BV19v411W7eo" type="video" title="【MCBE】预告-Bare Bones塑料材质红石辅助显示预览" author="where-where" cover="http://i2.hdslb.com/bfs/archive/367afe4dc94f54f71b0073dff5d8338d2bd36ac1.jpg" duration="01:24" views="1151" danmakus="0" comments="6" favorites="5" coins="11" likes="27"></bilibili-card></p>
<p>由于基岩版没有红石百搭包，于是就自己做了一套红石显示，基于 BareBones 材质包，借鉴了 XeKr 红石显示。</p>
<p>材质自用，按照个人喜好设计，如果有建议欢迎提出，但不一定接受</p>
<p>BareBones 材质简介：<a href="https://www.minebbs.com/threads/bare-bones-texture-pack.4371">Bare Bones Texture Pack 官方都在用的朴素真理材质包</a></p>
<h2 id="屏幕截图"><a href="#屏幕截图" class="headerlink" title="屏幕截图"></a>屏幕截图</h2><p><img src="https://github.com/user-attachments/assets/40139ea2-d666-4b12-a1e8-c4a05fbee255" alt="Screenshot_20210204-201635_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p>
<p><img src="https://github.com/user-attachments/assets/65f2abb0-add6-475e-bdef-6d2975d56d16" alt="Screenshot_20210204-201715_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p>
<style>
  :root {
    --bilibili-accent-color: #fb7299;
    --bilibili-card-border-color: #e7e7e7;
    --bilibili-card-background-color: white;
    --bilibili-card-cover-color: #c9c9c9;
    --bilibili-card-cover-background-color: #f4f4f4;
    --bilibili-card-title-color: #505050;
    --bilibili-card-subtitle-color: white;
    --bilibili-card-subtitle-background-color: rgba(0, 0, 0, .4);
    --bilibili-card-content-color: #999;
  }

  @media (prefers-color-scheme: dark) {
    :root {
        --bilibili-accent-color: #eb7093;
        --bilibili-card-border-color: #2a2a2a;
        --bilibili-card-background-color: #141414;
        --bilibili-card-cover-color: #464646;
        --bilibili-card-cover-background-color: #1f1f1f;
        --bilibili-card-title-color: #b5b5b5;
        --bilibili-card-content-color: #727272;
    }
  }

  .video-holder a {
    border-bottom: none;
  }
</style>
<script src="https://cdn.jsdelivr.net/npm/hexo-tag-bilibili-card/components/bilibili-card/bilibili-card.js" data-pjax async></script>]]></summary><title>【材质】BareBones 红石显示材质包</title><updated>2026-02-25T07:26:22.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="游戏" scheme="https://wherewhere.github.io/categories/%E6%B8%B8%E6%88%8F/"/><category term="MC" scheme="https://wherewhere.github.io/tags/MC/"/><category term="BE" scheme="https://wherewhere.github.io/tags/BE/"/><category term="游戏" scheme="https://wherewhere.github.io/tags/%E6%B8%B8%E6%88%8F/"/><category term="JE" scheme="https://wherewhere.github.io/tags/JE/"/><category term="日常" scheme="https://wherewhere.github.io/tags/%E6%97%A5%E5%B8%B8/"/><content><![CDATA[<p><img src="https://github.com/user-attachments/assets/faae7e04-3df1-4e54-9f2f-c5f1ca03fd52" alt="回顾我在麦块里度过的时光" loading="lazy"></p><p><a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a> <a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a> <a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%842020%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93">#我的2020年度总结#</a></p><p>一晃一年就快要过去了，这一年我正式接触了麦块，知道了各种各样神奇的东西，也遇到了各种各样的人，所以我想在这里分享我这一年的历程，也说一说我是应何而接触的麦块</p><p><img src="https://github.com/user-attachments/assets/e5248024-0827-419c-9a5a-0cfea64533be" alt="untitled10" loading="lazy"></p><p>在我初中的时候，我第一次听说了麦块，那时的麦块，移动端应该还在Alpha阶段，看到别人在那建宏伟的建筑，觉得特别无聊，也就没去接触</p><p><img src="https://github.com/user-attachments/assets/8bfee4f2-f0a9-4b78-88f2-64caee777e0b" alt="Screenshot_20200606-115442" loading="lazy"></p><figcaption class="figure">回顾旧版</figcaption><p>一晃就到了2018年，我在B站上看到了恩氟烷瑞大佬的珍珠炮，指哪打哪的震撼感使我第一次想认真的玩一玩麦块，不过可惜的是，我最终只造出了窜天猴，还被麻将给修复了。。。(<a href="https://www.coolapk.com/feed/10850884?shareKey=MzY5MjhmODFjM2I2NWZkZjUxNjA">查看链接</a></p><style>  figcaption.figure {    color: #999;    font-size: 0.875em;    font-weight: bold;    line-height: 1;    margin: 5px auto 15px;    text-align: center;  }  p+figcaption.figure,  p+div.code-line+.figure {    margin: -15px auto 15px;  }  @media (max-width: 567px) {    .post-body p+figcaption.figure {      margin: -5px auto 15px;    }  }</style><span id="more"></span><style>  :root {    --bilibili-accent-color: #fb7299;    --bilibili-card-border-color: #e7e7e7;    --bilibili-card-background-color: white;    --bilibili-card-cover-color: #c9c9c9;    --bilibili-card-cover-background-color: #f4f4f4;    --bilibili-card-title-color: #505050;    --bilibili-card-subtitle-color: white;    --bilibili-card-subtitle-background-color: rgba(0, 0, 0, .4);    --bilibili-card-content-color: #999;  }  @media (prefers-color-scheme: dark) {    :root {        --bilibili-accent-color: #eb7093;        --bilibili-card-border-color: #2a2a2a;        --bilibili-card-background-color: #141414;        --bilibili-card-cover-color: #464646;        --bilibili-card-cover-background-color: #1f1f1f;        --bilibili-card-title-color: #b5b5b5;        --bilibili-card-content-color: #727272;    }  }  .video-holder a {    border-bottom: none;  }</style><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-tag-bilibili-card/components/bilibili-card/bilibili-card.css"><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1yb411r7EJ"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/2cc7624dbe5dcea702125109a5256da5c4eecfd9.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">03:35</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】上百个TNT爆炸会怎样</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">101</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">2</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p><img src="https://github.com/user-attachments/assets/ffe0b977-6d34-4b1b-8152-d4faeb7c357f" alt="Screenshot_20190321-180728" loading="lazy"></p><figcaption class="figure">坏了的大炮</figcaption><p>不过红石炮没了也没事，这时一个叫TIS的服务器横空出世，TIS是啥我就不多说了，但是他们才成立100天，但100天的宣传视频简直就和工业革命似的，量产一切的思想就在我的心中扎根了</p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1Nb41187HS"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/44817233aaf5d977978dd5df73f00ffafb38d78d.png&quot;);"></div><div class="video-subtitle"><div class="video-duration">12:33</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">一群肝帝在MC里生存了6695天后会是什么样子——TIS服务器100天游览  TIS Trinity Union 100-day Server Tour</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">449.1万</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">2.5万</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">TIS_TrinityUnion</span></div></div></div></a></div></p><figcaption class="figure">我就是看着这个视频入坑生电的</figcaption><p>还有一个大佬叫做本正，因为在晚上想关灯看星星，结果看出了BE生态下的红石通信系统，但是由于过于玄奥，我当时根本不敢去想自己也去研究这方面，光是看完花里胡哨的视频就已经够呛了。。。</p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1m4411c7q8"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/36e5647529daa802ccafd6c6961263a55fb0cc06.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">27:16</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">历时一年！建造能互相收发短信的-自动化二进制通信设施（全自动编码解码寻址）</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">115.1万</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">7705</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">Dr_本正_</span></div></div></div></a></div></p><figcaption class="figure">本正大佬的通信系统</figcaption><p>于是，随着高考结束，我也开始了放飞自我，我开始真正去认真玩生存模式，尝试去量产一切，不过很可惜，我只造出了甘蔗/南瓜/西瓜/仙人掌/鸡蛋农场。。。</p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1i4411T7m9"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/3bf9a5769fef465bb048b1d6809121643ba3b4ba.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">13:41</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】高考结束了，浪啊！！！</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">128</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p>随着1.13更新，麦块出了一些Bug，总是卡在验证阶段，于是我弃坑了</p><p>2019年末，收到铺路群群友Santorsia的邀请，我加入了他的服务器，但是因为没啥兴趣也没上线过</p><p>到了12月31日，Santorsia在服里搞起了跨年活动，我上线看了看，也录了视频，但是总是感觉有些隔阂，于是我决定再次入坑麦块</p><p><img src="https://github.com/user-attachments/assets/e5ce3f68-048b-4834-810d-fdc2fb92a53f" alt="屏幕截图(585)" loading="lazy"></p><figcaption class="figure">2019年跨年活动</figcaption><p>然后，我就发现了刷物品的Bug。。。(<a href="https://www.coolapk.com/feed/16027620?shareKey=ZDFlZDI3Y2MxYmFiNjY1NzdiNWE">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1y7411a7iS"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i1.hdslb.com/bfs/archive/3c6a3301dc5b4c51daed4865195800a6632b9666.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">05:16</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】当你的背包同时处于掉落与不掉落的状态时</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">511</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><figcaption class="figure">一地的金苹果</figcaption><p>这次我造出了刷石机，学会了附魔，甚至打完了龙，可惜这个存档后来丢了，不然就能水点图片了。。。</p><p>于是我怀着忐忑的心情，在1月24日，正式加入了Santorsia's Server</p><p>我在服里看到了特别特别大的刷石机，这让我非常激动，以为进了一个生电大服，结果，绕了一圈才发现，这是唯一的生电设施了。。。</p><p>这一下子我就再也不紧张了，看到地狱基本处于未开发阶段，我决定，开始搞地狱交通！</p><p><img src="https://github.com/user-attachments/assets/a9cbb7cc-dffd-4ef8-a0bc-9212967e548f" alt="Screenshot_20200125-172205" loading="lazy"></p><figcaption class="figure">好吧，一开始的确是轨道交通。。。</figcaption><p>我在唯一的地狱交通站处建了家，以彰显地狱交通的方便，但是当时的我根本不知道地狱交通应该长啥，于是，随便开个门，然后进别人家后院了。。。</p><p><img src="https://github.com/user-attachments/assets/32216791-f81b-47b6-a072-c9b5883111d6" alt="Screenshot_20200125-005210" loading="lazy"></p><figcaption class="figure">我家入口(实际上是个车站</figcaption><p>随着交通的进展，我与成员的关系也更活络了，于是我打算考一个大一些但比较简单的生电项目，最终我选择了守卫者农场</p><p><img src="https://github.com/user-attachments/assets/b8f85e83-ec66-48ed-8d88-f7b365c30f33" alt="Screenshot_20200128-140700" loading="lazy"></p><figcaption class="figure">守卫者农场选址</figcaption><p>几乎所有成员都参与了，这使得我非常兴奋，也是我觉得最愉快的时刻了，于是我有了更大的计划</p><p>我想搞那个16联的史莱姆农场，还有全物品！</p><p>2月8日，Santorsia服举办了元宵节活动，在我的提议下服主决定用C4D画一张全家福，但是我的皮肤没法导出，于是我决定自己画一个</p><p><img src="https://github.com/user-attachments/assets/bb2af6fc-4f69-4856-a387-b7f6e72708d0" alt="Screenshot_20200208-224358" loading="lazy"></p><figcaption class="figure">元宵节</figcaption><p>说画就画，第二天，皮肤就绘制完成了</p><p><img src="https://github.com/user-attachments/assets/0f538643-f0d4-4487-883b-3a56fcd95759" alt="Screenshot_20200210-011522" loading="lazy"></p><figcaption class="figure">I am the caption of Federation StarShip...</figcaption><p>不过好景不长，2月12日，鱼塔改造工程开始，我们也成功获取了传送门方块，但是到了15日，服务器莫名其妙崩溃了，而且每隔一段时间就崩溃。于是我们就回档了，但没过多久，又崩溃了。这个现象预演欲烈，服主认为是传送门的问题，但我不同意，因为在获取传送门之前就已经崩溃过一次了，于是我提议回档到崩溃前一天，果不其然，过了一会又崩溃了，这使得大家的心情都很糟糕</p><p>但大家还是得玩啊，2月17日，史莱姆农场完工，随后，工业化大改造开始，地狱交通也开始向冰道迈进</p><p><img src="https://github.com/user-attachments/assets/625904be-b798-47e6-84e2-ab9f3f71389a" alt="Screenshot_20200229-195135" loading="lazy"></p><figcaption class="figure">高速火炉</figcaption><p>为此我仔细研究了Wiki，地狱交通统一规划也开始了</p><p><img src="https://github.com/user-attachments/assets/a064df26-c4a1-4b01-98dd-f77a79221f76" alt="Screenshot_20200305-232024" loading="lazy"></p><figcaption class="figure">交通绘图</figcaption><p>当然，我也没有忘记当年引我入坑的红石，我开始尝试制作一些红石设备，比如储存器</p><p><img src="https://github.com/user-attachments/assets/25f50c79-9206-4056-a555-a0531bfb6cd7" alt="Screenshot_20200308-144028" loading="lazy"></p><figcaption class="figure">显示器</figcaption><p>随后我再次学习了本正大佬的视频和存档，并成功仿制出了编码器和解码器，并自研了一个编码器</p><p><img src="https://github.com/user-attachments/assets/b74e9d2a-c7f3-45d4-af29-63a9ffe4d791" alt="Screenshot_20200412-133823" loading="lazy"></p><figcaption class="figure">土制版编码器</figcaption><p>甚至在生存里实装了一个</p><p><img src="https://github.com/user-attachments/assets/d651bd2d-4f5f-4dee-81ab-d0bcbf8c4d54" alt="Screenshot_20200312-230304" loading="lazy"></p><figcaption class="figure">数码管</figcaption><p>虽然一切似乎都按照计划进行，但实际上已经发生了分歧，随着刷物品的引入，大家开始逐渐失去了对工业化的心情，全都拿着活塞和箱子玩推推乐了。同时，这个服有个很糟糕的特性，我从来都没有看见过服主以生存模式进入服务器过，各管理员也是如此，也就是所说的滥权严重。这使得工业化变成了一个面子工程，毕竟大家都能通过其他方式去获取资源，也没人在乎有没有什么生电了。。。</p><p>于是，在一个破坏分子的骚扰下，服内乱了，服主开始乱来一气，把建筑拆了，把出生点搞到万米之外。</p><p>我是一脸懵逼，最终我的地狱交通在被未通知的情况下被全拆掉了。。。</p><p><img src="https://github.com/user-attachments/assets/cfb67279-a976-43c8-8098-9e87320865ab" alt="Screenshot_20200305-130727" loading="lazy"></p><figcaption class="figure">地狱交通遗照</figcaption><p>我很生气，知道生电在这个服里不会有什么发展了，于是我愤怒的离开了这个服</p><p>在此之前，受到 <a href="https://www.coolapk.com/u/%E5%8F%91%E5%91%86%E8%9B%8B%E7%B3%95">@发呆蛋糕</a> 的邀请，我前往了Cake Mania参观学习，这是一个2月份才建立的服务器，但是生电化比发展了3年的Santorsia's Server要高的多，我就像乡下人进城一样看着猪人塔，大型农场，虽然设施不多，但也能看出这是一个生电服</p><p><img src="https://github.com/user-attachments/assets/1c5fba60-3135-488f-af9f-dac9f4886cea" alt="Screenshot_20200313-122558" loading="lazy"></p><figcaption class="figure">Cake Mania !</figcaption><p>结果，我就从参观变成了常驻。。。(<a href="https://www.coolapk.com/feed/17452606?shareKey=ZGUzMzA0OWY0ZWU3NWZkZjZjNzM">查看链接</a></p><p>一上来我就打算把服里的地狱交通整改一下，群友们非常热情，几分钟下来(0,0)附近直接被挖空了，我是一脸懵逼</p><p><img src="https://github.com/user-attachments/assets/f710069a-5932-4e45-abb0-9c40de6934fb" alt="Screenshot_20200317-180519" loading="lazy"></p><figcaption class="figure">地狱大厅</figcaption><p>于是<br>3月19日，全物品计划开始，全物品样品完成(<a href="https://www.coolapk.com/feed/17452606?shareKey=ZjQ0MjlhNmFkNzc5NjY1NzdhOWY">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/f23f2b26-92bf-4d27-b9d5-c0d9e5f394ad" alt="Screenshot_20200320-123041" loading="lazy"></p><figcaption class="figure">五分之一物品</figcaption><p>3月22日，刷沙机完工(<a href="https://www.coolapk.com/feed/17529556?shareKey=MGJjNTg4MzZiOTFjNjY1NzdhOWY">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/7de122d3-ceb1-44e3-8d2f-843d9d1a8519" alt="Screenshot_20200323-232256" loading="lazy"></p><figcaption class="figure">刷沙机</figcaption><p>4月5日，全重力方块分类完工(<a href="https://www.coolapk.com/feed/17853988?shareKey=NzNkOGE0OTA2NTFiNjY1NzdhOWY">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/ed884665-6afa-46d1-8692-6a28af38e5e4" alt="Screenshot_20200406-000254" loading="lazy"></p><figcaption class="figure">全重力</figcaption><p>突然有一天，我脑子一抽，百来块钱就没了，我终于入坑JE了，随后受San邀请去参观了他的服务器</p><p>这回真的是进城了，一切量产，按盒算，看的我是一愣一愣的。单区块史莱姆农场效率高的吓人，守卫者农场收集不完的直接烧掉。。。</p><p><img src="https://github.com/user-attachments/assets/c97e699e-d6e1-48af-9ad3-9564e0e0c0a9" alt="2020-04-09_21.49.23" loading="lazy"></p><figcaption class="figure">他们正在建设的全物品</figcaption><p>很遗憾的是，我不小心把我的存档全搞没了，全没了。。。</p><p>最后只复原了一个存档，花了十分钟。。。</p><p><img src="https://github.com/user-attachments/assets/4a8e2f8d-a5a8-4fc9-b67f-28711fee7a87" alt="Screenshot_20200413-165951" loading="lazy"></p><figcaption class="figure">回忆啊。。。</figcaption><p>结果服主去上学了，忘记开服了，我们经历了很长时间的无服期。。。</p><p>于是<br>4月19日，烧服庆典</p><p><img src="https://github.com/user-attachments/assets/7c46fbb2-9052-43cd-b465-f996f17c89fc" alt="Screenshot_20200419-220849" loading="lazy"></p><figcaption class="figure">啦啦啦啦啦啦！</figcaption><p>4月20日，自研解码器成功，我终于有自己的作品了！(<a href="https://www.coolapk.com/feed/18256588?shareKey=YzdjMjBmNzdmMWExNWZkZjYzYzM">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1EK4y1k7KT"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/624daea6cb9a526341ecbb45c368a7c3d7801335.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">03:53</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】交作业-适用于本正设计的高速编码器的译码器</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">660</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><figcaption class="figure">这是我们审核群的群号/滑稽</figcaption><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1ka4y1x7ez"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/11595d1fbea8d80769edca838ed750d61c534a0c.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">04:34</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】适用于本正设计的传统编码与高速编码间的转换器(单向)</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">277</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p>5月1日，全物品设计开始了，我参(fu)考(ke)了TIS全物品废案，在这期间，自研的作品越来越多</p><p>潜隐盒卸货机：<a href="https://b23.tv/taa75w">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1bZ4y1T7cE"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/b6dab7fe333feb1013bb4964abb22d671e4314c4.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">10:15</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】全物品组件展示-潜隐盒卸货机</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1350</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p>不可堆叠分离：<a href="https://b23.tv/qH5pDf">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1Nk4y1m7RY"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/ada32d80600419644b887fab3a5ab04848f708d5.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">06:15</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】全物品基础教程-不可堆叠分离组件</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1382</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p>小天才过滤器：<a href="https://b23.tv/0RO5lf">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1q64y1F7NZ"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/57c4696ecf17613570384885adc887c8f6fa9d70.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">09:08</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】全物品组件教程-小天才过滤器(占位符过滤器)</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1547</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p>以及很多咕咕咕还没制作视频的作品</p><p><img src="https://github.com/user-attachments/assets/88a1481e-4050-440b-8b6c-07afb4e96cdc" alt="Screenshot_20200604-234649" loading="lazy"></p><figcaption class="figure">最早的设计</figcaption><p>5月15日，16联史莱姆农场正式开工了，非常幸运(不幸)这个种子的16联史莱姆区块是一片带沼泽的森林。。。区块挖(zha)下来，收获那叫一个多(<a href="https://www.coolapk.com/feed/18877974?shareKey=OTc1Y2NkNTU0ODk0NWZkZjY1YzY">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/a1a93072-c1b7-437a-8b0e-5ad46a49735c" alt="Screenshot_20200524-224559" loading="lazy"></p><figcaption class="figure">好大一个坑</figcaption><p>17天后，也就是6月2日，史莱姆农场终于完工了，这一个在前服就开始构思的工程终于实现了(<a href="https://www.coolapk.com/feed/19274782?shareKey=NmVmYzc5YWMyZWE4NWZkZjY1ZTY">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/feebc06b-a12c-40e5-b05d-137c3e8177c8" alt="Screenshot_20200602-213606" loading="lazy"></p><figcaption class="figure">非常壮观</figcaption><p>6月23日，全物品主体设计也完成了(<a href="https://www.coolapk.com/feed/19746146?shareKey=NDYxODg0ODBmOWY5NWZkZjY3OWY">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/0187675a-188d-4c77-8faa-43cef0972c1a" alt="Screenshot_20200623-001345" loading="lazy"></p><figcaption class="figure">全物品</figcaption><p>于是，在7月3日，我们决定开工全物品(为了不咕下去，我让Wade在天上先画个十字架，这样不开工也得开工了。。。(<a href="https://www.coolapk.com/feed/19971683?shareKey=MGQ5MDYxNmQ2MzZkNWZkZjY3ODM">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/6d9b7215-f680-4a01-9619-efac33f3854b" alt="Screenshot_20200721-013201_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><figcaption class="figure">全物品</figcaption><p>7月26日，全物品普通分类部分完工(<a href="https://www.coolapk.com/feed/20465919?shareKey=M2ZlOWI0YmVjYjc3NjY1Nzc5ZDI">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1RT4y1L7it"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i1.hdslb.com/bfs/archive/353f0921c61a52e6ebcd6d108da8d8f9bf6eebac.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">02:10</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】胜利啦！全物品的最后一个物品！</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">1301</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><figcaption class="figure">最后一个物品</figcaption><p>在此之间，我也参观了其他的服，体验到了按需分配的感觉，也遇到了一个非常奇葩的服，动不动就回档，以至于我只来得及造一个领事馆。。。</p><p><img src="https://github.com/user-attachments/assets/d4ee4843-47ee-4f48-9ae4-20dfe3847f89" alt="Screenshot_20200728-203640_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><figcaption class="figure">Cake Mania领事馆</figcaption><p>9月中旬，我突发奇想想玩玩光速船，于是我废了九牛二虎之力才造出来一个能用的，还煞有其事的测了一下速。。。(<a href="https://www.coolapk.com/feed/21661923?shareKey=NDA3ZDRiMTA5Yjg0NWZkZjZjNWI~">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1c64y1a7rR"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/8c5187e4165695bf0bf3186d914f171827be0042.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">08:06</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】磁悬浮高铁――适用于 Minecraft 基岩版 1.16+ 的光速船</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">2043</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">2</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><figcaption class="figure">光速船</figcaption><p>10月30日，全物品主体工程完工(<a href="https://www.coolapk.com/feed/22573186?shareKey=OGI5MTdiZDQ5ZWRmNWZkZjY4NWQ">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/d150ebc6-978a-4f3b-af5f-4092f7925ca3" alt="Screenshot_20201030-152344_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><figcaption class="figure">N方向</figcaption><p>10月31日，在10月的最后一天，我突然想造鱼塔了，于是我就造了一个。。。</p><p><img src="https://github.com/user-attachments/assets/fdd1ae4c-3eeb-4fb2-9c4f-18fcb3273d0e" alt="Screenshot_20201031-140148_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><figcaption class="figure">铺这玩意真费劲</figcaption><p>11月的时候，无意中发现麦块居然要搞比赛了，这是第一次官方搞比赛，我就想着蹭一蹭，结果进去傻眼了，别人一个个都是建筑大佬，全都按城建，就我不会建筑，于是我耗尽毕生所学，造了一个。。。</p><p><img src="https://github.com/user-attachments/assets/bf96fccb-cf3f-4654-96f9-32cc22bccf9b" alt="Screenshot_20201123-204055_5c8300b655012b1930f2e0a7b81bf6a9" loading="lazy"></p><figcaption class="figure">。。。。。</figcaption><p>最终Cake Mania代表队参赛我的世界未来挑战大赛并获得本赛道第五的成绩(共9人参赛。。。(<a href="https://www.coolapk.com/feed/23534009?shareKey=M2E4OWI1NjA0Njg2NjY1Nzc3MDU">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1oy4y1q7rj"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/227fd615224d2cfd00d57bcb4d6a8fcf99ee88c2.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">04:00</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【我的世界未来挑战大赛】Cake Mania代表队作品展示——基于单线通讯的数字轨道交通系统</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">314</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><figcaption class="figure">蛋糕糕是个桶~~~</figcaption><p>随后是一些无线电通信的成果</p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1Gp4y1z7nK"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/2c059d7965364de723bcadbe18d15a5aefe6ce5b.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">06:52</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCJE】20w49a快照-基于Sculk Sensor的无线通讯初步尝试</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">402</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1ZD4y1X7eV"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/c7e4a2a16cace329c55535a747da88173e9ad709.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">08:34</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】基于本正设计的无线通讯芯片的珍珠传送站</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">3106</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">2</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV19y4y1S7jS"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i2.hdslb.com/bfs/archive/15f050b74f7c5925d085809a9cc8f76f5977b6c3.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">02:45</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCJE】20w49a快照-无线通讯终于通了！</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">2256</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV1dz4y1673v"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i1.hdslb.com/bfs/archive/235bc27096af16dea304c0f0fac5c121baa25a23.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">01:42</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCJE】20w51a-无线通信终于不吵了！</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">251</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><p>12月20日，全物品设计完毕(<a href="https://www.coolapk.com/feed/23663761?shareKey=ZGUxZjliNjQ1ODY3NjY1Nzc3MDU">查看链接</a></p><p><div class="video-holder"><a class="default-flex full-width" target="_blank" rel="noopener noreferrer" style="max-height: 92px; display: flex; align-items: center;" href="https://www.bilibili.com/video/BV14z4y1z7Bq"><div class="disable-event cover-box" style="float: left;"><i class="iconfont default-cover">                <svg viewBox="0 0 1093 1023" style="width: 42px; height: 42px;">                    <path d="M653 665C651 667 647.667 671.333 643 678C638.333 685.333 634.667 690.667 632 694C626.667 698.667 621.667 701 617 701C608.333 701 599.667 698.833 591 694.5C582.333 690.167 575 684.333 569 677L561 667C557 661.667 554 658.167 552 656.5C550 654.833 547.667 654 545 654C542.333 654 534.667 661.667 522 677C517.333 683 509.667 688.5 499 693.5C488.333 698.5 480.167 701 474.5 701C468.833 701 462.333 697 455 689C451 683.667 445.333 675.667 438 665C427.333 649 415.333 645.333 402 654C395.333 658.667 392 665.833 392 675.5C392 685.167 395.333 693.667 402 701L438 737C442 740.333 447.167 743.167 453.5 745.5C459.833 747.833 466.667 749 474 749C481.333 749 487.333 748.167 492 746.5C496.667 744.833 502.667 741.667 510 737C518 730.333 529.667 722.333 545 713C550.333 719 556.667 725 564 731C579.333 743 593.167 749 605.5 749C617.833 749 631 745 645 737C655.667 731 666 723 676 713C684 705 689 696.667 691 688C693 679.333 692 671.667 688 665C683.333 660.333 677.5 658 670.5 658C663.5 658 657.667 660.333 653 665ZM984 737C984 758.333 978.667 778 968 796C957.333 814 942.833 828.5 924.5 839.5C906.167 850.5 886 856 864 856H226C204.667 856 185 850.667 167 840C149 829.333 134.5 814.833 123.5 796.5C112.5 778.167 107 758.333 107 737V382C107 360.667 112.333 340.833 123 322.5C133.667 304.167 148.167 289.667 166.5 279C184.833 268.333 204.667 263 226 263H867C889 263 909 268.333 927 279C945 289.667 959.333 304 970 322C980.667 340 986 360 986 382V737H984ZM900 156H714L807 63C814.333 55.6667 818 47.3333 818 38C818 28.6667 814.5 20.3333 807.5 13C800.5 5.66667 792.167 2 782.5 2C772.833 2 764.333 5.66667 757 13L614 156H491L345 11C338.333 3.66667 330.167 0 320.5 0C310.833 0 302.5 3.5 295.5 10.5C288.5 17.5 285 25.8333 285 35.5C285 45.1667 288.333 53.6667 295 61L391 156H191C156.333 156 124.333 164.5 95 181.5C65.6667 198.5 42.5 221.667 25.5 251C8.5 280.333 0 312 0 346V773C0 807 8.5 838.667 25.5 868C42.5 897.333 65.6667 920.5 95 937.5C124.333 954.5 156.333 963 191 963H214C214 979.667 219.833 993.833 231.5 1005.5C243.167 1017.17 257.333 1023 274 1023C290.667 1023 304.667 1017.17 316 1005.5C327.333 993.833 333 979.667 333 963H760C760 979.667 765.667 993.833 777 1005.5C788.333 1017.17 802.333 1023 819 1023C835.667 1023 849.833 1017.17 861.5 1005.5C873.167 993.833 879 979.667 879 963H903C937 963 968.667 954.5 998 937.5C1027.33 920.5 1050.5 897.333 1067.5 868C1084.5 838.667 1093 807 1093 773V346C1092.33 312 1083.17 280.333 1065.5 251C1047.83 221.667 1024.5 198.5 995.5 181.5C966.5 164.5 934.667 156 900 156ZM653 499L879 546L891 451L676 403L653 499ZM414 406L200 453L212 549L438 501L414 406Z"></path>                </svg>            </i><div class="cover-img video-cover-img" style="background-image: url(&quot;https://images.weserv.nl/?url=http://i1.hdslb.com/bfs/archive/c204d7527beba803390d039ea93049fb0f17fc8b.jpg&quot;);"></div><div class="video-subtitle"><div class="video-duration">08:39</div></div></div><div class="disable-event video-content-container"><p class="double-ellipsis video-title" style="margin-bottom: 0px;">【MCBE】光线追踪-Cake Mania全物品方案最终版展示(内有全物品教程汇总)</p><div class="video-card-info" style="display: flex;"><div class="cover-info-item views" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M832 160V608C832 635.333 822.833 658.167 804.5 676.5C786.167 694.833 763.333 704 736 704H160C132.667 704 109.833 694.833 91.5 676.5C73.1667 658.167 64 635.333 64 608V160C64 132.667 73.1667 109.833 91.5 91.5C109.833 73.1667 132.667 64 160 64H736C763.333 64 786.167 73.1667 804.5 91.5C822.833 109.833 832 132.667 832 160ZM736 768C765.333 768 792.167 760.833 816.5 746.5C840.833 732.167 860.167 712.833 874.5 688.5C888.833 664.167 896 637.333 896 608V160C896 130.667 888.833 103.833 874.5 79.5C860.167 55.1667 840.833 35.8333 816.5 21.5C792.167 7.16667 765.333 0 736 0H160C130.667 0 103.833 7.16667 79.5 21.5C55.1667 35.8333 35.8333 55.1667 21.5 79.5C7.16667 103.833 0 130.667 0 160V608C0 637.333 7.16667 664.167 21.5 688.5C35.8333 712.833 55.1667 732.167 79.5 746.5C103.833 760.833 130.667 768 160 768H736ZM621 413C629 409.667 634.5 404 637.5 396C640.5 388 640.5 380 637.5 372C634.5 364 629 358.333 621 355L365 243C353.667 238.333 343.333 239.167 334 245.5C324.667 251.833 320 260.667 320 272V496C320 507.333 324.667 516.167 334 522.5C343.333 528.833 353.667 529.667 365 525L621 413Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">2197</span></div><div class="cover-info-item danmakus" style="display: flex;"><i class="iconfont">                <svg viewBox="0 0 896 768" style="width: 16px; height: 16px;">                    <path d="M736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM736 64H160C134.667 64 113 72.1667 95 88.5C77 104.833 66.6667 125.667 64 151V160V608C64 633.333 72.1667 655 88.5 673C104.833 691 125.667 701.333 151 704H160H736C761.333 704 783 695.833 801 679.5C819 663.167 829.333 642.333 832 617V608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64ZM304 448V512H240V448H304ZM720 448V512H368V448H720ZM240 256V320H176V256H240ZM688 256V320H304V256H688Z"></path>                </svg>            </i>            <span class="single-ellipsis num-info">0</span></div></div><div class="video-card-bottom" style="display: flex;"><label class="card-text-label">视频</label><div class="view-flex default-flex align-center author-info" style="display: flex;"><i class="iconfont up-icon">                <svg viewBox="0 0 896 768" style="width: 14px; height: 14px;">                    <path d="M832 608V160C832 132.667 822.833 109.833 804.5 91.5C786.167 73.1667 763.333 64 736 64H160C132.667 64 109.833 73.1667 91.5 91.5C73.1667 109.833 64 132.667 64 160V608C64 635.333 73.1667 658.167 91.5 676.5C109.833 694.833 132.667 704 160 704H736C763.333 704 786.167 694.833 804.5 676.5C822.833 658.167 832 635.333 832 608ZM736 0C765.333 0 792.167 7.16667 816.5 21.5C840.833 35.8333 860.167 55.1667 874.5 79.5C888.833 103.833 896 130.667 896 160V608C896 637.333 888.833 664.167 874.5 688.5C860.167 712.833 840.833 732.167 816.5 746.5C792.167 760.833 765.333 768 736 768H160C130.667 768 103.833 760.833 79.5 746.5C55.1667 732.167 35.8333 712.833 21.5 688.5C7.16667 664.167 0 637.333 0 608V160C0 130.667 7.16667 103.833 21.5 79.5C35.8333 55.1667 55.1667 35.8333 79.5 21.5C103.833 7.16667 130.667 0 160 0H736ZM355 416V198H416V438C416 485.333 403 521.167 377 545.5C351 569.833 315 582 269 582C223 582 188 570.333 164 547C140 523.667 128 488.667 128 442V198H189V416C189 438 190.333 455 193 467C196.333 485 203.667 498.667 215 508C228.333 519.333 247.333 525 272 525C296.667 525 315.667 519.333 329 508C340.333 498.667 347.667 485 351 467C353.667 455 355 438 355 416ZM643 378C659.667 378 673.333 373.333 684 364C697.333 353.333 704 337.667 704 317C704 295 698 278.667 686 268C676 260 661.667 256 643 256H550V378H643ZM646 198C692 198 725.333 211.667 746 239C760.667 259 768 284.167 768 314.5C768 344.833 760.667 369.667 746 389C725.333 415.667 692 429 646 429H550V576H490V198H646Z"></path>                </svg>            </i><span class="view-flex single-ellipsis author-name">where-where</span></div></div></div></a></div></p><figcaption class="figure">全物品终于设计完了</figcaption><p>未完待续~~~</p><blockquote><p><a href="https://www.coolapk.com/feed/19422552?shareKey=YmM3YjVmYzFkMDlhNjY0NjUzNTU">回顾我在麦块里度过的时光</a> 作者 <a href="https://www.coolapk.com/u/wherewhere">@wherewhere</a> 2020年12月20日 发表于 <a href="https://www.coolapk.com/" title="Coolapk">酷安</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2020/12/20/%E5%9B%9E%E9%A1%BE%E6%88%91%E5%9C%A8%E9%BA%A6%E5%9D%97%E9%87%8C%E5%BA%A6%E8%BF%87%E7%9A%84%E6%97%B6%E5%85%89/</id><link href="https://wherewhere.github.io/2020/12/20/%E5%9B%9E%E9%A1%BE%E6%88%91%E5%9C%A8%E9%BA%A6%E5%9D%97%E9%87%8C%E5%BA%A6%E8%BF%87%E7%9A%84%E6%97%B6%E5%85%89/"/><published>2020-12-20T08:32:36.000Z</published><summary><![CDATA[<p><img src="https://github.com/user-attachments/assets/faae7e04-3df1-4e54-9f2f-c5f1ca03fd52" alt="回顾我在麦块里度过的时光" loading="lazy"></p>
<p><a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a> <a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a> <a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%842020%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93">#我的2020年度总结#</a></p>
<p>一晃一年就快要过去了，这一年我正式接触了麦块，知道了各种各样神奇的东西，也遇到了各种各样的人，所以我想在这里分享我这一年的历程，也说一说我是应何而接触的麦块</p>
<p><img src="https://github.com/user-attachments/assets/e5248024-0827-419c-9a5a-0cfea64533be" alt="untitled10" loading="lazy"></p>
<p>在我初中的时候，我第一次听说了麦块，那时的麦块，移动端应该还在Alpha阶段，看到别人在那建宏伟的建筑，觉得特别无聊，也就没去接触</p>
<p><img src="https://github.com/user-attachments/assets/8bfee4f2-f0a9-4b78-88f2-64caee777e0b" alt="Screenshot_20200606-115442" loading="lazy"></p>
<figcaption class="figure">回顾旧版</figcaption>

<p>一晃就到了2018年，我在B站上看到了恩氟烷瑞大佬的珍珠炮，指哪打哪的震撼感使我第一次想认真的玩一玩麦块，不过可惜的是，我最终只造出了窜天猴，还被麻将给修复了。。。(<a href="https://www.coolapk.com/feed/10850884?shareKey=MzY5MjhmODFjM2I2NWZkZjUxNjA">查看链接</a></p>
<style>
  figcaption.figure {
    color: #999;
    font-size: 0.875em;
    font-weight: bold;
    line-height: 1;
    margin: 5px auto 15px;
    text-align: center;
  }

  p+figcaption.figure,
  p+div.code-line+.figure {
    margin: -15px auto 15px;
  }

  @media (max-width: 567px) {
    .post-body p+figcaption.figure {
      margin: -5px auto 15px;
    }
  }
</style>]]></summary><title>回顾我在麦块里度过的时光</title><updated>2020-12-20T15:31:27.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="游戏" scheme="https://wherewhere.github.io/categories/%E6%B8%B8%E6%88%8F/"/><category term="资源" scheme="https://wherewhere.github.io/tags/%E8%B5%84%E6%BA%90/"/><category term="快讯" scheme="https://wherewhere.github.io/tags/%E5%BF%AB%E8%AE%AF/"/><category term="MC" scheme="https://wherewhere.github.io/tags/MC/"/><category term="BE" scheme="https://wherewhere.github.io/tags/BE/"/><category term="游戏" scheme="https://wherewhere.github.io/tags/%E6%B8%B8%E6%88%8F/"/><category term="JE" scheme="https://wherewhere.github.io/tags/JE/"/><content><![CDATA[<p><img src="https://www.minecraft.net/content/dam/games/minecraft/key-art/Community-Celebration_Landscape-Hero-2700x900.jpg" alt="【完结】Minecraft 2020 社区庆典" loading="lazy"></p><p><a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a> <a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a></p><p>Minecraft 2020 社区庆典已于12月14日开始，接下来我将会为大家分享庆典白嫖礼包直链，大家可以通过以下方法来获取过期的内容：<a href="/2020/06/09/Minecraft-%E5%AE%98%E6%96%B9%E7%BB%9D%E7%89%88%E7%9A%AE%E8%82%A4%E9%9B%86%E5%90%88">查看链接</a></p><p>每日签到获取礼包，过期应该就领不了了</p><p><img src="https://github.com/user-attachments/assets/feac2396-5243-484c-84c0-0c8f7478199a" alt="签到" loading="lazy"></p><figcaption class="figure">签到页面</figcaption><p>12月14日更新：</p><p>基岩版：作为 SIMBURBIA 的新任市长，快来打造繁华都市！<a href="http://minecraft.net/pdp?id=5cca20f3-5787-4256-b404-f4875376f061">查看链接</a></p><p><img src="https://www.minecraft.net/content/dam/games/minecraft/marketplace/simb_MarketingKeyArt.jpg" alt="SIMBURBIA" loading="lazy"></p><figcaption class="figure">整个城市就是你的游乐场</figcaption><p>Java版：阔步英雄皮肤包 <a href="https://www.minecraft.net/content/dam/games/minecraft/software/striding-hero-skinpack.zip">查看链接</a></p><style>  figcaption.figure {    color: #999;    font-size: 0.875em;    font-weight: bold;    line-height: 1;    margin: 5px auto 15px;    text-align: center;  }  p+figcaption.figure,  p+div.code-line+.figure {    margin: -15px auto 15px;  }  @media (max-width: 567px) {    .post-body p+figcaption.figure {      margin: -5px auto 15px;    }  }</style><span id="more"></span><p><img src="https://www.minecraft.net/content/dam/games/minecraft/marketplace/StridingHeroSkinShot3_510x287.jpg" alt="阔步英雄" loading="lazy"></p><figcaption class="figure">阔步英雄皮肤包</figcaption><p>12月21日更新：</p><p>基岩版：体验农民生活的挑战和收获的喜悦！<a href="http://minecraft.net/pdp?id=b8a9f9c6-1da5-4ae1-9633-36d660cb8100">查看链接</a></p><p><img src="https://www.minecraft.net/content/dam/games/minecraft/marketplace/farm_life_key_art_540x304.jpg" alt="农场生活" loading="lazy"></p><figcaption class="figure">成为世界上最棒的农民吧！</figcaption><p>Java版：挺过冰雪世界 <a href="https://www.minecraft.net/content/dam/games/minecraft/software/Striding-Hero-Map-v1.0.3-for-Minecraft-Version-1.16.4+Resource-Pack.zip">查看链接</a></p><p><img src="https://www.minecraft.net/content/dam/games/minecraft/marketplace/StridingHero4.png" alt="Striding Hero" loading="lazy"></p><figcaption class="figure">挺过冰雪世界</figcaption><p>12月28日更新：踏上飞向地心的冒险之旅！</p><p>基岩版：<a href="http://minecraft.net/pdp?id=3a60c683-2e7b-4067-839c-4bd6c4f8b893">查看链接</a></p><p>Java版：<a href="https://www.minecraft.net/content/dam/games/minecraft/software/Noxcrew-Terra_Swoop_Force_v1.0.1_Java.zip">查看链接</a></p><p><img src="https://www.minecraft.net/content/dam/games/minecraft/marketplace/MC-CC_Maps_Terra-Swoop-Force_600x360.jpg" alt="地心冒险" loading="lazy"></p><figcaption class="figure">快速飞行冒险</figcaption><p>1月4日更新：探索废弃花园的神奇魔法</p><p>基岩版：<a href="http://minecraft.net/pdp?id=d8604c56-d709-40e1-a286-13dce3b34ac5">查看链接</a></p><p><img src="https://www.minecraft.net/content/dam/games/minecraft/marketplace/Bloom_dotNet_HomepagePromo_600x3601.jpg" alt="繁花盛放" loading="lazy"></p><figcaption class="figure">融入森林</figcaption><p>活动官网：</p><p>Java版：<a href="https://www.minecraft.net/zh-hans/minecraft-java-community-celebration">查看链接</a></p><p>基岩版：<a href="https://www.minecraft.net/zh-hans/minecraft-community-celebration">查看链接</a></p><blockquote><p><a href="https://www.coolapk.com/feed/23474635?shareKey=Y2MxOWZhYWU3MWM3NjY0NGY2MzY">【12月29日更新】Minecraft 2020 社区庆典</a> 作者 <a href="https://www.coolapk.com/u/wherewhere">@wherewhere</a> 2020年12月10日 发表于 <a href="https://www.coolapk.com/" title="Coolapk">酷安</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2020/12/10/%E3%80%90%E5%AE%8C%E7%BB%93%E3%80%91Minecraft-2020-%E7%A4%BE%E5%8C%BA%E5%BA%86%E5%85%B8/</id><link href="https://wherewhere.github.io/2020/12/10/%E3%80%90%E5%AE%8C%E7%BB%93%E3%80%91Minecraft-2020-%E7%A4%BE%E5%8C%BA%E5%BA%86%E5%85%B8/"/><published>2020-12-10T06:50:07.000Z</published><summary><![CDATA[<p><img src="https://www.minecraft.net/content/dam/games/minecraft/key-art/Community-Celebration_Landscape-Hero-2700x900.jpg" alt="【完结】Minecraft 2020 社区庆典" loading="lazy"></p>
<p><a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a> <a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a></p>
<p>Minecraft 2020 社区庆典已于12月14日开始，接下来我将会为大家分享庆典白嫖礼包直链，大家可以通过以下方法来获取过期的内容：<a href="/2020/06/09/Minecraft-%E5%AE%98%E6%96%B9%E7%BB%9D%E7%89%88%E7%9A%AE%E8%82%A4%E9%9B%86%E5%90%88">查看链接</a></p>
<p>每日签到获取礼包，过期应该就领不了了</p>
<p><img src="https://github.com/user-attachments/assets/feac2396-5243-484c-84c0-0c8f7478199a" alt="签到" loading="lazy"></p>
<figcaption class="figure">签到页面</figcaption>

<p>12月14日更新：</p>
<p>基岩版：作为 SIMBURBIA 的新任市长，快来打造繁华都市！<a href="http://minecraft.net/pdp?id=5cca20f3-5787-4256-b404-f4875376f061">查看链接</a></p>
<p><img src="https://www.minecraft.net/content/dam/games/minecraft/marketplace/simb_MarketingKeyArt.jpg" alt="SIMBURBIA" loading="lazy"></p>
<figcaption class="figure">整个城市就是你的游乐场</figcaption>

<p>Java版：阔步英雄皮肤包 <a href="https://www.minecraft.net/content/dam/games/minecraft/software/striding-hero-skinpack.zip">查看链接</a></p>
<style>
  figcaption.figure {
    color: #999;
    font-size: 0.875em;
    font-weight: bold;
    line-height: 1;
    margin: 5px auto 15px;
    text-align: center;
  }

  p+figcaption.figure,
  p+div.code-line+.figure {
    margin: -15px auto 15px;
  }

  @media (max-width: 567px) {
    .post-body p+figcaption.figure {
      margin: -5px auto 15px;
    }
  }
</style>]]></summary><title>【完结】Minecraft 2020 社区庆典</title><updated>2020-12-29T10:37:55.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="游戏" scheme="https://wherewhere.github.io/categories/%E6%B8%B8%E6%88%8F/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="MC" scheme="https://wherewhere.github.io/tags/MC/"/><category term="BE" scheme="https://wherewhere.github.io/tags/BE/"/><category term="游戏" scheme="https://wherewhere.github.io/tags/%E6%B8%B8%E6%88%8F/"/><category term="JE" scheme="https://wherewhere.github.io/tags/JE/"/><content><![CDATA[<p><img src="https://github.com/user-attachments/assets/b332469e-9301-465a-91fd-fb589cb147f0" alt="【MCJE】利用GeyserMC在MCBE中玩MCJE" loading="lazy"></p><p><a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a> <a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a></p><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>最近想加入一个JE服玩玩，正好加入了一个JE BE互通服，于是突发奇想，在手机上开一个Geyser服不就能玩Java版了吗？而且感觉比boat还好用，毕竟boat只能分配几百兆内存，运行1.12以上版本也不太稳定。</p><p><img src="https://github.com/user-attachments/assets/1bf88ec1-00a1-4688-9478-f301bb5ac8ea" alt="MCJE" loading="lazy"></p><figcaption class="figure">在手机上玩JE</figcaption><h4 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h4><p>本教程默认阅读者具有一定Linux使用经验，本方案以Android搭配基于Linux Deployer的Ubuntu为例，本实例中Android版本号为10，Ubuntu版本号为21.04</p><p><img src="https://github.com/user-attachments/assets/a6a318f4-2b5b-418a-8468-2ffcef4423a2" alt="配置" loading="lazy"></p><figcaption class="figure">配置详情</figcaption><h4 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h4><style>  figcaption.figure {    color: #999;    font-size: 0.875em;    font-weight: bold;    line-height: 1;    margin: 5px auto 15px;    text-align: center;  }  p+figcaption.figure,  p+div.code-line+.figure {    margin: -15px auto 15px;  }  @media (max-width: 567px) {    .post-body p+figcaption.figure {      margin: -5px auto 15px;    }  }</style><span id="more"></span><p>由于Geyser基于Java，所以我们需要先安装Java，非常简单，键入以下命令</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install default-jre</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/86a169aa-c2a8-43f4-84e4-c8dea21406c1" alt="Java" loading="lazy"></p><figcaption class="figure">安装Java</figcaption><h4 id="下载必要文件"><a href="#下载必要文件" class="headerlink" title="下载必要文件"></a>下载必要文件</h4><p>想要运行Geyser，就必须要下载Geyser，同时由于Geyser只是一个代理，我们还要下载JE服务端</p><p>输入命令回到根目录(或者你需要的目录)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span></span><br></pre></td></tr></table></figure><p>新建文件夹(以Geyser为例)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> Geyser</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/486f65d0-48d2-4a0b-87d2-a71d2341806d" alt="文件夹" loading="lazy"></p><figcaption class="figure">创建文件夹</figcaption><p>进入文件夹</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> Geyser</span><br></pre></td></tr></table></figure><p>下载Geyser(你可以使用其他方式下载)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://ci.nukkitx.com/job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/standalone/target/Geyser.jar</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/5ce3f54c-5231-4da1-a4fc-267567e6a930" alt="wget" loading="lazy"></p><figcaption class="figure">获取Geyser</figcaption><p>回到根目录(或你想要的目录)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span></span><br></pre></td></tr></table></figure><p>创建文件夹(以<code>Minecraft Java Server</code>为例)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> <span class="string">&quot;Minecraft Java Server&quot;</span></span><br></pre></td></tr></table></figure><img src="https://github.com/user-attachments/assets/664bee3e-0371-45ba-b7ef-3997faa6c7a7" alt="Minecraft Java Server" /><figcaption class="figure">创建文件夹</figcaption><p>进入文件夹</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> Minecraft\ Java\ Server/</span><br></pre></td></tr></table></figure><p>下载JE服务端(以1.16.4为例)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://launcher.mojang.com/v1/objects/35139deedbd5182953cf1caa23835da59ca3d7cd/server.jar</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/c5b6bdfd-6637-4437-a54c-d9805d837af2" alt="wget" loading="lazy"></p><figcaption class="figure">下载服务端</figcaption><h4 id="运行服务器"><a href="#运行服务器" class="headerlink" title="运行服务器"></a>运行服务器</h4><p>停留在当前路径，先配置JE服务器</p><p>输入以下命令启动服务器</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Java -jar server.jar</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/2759f591-8265-4603-9c48-d8aae6a82278" alt="启动" loading="lazy"></p><figcaption class="figure">启动服务器</figcaption><p>这时终端会报错，这是因为你没有同意EULA，修改<code>eula.txt</code>(以vim为例)</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim eula.txt</span><br></pre></td></tr></table></figure><p>将<code>false</code>修改为<code>true</code></p><p><img src="https://github.com/user-attachments/assets/dd6e3897-aa47-4e95-97cf-6dfcdf1c041a" alt="eula.txt" loading="lazy"></p><figcaption class="figure">修改<code>eula.txt</code></figcaption><p>再次运行服务器，这时一切将会正常</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Java -jar server.jar</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/75ce4e2f-548e-4346-b0f6-43b3afa023c4" alt="服务器" loading="lazy"></p><figcaption class="figure">开启服务器</figcaption><p>无需修改配置，新建一个终端，进入Geyser所在目录</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> Geyser</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/eb5c6c2b-635d-4fe4-ab90-f11fb00253ef" alt="文件夹" loading="lazy"></p><figcaption class="figure">进入文件夹</figcaption><p>启动Geyser</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -jar Geyser.jar</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/8829e231-bd28-4493-8edf-5fdd2dc891cf" alt="Geyser" loading="lazy"></p><figcaption class="figure">启动Geyser</figcaption><h4 id="进入Minecraft-Java-Edition"><a href="#进入Minecraft-Java-Edition" class="headerlink" title="进入Minecraft Java Edition"></a>进入Minecraft Java Edition</h4><p>(如果你使用的是Windows 10，请先在PowerShell中运行以下命令</p><figure class="highlight ps1"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CheckNetIsolation LoopbackExempt <span class="literal">-a</span> <span class="literal">-n</span>=<span class="string">&quot;Microsoft.MinecraftUWP_8wekyb3d8bbwe&quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/053f23f6-c831-4df2-b540-28987caf3c64" alt="Screenshot_20201116-235303" loading="lazy"></p><p>进入Minecraft，打开好友栏，其中将会出现Geyser</p><p><img src="https://github.com/user-attachments/assets/7184dbd6-fa8a-4aff-a447-66801b7bfbf4" alt="好友栏" loading="lazy"></p><figcaption class="figure">Geyser</figcaption><p>登录帐号</p><p><img src="https://github.com/user-attachments/assets/f5a05c74-4c2f-44e1-baaf-b9cd566062de" alt="登录" loading="lazy"></p><figcaption class="figure">登录</figcaption><p>尽情游玩吧</p><p><img src="https://github.com/user-attachments/assets/97f6bc5e-6d3b-4038-bc86-db5c145609b1" alt="JE皮肤" loading="lazy"></p><figcaption class="figure">可以加载JE皮肤</figcaption><p>当然通过配置Geyser还可以登录其他的Java服务器，但是由于转译的不完善，可能会被反作弊插件判为作弊，本教程只简单介绍该方案的大致方法，若有疑问可以在评论区中提出，未来的某天可能会发布更高阶的教程，感谢大家的支持。</p><h4 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h4><p>Geyser官方教程：<a href="https://github.com/GeyserMC/Geyser/wiki/Setup">查看链接</a></p><h4 id="推荐阅读"><a href="#推荐阅读" class="headerlink" title="推荐阅读"></a>推荐阅读</h4><p>Geyser使用教程——通过它来实现基岩版进入Java版服务器，现已支持Java1.16.2：<a href="https://www.mcbbs.net/forum.php?mod=viewthread&tid=973002&highlight=">查看链接</a></p><blockquote><p><a href="https://www.coolapk.com/feed/22991565?shareKey=ODBmYTQ0ZjFjZDNjNjY0N2FlMDc">【MCJE】利用GeyserMC在MCBE中玩MCJE</a> 作者 <a href="https://www.coolapk.com/u/wherewhere">@wherewhere</a> 2020年11月17日 发表于 <a href="https://www.coolapk.com/" title="Coolapk">酷安</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2020/11/17/%E3%80%90MCJE%E3%80%91%E5%88%A9%E7%94%A8GeyserMC%E5%9C%A8MCBE%E4%B8%AD%E7%8E%A9MCJE/</id><link href="https://wherewhere.github.io/2020/11/17/%E3%80%90MCJE%E3%80%91%E5%88%A9%E7%94%A8GeyserMC%E5%9C%A8MCBE%E4%B8%AD%E7%8E%A9MCJE/"/><published>2020-11-17T00:35:39.000Z</published><summary><![CDATA[<p><img src="https://github.com/user-attachments/assets/b332469e-9301-465a-91fd-fb589cb147f0" alt="【MCJE】利用GeyserMC在MCBE中玩MCJE" loading="lazy"></p>
<p><a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a> <a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a></p>
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>最近想加入一个JE服玩玩，正好加入了一个JE BE互通服，于是突发奇想，在手机上开一个Geyser服不就能玩Java版了吗？而且感觉比boat还好用，毕竟boat只能分配几百兆内存，运行1.12以上版本也不太稳定。</p>
<p><img src="https://github.com/user-attachments/assets/1bf88ec1-00a1-4688-9478-f301bb5ac8ea" alt="MCJE" loading="lazy"></p>
<figcaption class="figure">在手机上玩JE</figcaption>

<h4 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h4><p>本教程默认阅读者具有一定Linux使用经验，本方案以Android搭配基于Linux Deployer的Ubuntu为例，本实例中Android版本号为10，Ubuntu版本号为21.04</p>
<p><img src="https://github.com/user-attachments/assets/a6a318f4-2b5b-418a-8468-2ffcef4423a2" alt="配置" loading="lazy"></p>
<figcaption class="figure">配置详情</figcaption>

<h4 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h4><style>
  figcaption.figure {
    color: #999;
    font-size: 0.875em;
    font-weight: bold;
    line-height: 1;
    margin: 5px auto 15px;
    text-align: center;
  }

  p+figcaption.figure,
  p+div.code-line+.figure {
    margin: -15px auto 15px;
  }

  @media (max-width: 567px) {
    .post-body p+figcaption.figure {
      margin: -5px auto 15px;
    }
  }
</style>]]></summary><title>【MCJE】利用GeyserMC在MCBE中玩MCJE</title><updated>2020-11-17T00:35:39.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="游戏" scheme="https://wherewhere.github.io/categories/%E6%B8%B8%E6%88%8F/"/><category term="资源" scheme="https://wherewhere.github.io/tags/%E8%B5%84%E6%BA%90/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="MC" scheme="https://wherewhere.github.io/tags/MC/"/><category term="BE" scheme="https://wherewhere.github.io/tags/BE/"/><category term="游戏" scheme="https://wherewhere.github.io/tags/%E6%B8%B8%E6%88%8F/"/><content><![CDATA[<p><img src="https://github.com/user-attachments/assets/95dff604-c9fc-43f4-bb93-930dd129636c" alt="Minecraft 官方绝版皮肤集合" loading="lazy"></p><p><a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a> <a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a></p><p>最近测试版一次神奇的更新，让所有绝版的项目都又能购买了，特收集各种绝版项目链接，适用版本1.16.0.63 (更新于2020年12月2日，该版本已无法登陆，但正式版1.16.0.2有同样效果，下载链接：<a href="https://www.coolapk.com/feed/19814432?shareKey=NWU3NTI0OGM5YzlhNjY0NjU1MTQ">查看链接</a></p><p>皮肤包：</p><p>MINECON 2015 皮肤包(100万Minecoin可购买)：<a href="https://marketplace.minecraft.net/en-us/pdp?id=7dae6bfe-e92b-403e-842e-d8d75e329644">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/f095d36b-0b4a-43fe-9fc5-88b66fec3668" alt="MINECON 2015 皮肤包" loading="lazy"></p><figcaption class="figure">MINECON 2015 皮肤包</figcaption><p>MINECON 2016 皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=20b4d681-df67-420c-aff3-07673bb44d07">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/fc01d800-3247-436c-828c-be87a4ca092c" alt="MINECON 2016 皮肤包" loading="lazy"></p><figcaption class="figure">MINECON 2016 皮肤包</figcaption><p>MINECON Earth 2017 皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=d0f9abcb-4915-4008-9837-ff7946f4a115">查看链接</a></p><style>  figcaption.figure {    color: #999;    font-size: 0.875em;    font-weight: bold;    line-height: 1;    margin: 5px auto 15px;    text-align: center;  }  p+figcaption.figure,  p+div.code-line+.figure {    margin: -15px auto 15px;  }  @media (max-width: 567px) {    .post-body p+figcaption.figure {      margin: -5px auto 15px;    }  }</style><span id="more"></span><p><img src="https://github.com/user-attachments/assets/e5e511f3-f6b1-40bc-9e98-624f5fc0aa50" alt="MINECON Earth 2017 皮肤包" loading="lazy"></p><figcaption class="figure">MINECON Earth 2017 皮肤包</figcaption><p>Founder&#39;s Cape：<a href="https://marketplace.minecraft.net/en-us/pdp?id=b3b50166-5612-4ff1-8f03-9af0b01cb4da">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/294771db-497b-4fc1-84e5-8cf43990950b" alt="Founder’s Cape" loading="lazy"></p><figcaption class="figure">Founder’s Cape</figcaption><p>一周年生日皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=8e78a44d-0c1f-4ce2-826b-8bbc555012de">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/38bfe2c2-12ff-4d2c-bd21-2c42a7fb38ec" alt="一周年生日皮肤包" loading="lazy"></p><figcaption class="figure">一周年生日皮肤包</figcaption><p>二周年生日皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=02b54955-9b4d-40cb-9b73-360d23cf1b9e">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/1a583533-62df-4ddc-946c-ace30a7dba40" alt="二周年生日皮肤包" loading="lazy"></p><figcaption class="figure">二周年生日皮肤包</figcaption><p>三周年生日皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=603d6be1-7745-4ad8-8af3-908ad017500f">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/b282060b-b55d-4a28-b393-e456301b3141" alt="三周年生日皮肤包" loading="lazy"></p><figcaption class="figure">三周年生日皮肤包</figcaption><p>四周年生日皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=a2a7ad5c-f55e-44ff-9f70-a5ae1db821b4">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/447f3192-94b4-402c-b93c-2297cc3ef9cd" alt="四周年生日皮肤包" loading="lazy"></p><figcaption class="figure">四周年生日皮肤包</figcaption><p>五周年生日皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=cc1e1b86-1863-4c1c-9103-b82b2b70a74b">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/01080b21-aacf-4691-b9f4-096a84de27fa" alt="五周年生日皮肤包" loading="lazy"></p><figcaption class="figure">五周年生日皮肤包</figcaption><p>地球皮肤(不可用)：<a href="https://marketplace.minecraft.net/en-us/pdp?id=0c77040a-abb6-4938-963d-5a8e9872c85c">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/485fc0a0-edb4-48fa-af77-d54c275be079" alt="地球皮肤" loading="lazy"></p><figcaption class="figure">地球皮肤</figcaption><p>本人能力有限，无法归纳全部内容，欢迎大家补充！</p><blockquote><p><a href="https://www.coolapk.com/feed/19422552?shareKey=YmM3YjVmYzFkMDlhNjY0NjUzNTU">Minecraft 官方绝版皮肤集合</a> 作者 <a href="https://www.coolapk.com/u/wherewhere">@wherewhere</a> 2020年6月9日 发表于 <a href="https://www.coolapk.com/" title="Coolapk">酷安</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2020/06/09/Minecraft-%E5%AE%98%E6%96%B9%E7%BB%9D%E7%89%88%E7%9A%AE%E8%82%A4%E9%9B%86%E5%90%88/</id><link href="https://wherewhere.github.io/2020/06/09/Minecraft-%E5%AE%98%E6%96%B9%E7%BB%9D%E7%89%88%E7%9A%AE%E8%82%A4%E9%9B%86%E5%90%88/"/><published>2020-06-09T02:32:45.000Z</published><summary><![CDATA[<p><img src="https://github.com/user-attachments/assets/95dff604-c9fc-43f4-bb93-930dd129636c" alt="Minecraft 官方绝版皮肤集合" loading="lazy"></p>
<p><a href="https://www.coolapk.com/t/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C">#我的世界#</a> <a href="https://www.coolapk.com/t/Minecraft">#Minecraft#</a></p>
<p>最近测试版一次神奇的更新，让所有绝版的项目都又能购买了，特收集各种绝版项目链接，适用版本1.16.0.63 (更新于2020年12月2日，该版本已无法登陆，但正式版1.16.0.2有同样效果，下载链接：<a href="https://www.coolapk.com/feed/19814432?shareKey=NWU3NTI0OGM5YzlhNjY0NjU1MTQ">查看链接</a></p>
<p>皮肤包：</p>
<p>MINECON 2015 皮肤包(100万Minecoin可购买)：<a href="https://marketplace.minecraft.net/en-us/pdp?id=7dae6bfe-e92b-403e-842e-d8d75e329644">查看链接</a></p>
<p><img src="https://github.com/user-attachments/assets/f095d36b-0b4a-43fe-9fc5-88b66fec3668" alt="MINECON 2015 皮肤包" loading="lazy"></p>
<figcaption class="figure">MINECON 2015 皮肤包</figcaption>

<p>MINECON 2016 皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=20b4d681-df67-420c-aff3-07673bb44d07">查看链接</a></p>
<p><img src="https://github.com/user-attachments/assets/fc01d800-3247-436c-828c-be87a4ca092c" alt="MINECON 2016 皮肤包" loading="lazy"></p>
<figcaption class="figure">MINECON 2016 皮肤包</figcaption>

<p>MINECON Earth 2017 皮肤包：<a href="https://marketplace.minecraft.net/en-us/pdp?id=d0f9abcb-4915-4008-9837-ff7946f4a115">查看链接</a></p>
<style>
  figcaption.figure {
    color: #999;
    font-size: 0.875em;
    font-weight: bold;
    line-height: 1;
    margin: 5px auto 15px;
    text-align: center;
  }

  p+figcaption.figure,
  p+div.code-line+.figure {
    margin: -15px auto 15px;
  }

  @media (max-width: 567px) {
    .post-body p+figcaption.figure {
      margin: -5px auto 15px;
    }
  }
</style>]]></summary><title>Minecraft 官方绝版皮肤集合</title><updated>2020-12-02T11:42:48.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="玩机" scheme="https://wherewhere.github.io/categories/%E7%8E%A9%E6%9C%BA/"/><category term="资源" scheme="https://wherewhere.github.io/tags/%E8%B5%84%E6%BA%90/"/><category term="教程" scheme="https://wherewhere.github.io/tags/%E6%95%99%E7%A8%8B/"/><category term="Win10" scheme="https://wherewhere.github.io/tags/Win10/"/><category term="玩机" scheme="https://wherewhere.github.io/tags/%E7%8E%A9%E6%9C%BA/"/><category term="Linux" scheme="https://wherewhere.github.io/tags/Linux/"/><category term="WSL" scheme="https://wherewhere.github.io/tags/WSL/"/><content><![CDATA[<h4 id="安装WSL"><a href="#安装WSL" class="headerlink" title="安装WSL"></a><span style="color: RoyalBlue;">安装WSL</span></h4><ol><li><p>启用适用于Linux的Windows子系统</p><ul><li><p>使用<code>启用或关闭Windows功能</code>打开</p><p>在搜索栏中搜索并打开<code>启用或关闭Windows功能</code>，勾选<code>适用于Linux的Windows子系统</code>项。</p><p><img src="https://github.com/user-attachments/assets/15513f05-5911-4e2c-b5d3-593605f45287" alt="批注 2020-02-28 172223" loading="lazy"></p></li><li><p>使用<code>PowerShell</code>打开</p><p>管理员权限运行<code>PowerShell</code>并运行下面的命令：</p><figure class="highlight ps1"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Enable-WindowsOptionalFeature</span> <span class="literal">-Online</span> <span class="literal">-FeatureName</span> Microsoft<span class="literal">-Windows-Subsystem-Linux</span></span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/05218ba7-7c18-493a-8549-6da535692706" alt="批注 2020-02-28 172642" loading="lazy"></p></li></ul></li><li><p>更改WSL版本号</p><p>对于<strong>Windows 10.0.18917</strong>及以上的版本，微软新增了WSL2，具体有什么优势这里就不指出了</p><p>管理员权限运行<code>PowerShell</code>并运行下面的命令：<span id="more"></span></p><figure class="highlight ps1"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Enable-WindowsOptionalFeature</span> <span class="literal">-Online</span> <span class="literal">-FeatureName</span> VirtualMachinePlatform</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/66853a28-649c-4f5c-93a7-6c0bd5280019" alt="批注 2020-02-28 172826" loading="lazy"></p><p>或在<code>启用或关闭Windows功能</code>，勾选<code>虚拟机平台</code>项。</p><p><img src="https://github.com/user-attachments/assets/d6a02934-0b9e-4fca-a40d-eff01d6c4382" alt="批注 2020-02-28 174514" loading="lazy"></p><p>输入 <code>wsl -l</code> 可以查看已安装的Linux</p><p><img src="https://github.com/user-attachments/assets/2dedd776-48fd-4a6c-96e2-f49b0b52bab9" alt="批注 2020-02-28 172900" loading="lazy"></p><p>输入 <code>wsl --set-version Ubuntu 2</code> 可以更改Ubuntu为WSL2(Ubuntu可改为你正在使用的版本)(如果想换回1，只需把2改为1再运行一次)</p><p>输入 <code>wsl --set-default-version 2</code> 可以默认安装Linux为WSL2(如果想换回1，只需把2改为1再运行一次)</p></li><li><p>安装Linux</p><p>在Microsoft Store搜索 Linux，可以看到一系列 Linux 发行版，根据自己需要选择适合自己的发行版，这里以Ubuntu为例，下载完成后启动，等待安装完成，输入账户和密码。（这里默认会安装到C盘，有安装到其它盘的方法，这里就不指出了）</p></li></ol><h4 id="配置WSL"><a href="#配置WSL" class="headerlink" title="配置WSL"></a><span style="color: #4169e1;">配置WSL</span></h4><ol><li><p>美化终端</p><p>CMD是无可救药了，这里就给一个底色了</p><p><img src="https://github.com/user-attachments/assets/6766f827-d073-47eb-818f-7f4db4e8e062" alt="批注 2020-02-28 111532" loading="lazy"></p><p>推荐使用Windows Terminal，这里送上我自用的<a href="https://github.com/wherewhere/WindowsTerminalProfiles">配置文件</a></p><p><img src="https://github.com/user-attachments/assets/2cb1564f-882c-4e1c-8855-49770e9b7038" alt="批注 2020-02-28 174459" loading="lazy"></p></li><li><p>更换源并更新到最新版Ubuntu (以20.04为例)</p><ul><li><p>对于WSL1，可以直接在Windows下找到文件并修改</p><p> 直接编辑 <code>C:\Users\&lt;Your Name&gt;\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\etc\apt\sources.list</code> 为(文中 <code>https://mirrors.tuna.tsinghua.edu.cn/ubuntu/</code> 可换为你喜欢的源地址) (文中 focal 可换为你想要更新到的版本号)</p> <figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal universe</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal universe</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates universe</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates universe</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal multiverse</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates multiverse</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal partner</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal partner</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security universe</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security universe</span></span><br><span class="line">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security multiverse</span><br><span class="line"><span class="comment"># deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security multiverse</span></span><br></pre></td></tr></table></figure><p> <img src="https://github.com/user-attachments/assets/aa43e5ab-0eff-49b2-90ff-611c919d9293" alt="批注 2020-02-28 173252" loading="lazy"></p></li><li><p>对于WSL2，Windows是没有权限修改WSL的系统文件的，所以只能在WSL中修改</p><p>在终端输入</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> nano /etc/apt/sources.list <span class="comment">#(nano可换为你喜欢的文本编辑器，但是Ubuntu预装的是nano)</span></span><br></pre></td></tr></table></figure><p>将内容修改为上文</p><p><img src="https://github.com/user-attachments/assets/e9ad4c87-1560-4c73-a191-f69d5fa7c845" alt="批注 2020-02-28 173356" loading="lazy"></p></li><li><p>在终端输入</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br></pre></td></tr></table></figure></li><li><p>完成后输入</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt dist-upgrade</span><br></pre></td></tr></table></figure></li><li><p>请坐和放宽</p></li></ul></li><li><p>更改语言为中文</p><p>输入</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> dpkg-reconfigure locales</span><br></pre></td></tr></table></figure><p><img src="https://github.com/user-attachments/assets/17af7a1c-bb53-4cba-a93f-dbb4cbbf9bca" alt="批注 2020-02-28 173452" loading="lazy"></p><p>选中 <code>zh_CN GB2312</code> 和 <code>zh_CN.UTF-8 UTF-8</code> 确定</p><p><img src="https://github.com/user-attachments/assets/c29fa217-af62-4910-8368-fe5ba28b3072" alt="批注 2020-02-28 173531" loading="lazy"></p><p>选择 <code>zh_CN.UTF-8</code> 确定</p><p><img src="https://github.com/user-attachments/assets/bc276409-0235-444a-895f-d4a9cde64043" alt="批注 2020-02-28 173551" loading="lazy"></p><p>重启终端</p></li></ol><blockquote><p><a href="https://bbs.wfun.com/thread-1024317-1-1.html">【教程】适用于Linux的Windows子系统使用教程——安装与配置</a> 作者 <a href="https://bbs.wfun.com/u/2850357">@wherewhere</a> 2020年2月28日 发表于 <a href="https://bbs.wfun.com/" title="WFun">智机社区</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2020/02/28/%E3%80%90%E6%95%99%E7%A8%8B%E3%80%91%E9%80%82%E7%94%A8%E4%BA%8ELinux%E7%9A%84Windows%E5%AD%90%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E2%80%94%E2%80%94%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/</id><link href="https://wherewhere.github.io/2020/02/28/%E3%80%90%E6%95%99%E7%A8%8B%E3%80%91%E9%80%82%E7%94%A8%E4%BA%8ELinux%E7%9A%84Windows%E5%AD%90%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E2%80%94%E2%80%94%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/"/><published>2020-02-28T01:45:00.000Z</published><summary><![CDATA[<h4 id="安装WSL"><a href="#安装WSL" class="headerlink" title="安装WSL"></a><span style="color: RoyalBlue;">安装WSL</span></h4><ol>
<li><p>启用适用于Linux的Windows子系统</p>
<ul>
<li><p>使用<code>启用或关闭Windows功能</code>打开</p>
<p>在搜索栏中搜索并打开<code>启用或关闭Windows功能</code>，勾选<code>适用于Linux的Windows子系统</code>项。</p>
<p><img src="https://github.com/user-attachments/assets/15513f05-5911-4e2c-b5d3-593605f45287" alt="批注 2020-02-28 172223" loading="lazy"></p>
</li>
<li><p>使用<code>PowerShell</code>打开</p>
<p>管理员权限运行<code>PowerShell</code>并运行下面的命令：</p>
<figure class="highlight ps1"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Enable-WindowsOptionalFeature</span> <span class="literal">-Online</span> <span class="literal">-FeatureName</span> Microsoft<span class="literal">-Windows-Subsystem-Linux</span></span><br></pre></td></tr></table></figure>

<p><img src="https://github.com/user-attachments/assets/05218ba7-7c18-493a-8549-6da535692706" alt="批注 2020-02-28 172642" loading="lazy"></p>
</li>
</ul>
</li>
<li><p>更改WSL版本号</p>
<p>对于<strong>Windows 10.0.18917</strong>及以上的版本，微软新增了WSL2，具体有什么优势这里就不指出了</p>
<p>管理员权限运行<code>PowerShell</code>并运行下面的命令：]]></summary><title>【教程】适用于Linux的Windows子系统使用教程——安装与配置</title><updated>2020-02-28T10:57:00.000Z</updated></entry><entry><author><name>wherewhere</name></author><category term="快讯" scheme="https://wherewhere.github.io/categories/%E5%BF%AB%E8%AE%AF/"/><category term="Win10" scheme="https://wherewhere.github.io/tags/Win10/"/><category term="WOA" scheme="https://wherewhere.github.io/tags/WOA/"/><category term="快讯" scheme="https://wherewhere.github.io/tags/%E5%BF%AB%E8%AE%AF/"/><category term="玩机" scheme="https://wherewhere.github.io/tags/%E7%8E%A9%E6%9C%BA/"/><category term="Surface" scheme="https://wherewhere.github.io/tags/Surface/"/><category term="新闻" scheme="https://wherewhere.github.io/tags/%E6%96%B0%E9%97%BB/"/><content><![CDATA[<p><img src="https://github.com/user-attachments/assets/5973083d-1616-4b76-ba3e-26fb9654a27b" alt="Surface RT运行Win10图片泄露，Win10RT或存在过" loading="lazy"></p><p><a href="https://www.coolapk.com/t/%E7%94%B5%E8%84%91%E7%8E%A9%E5%AE%B6">#电脑玩家#</a> <a href="https://www.coolapk.com/t/ROM%E6%9D%82%E8%B0%88">#ROM杂谈#</a> <a href="https://www.coolapk.com/t/Windows10">#Windows10#</a> <a href="https://www.coolapk.com/dyh/1480">铺路根据地</a></p><p>近期名为Longhorn (<a href="https://twitter.com/never_released" title="Longhorn">@never_released</a>) 的开发者(或团队)在其推特上发表了一张疑似 <strong>Windows 10 ARM32</strong> 版本的运行截图</p><p><img src="https://github.com/user-attachments/assets/f0358e90-bca5-4b08-8be7-e05f95d6c683" alt="推文" loading="lazy"></p><figcaption class="figure"><a href="https://twitter.com/never_released/status/1151193050066149382">https://twitter.com/never_released/status/1151193050066149382</a></figcaption><p><img src="https://github.com/user-attachments/assets/412f9942-c072-4a0c-b6c9-d270ac3d1861" alt="截图" loading="lazy"></p><figcaption class="figure">疑似Win10ARM32截图</figcaption>图中出现了一款只有arm编译版本的应用 **Clamour**，这表明运行该应用的设备应该是一款搭载arm芯片的平板<style>  figcaption.figure {    color: #999;    font-size: 0.875em;    font-weight: bold;    line-height: 1;    margin: 5px auto 15px;    text-align: center;  }  p+figcaption.figure,  p+div.code-line+.figure {    margin: -15px auto 15px;  }  @media (max-width: 567px) {    .post-body p+figcaption.figure {      margin: -5px auto 15px;    }  }</style><span id="more"></span><p><img src="https://github.com/user-attachments/assets/78cc6322-d86c-4b63-977e-93e091e6d2d4" alt="Clamour" loading="lazy"></p><figcaption class="figure">该应用在商店的简介</figcaption><p><img src="https://github.com/user-attachments/assets/2feca725-b534-44f2-929e-ef4867096761" alt="配置要求" loading="lazy"></p><figcaption class="figure">该应用需要的配置要求，可见只有arm设备可以运行</figcaption><p>随后Longhorn再次发帖，确认该截图的确为<strong>Windows 10 ARM32</strong>，版本为<strong>1703</strong>，且运行设备为Surface RT一代</p><p><img src="https://github.com/user-attachments/assets/9878a979-5fb0-4b9c-8226-5e3014d40c95" alt="推文" loading="lazy"></p><figcaption class="figure"><a href="https://twitter.com/never_released/status/1151612876962041861">https://twitter.com/never_released/status/1151612876962041861</a></figcaption><p><img src="https://github.com/user-attachments/assets/d35c0fb5-a139-4ede-850e-ee70ce9a4462" alt="截图" loading="lazy"></p><figcaption class="figure">截图显示这是一台arm设备</figcaption><p><img src="https://github.com/user-attachments/assets/b69c8911-b6a1-4933-9562-dbcbc1150eb9" alt="Win7游戏" loading="lazy"></p><figcaption class="figure">该推主的Surface RT，图为正在运行Win7游戏</figcaption><p>不过可惜的是，图中版本号以被遮盖，但据有关人士透露，该版本或为Build <strong>15035</strong>，暂无镜像文件泄露</p><p>随后Longhorn补充了一些内容，感兴趣的可以前往他的推特查阅：<a href="https://twitter.com/never_released?s=17">查看链接</a></p><p><img src="https://github.com/user-attachments/assets/ebccb5bd-f2d8-44b3-a1f9-f2d9e8677654" alt="推文" loading="lazy"></p><figcaption class="figure">推文</figcaption><p><img src="https://github.com/user-attachments/assets/837fc8c4-abfe-452d-a5fc-4a7ffcb901d0" alt="推文" loading="lazy"></p><figcaption class="figure">推文</figcaption><blockquote><p><a href="https://www.coolapk.com/feed/12814291?shareKey=OTlkM2YxYzEwMjcxNjYzNWQ4MGM">Surface RT运行Win10图片泄露，Win10RT或存在过</a> 作者 <a href="https://www.coolapk.com/u/wherewhere">@wherewhere</a> 2019年7月19日 发表于 <a href="https://www.coolapk.com/" title="Coolapk">酷安</a>，转载请注明出处</p></blockquote>]]></content><id>https://wherewhere.github.io/2019/07/19/Surface-RT%E8%BF%90%E8%A1%8CWin10%E5%9B%BE%E7%89%87%E6%B3%84%E9%9C%B2%EF%BC%8CWin10RT%E6%88%96%E5%AD%98%E5%9C%A8%E8%BF%87/</id><link href="https://wherewhere.github.io/2019/07/19/Surface-RT%E8%BF%90%E8%A1%8CWin10%E5%9B%BE%E7%89%87%E6%B3%84%E9%9C%B2%EF%BC%8CWin10RT%E6%88%96%E5%AD%98%E5%9C%A8%E8%BF%87/"/><published>2019-07-19T03:49:21.000Z</published><summary><![CDATA[<p><img src="https://github.com/user-attachments/assets/5973083d-1616-4b76-ba3e-26fb9654a27b" alt="Surface RT运行Win10图片泄露，Win10RT或存在过" loading="lazy"></p>
<p><a href="https://www.coolapk.com/t/%E7%94%B5%E8%84%91%E7%8E%A9%E5%AE%B6">#电脑玩家#</a> <a href="https://www.coolapk.com/t/ROM%E6%9D%82%E8%B0%88">#ROM杂谈#</a> <a href="https://www.coolapk.com/t/Windows10">#Windows10#</a> <a href="https://www.coolapk.com/dyh/1480">铺路根据地</a></p>
<p>近期名为Longhorn (<a href="https://twitter.com/never_released" title="Longhorn">@never_released</a>) 的开发者(或团队)在其推特上发表了一张疑似 <strong>Windows 10 ARM32</strong> 版本的运行截图</p>
<p><img src="https://github.com/user-attachments/assets/f0358e90-bca5-4b08-8be7-e05f95d6c683" alt="推文" loading="lazy"></p>
<figcaption class="figure"><a href="https://twitter.com/never_released/status/1151193050066149382">https://twitter.com/never_released/status/1151193050066149382</a></figcaption>

<p><img src="https://github.com/user-attachments/assets/412f9942-c072-4a0c-b6c9-d270ac3d1861" alt="截图" loading="lazy"></p>
<figcaption class="figure">疑似Win10ARM32截图</figcaption>
图中出现了一款只有arm编译版本的应用 **Clamour**，这表明运行该应用的设备应该是一款搭载arm芯片的平板

<style>
  figcaption.figure {
    color: #999;
    font-size: 0.875em;
    font-weight: bold;
    line-height: 1;
    margin: 5px auto 15px;
    text-align: center;
  }

  p+figcaption.figure,
  p+div.code-line+.figure {
    margin: -15px auto 15px;
  }

  @media (max-width: 567px) {
    .post-body p+figcaption.figure {
      margin: -5px auto 15px;
    }
  }
</style>]]></summary><title>Surface RT运行Win10图片泄露，Win10RT或存在过</title><updated>2019-07-19T03:49:21.000Z</updated></entry></feed>