<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yuxuan Guan</title>
    <description>The latest articles on DEV Community by Yuxuan Guan (@gyx114).</description>
    <link>https://dev.to/gyx114</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4085243%2Fd3efd978-01d5-4240-be7f-f07e1d9370ac.jpg</url>
      <title>DEV Community: Yuxuan Guan</title>
      <link>https://dev.to/gyx114</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gyx114"/>
    <language>en</language>
    <item>
      <title>How I Built a 20-in-1 Windows Toolbox with C++20 + MFC</title>
      <dc:creator>Yuxuan Guan</dc:creator>
      <pubDate>Wed, 19 Aug 2026 15:25:59 +0000</pubDate>
      <link>https://dev.to/gyx114/how-i-built-a-20-in-1-windows-toolbox-with-c20-mfc-13d</link>
      <guid>https://dev.to/gyx114/how-i-built-a-20-in-1-windows-toolbox-with-c20-mfc-13d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Open source: &lt;a href="https://github.com/gyx114/PowerBox" rel="noopener noreferrer"&gt;https://github.com/gyx114/PowerBox&lt;/a&gt; ｜ MIT License&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;A while ago I set myself a "practice" goal: &lt;strong&gt;write a C++ desktop app that I actually use every day — not another dead repo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's how PowerBox was born: a Windows toolbox that bundles an AI assistant, process manager, screen OCR, clipboard history, Git toolbox, batch rename, and 20+ utilities. Its most distinctive feature is this: &lt;strong&gt;the built-in AI assistant doesn't just answer questions — it can open a terminal, run commands by itself, and paste the results back into the conversation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post won't be a feature list. Instead, I want to share the three parts that matter most to developers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How I modernized an old MFC project (WebView2 migration, modular architecture)&lt;/li&gt;
&lt;li&gt;How the AI assistant executes commands through a built-in ConPTY terminal&lt;/li&gt;
&lt;li&gt;The "encoding consistency" trap that's easiest to overlook in a multi-language project&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language / Standard&lt;/td&gt;
&lt;td&gt;C++20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI Framework&lt;/td&gt;
&lt;td&gt;MFC (Microsoft Foundation Classes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Integration&lt;/td&gt;
&lt;td&gt;WinHTTP + 6 AI providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown / AI Rendering&lt;/td&gt;
&lt;td&gt;WebView2 (replacing WebBrowser)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;ConPTY (Windows Pseudo Console)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Nlohmann json.hpp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QR Code&lt;/td&gt;
&lt;td&gt;Nayuki QR Code Generator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Localization&lt;/td&gt;
&lt;td&gt;External INI files (UTF-16 LE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distribution&lt;/td&gt;
&lt;td&gt;Static-linked MFC/CRT, single exe + lang + res&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Why MFC? It's the most mature and stable C++ desktop framework on Windows, and this project is a "small but strong" monolith — no need to drag in Qt's heavyweight dependency tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Architecture: Turning a 1,000-line Dialog into Clean Modules
&lt;/h2&gt;

&lt;p&gt;The most common way MFC projects die: everything gets dumped into &lt;code&gt;OnInitDialog&lt;/code&gt; and a few callbacks, and after a few thousand lines nobody dares to touch it. My approach was two things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Split the main dialog by responsibility into separate source files&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;MFCApplication1Dlg_Buttons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpp&lt;/span&gt;   &lt;span class="c1"&gt;// quick-launch buttons&lt;/span&gt;
&lt;span class="n"&gt;MFCApplication1Dlg_File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpp&lt;/span&gt;      &lt;span class="c1"&gt;// file / folder management&lt;/span&gt;
&lt;span class="n"&gt;MFCApplication1Dlg_Process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpp&lt;/span&gt;   &lt;span class="c1"&gt;// process management&lt;/span&gt;
&lt;span class="n"&gt;MFCApplication1Dlg_Startup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpp&lt;/span&gt;   &lt;span class="c1"&gt;// startup items&lt;/span&gt;
&lt;span class="n"&gt;MFCApplication1Dlg_Terminal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpp&lt;/span&gt;  &lt;span class="c1"&gt;// terminal&lt;/span&gt;
&lt;span class="n"&gt;MFCApplication1Dlg_Tray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpp&lt;/span&gt;      &lt;span class="c1"&gt;// tray&lt;/span&gt;
&lt;span class="n"&gt;MFCApplication1Dlg_Window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpp&lt;/span&gt;    &lt;span class="c1"&gt;// window tools&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Extract reusable capabilities into independent modules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anything "UI-agnostic" — clipboard history, volume control, auto-clicker, OCR, process enumeration — lives in a separate Manager/Engine class. The main window just composes them. Each module can be tested in isolation, and the code is ready to be split into separate tools later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ProcessManager / ClipboardManager / VolumeManager / AutoClicker / OcrEngine / LocalizationManager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Three Key Implementations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 AI Assistant: Replacing WebBrowser with WebView2
&lt;/h3&gt;

&lt;p&gt;Early versions rendered the AI panel and Markdown preview with WebBrowser (MSHTML) — poor rendering and painful state management. I migrated everything to WebView2.&lt;/p&gt;

&lt;p&gt;The key design is &lt;strong&gt;two-way communication between HTML and C++&lt;/strong&gt;. The "Run" button on a command card calls from HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;execCmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// send the command id to C++ via WebView2 postMessage&lt;/span&gt;
    &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the C++ side, &lt;code&gt;OnWebMessageReceived&lt;/code&gt; receives the message and forwards it to the main dialog as a custom message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;CMFCApplication1Dlg&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnWebMessageReceived&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;wstring&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// parse message → resolve command → trigger execution&lt;/span&gt;
    &lt;span class="n"&gt;PostMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WM_AI_EXECUTE_COMMAND&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The benefit: &lt;strong&gt;rendering (HTML/CSS) and logic (C++) are fully decoupled&lt;/strong&gt;. Font sizes, themes, and scroll positioning can be handled via &lt;code&gt;ExecuteScript&lt;/code&gt; on the DOM without reloading the page — which is exactly what keeps the AI conversation state intact.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 AI Executing Commands: Talking to a ConPTY Terminal
&lt;/h3&gt;

&lt;p&gt;PowerBox ships a built-in ConPTY terminal with multiple sessions and tab switching. The AI command execution flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI generates command → confirmation dialog (shows purpose &amp;amp; risk level)
→ dispatched to a new terminal tab → async output read → result pasted back
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core of ConPTY is &lt;code&gt;CreatePseudoConsole&lt;/code&gt; + &lt;code&gt;CreateProcess&lt;/code&gt; attached to the pseudo console, with a background thread reading the pipe. The critical rule: &lt;strong&gt;always use a background thread + stop token, never block the UI thread waiting for output&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// std::jthread auto-joins; stop_token enables cancellation&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;jthread&lt;/span&gt; &lt;span class="nf"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stop_source&lt;/span&gt;&lt;span class="p"&gt;{}]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_token&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;stop_requested&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// read pipe output → notify UI to update&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Security gets two layers: the confirmation dialog shows the command's &lt;strong&gt;purpose and risk level&lt;/strong&gt; and requires explicit user approval, and AI-generated commands are never silently executed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Localization: The Encoding-Consistency Trap Nobody Warns About
&lt;/h3&gt;

&lt;p&gt;PowerBox supports 5 languages (CN/EN/JA/KO/RU) with language packs in external &lt;code&gt;lang/*.ini&lt;/code&gt;. This is the area most likely to blow up, because the encoding requirements are strict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.rc&lt;/code&gt; resource files = &lt;strong&gt;UTF-16 LE BOM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lang/*.ini&lt;/code&gt; language packs = &lt;strong&gt;UTF-16 LE BOM&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you edit a &lt;code&gt;.rc&lt;/code&gt; file with a regular editor, it silently converts to UTF-8 and the RC compiler starts throwing weird errors like &lt;code&gt;RC4093 / RC2255&lt;/code&gt;. The safe way is to control the encoding explicitly with PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .rc or .ini edits must read/write as UTF-16 LE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.IO.File&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;ReadAllText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"xxx.rc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Text.Encoding&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Unicode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"old string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"new string"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.IO.File&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;WriteAllText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"xxx.rc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Text.Encoding&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Unicode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This deserves emphasis: &lt;strong&gt;in a multi-language project, encoding consistency causes more damage than feature bugs&lt;/strong&gt; — and it surfaces as garbled Chinese, the hardest kind of bug to debug.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Distribution: Static Linking, Portable Single Exe
&lt;/h2&gt;

&lt;p&gt;MFC/CRT are fully statically linked, and the release artifact is only 4 items:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PowerBox.exe          // main executable
WebView2Loader.dll    // WebView2 loader
lang/                 // 5 language packs
res/                  // Markdown rendering resources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No runtime installation needed — unzip and run, no registry writes, which fits a "toolbox you can carry anywhere" positioning. The WebView2 Runtime is pre-installed on Win10/11 in most cases, so only the loader DLL needs to ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Pitfall Checklist (Save Yourself Three Months)
&lt;/h2&gt;

&lt;p&gt;Ranked by how much they cost me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Encoding consistency&lt;/strong&gt; (most expensive): &lt;code&gt;.rc&lt;/code&gt; / &lt;code&gt;lang/*.ini&lt;/code&gt; must be UTF-16 LE — wrong encoding equals garbled Chinese plus RC compile errors, the hardest thing to debug&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocking the UI thread&lt;/strong&gt;: OCR, translation, and terminal reads must run on background threads (&lt;code&gt;std::jthread&lt;/code&gt; + stop_token); calling &lt;code&gt;.get()&lt;/code&gt; on the UI thread freezes the whole app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource ID collisions&lt;/strong&gt;: before adding any control, check &lt;code&gt;resource.h&lt;/code&gt; / &lt;code&gt;.rc&lt;/code&gt; / the message map — duplicate IDs plant landmines in both compile time and runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-modal dialog destruction&lt;/strong&gt;: calling &lt;code&gt;DestroyWindow()&lt;/code&gt; directly accesses a freed &lt;code&gt;this&lt;/code&gt;; use &lt;code&gt;PostMessage(WM_CLOSE)&lt;/code&gt; for deferred destruction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool windows minimized with the main window&lt;/strong&gt;: tool windows must use &lt;code&gt;nullptr&lt;/code&gt; as parent so they're independent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot overlay flicker&lt;/strong&gt;: recreating a DIB and filling the whole screen on every mouse drag causes severe flicker; pre-create a DIB and do incremental double-buffered updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't hand-roll QR codes&lt;/strong&gt;: error-correction logic is full of edge cases; just use a proven library like Nayuki's&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.gitignore&lt;/code&gt; encoding too&lt;/strong&gt;: a UTF-16-encoded .gitignore makes Git misparse rules (e.g. &lt;code&gt;*.aps&lt;/code&gt; becomes &lt;code&gt;*&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  6. Open Source &amp;amp; What's Next
&lt;/h2&gt;

&lt;p&gt;PowerBox is currently v4.1.0, MIT licensed, with source and releases on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/gyx114/PowerBox" rel="noopener noreferrer"&gt;https://github.com/gyx114/PowerBox&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The README is available in 5 languages with a full feature table and screenshots. If you're working on C++/MFC projects, or you're curious about the "AI assistant + terminal" interaction pattern, come check out the repo. A star is the biggest encouragement.&lt;/p&gt;

&lt;p&gt;Questions, bug reports, or MFC development chat — feel free to reach out via Issue or comments.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>mfc</category>
      <category>opensource</category>
      <category>microsoft</category>
    </item>
  </channel>
</rss>
