diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index dd84ea78..9a5fa7b3 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,38 +1,25 @@
---
name: Bug report
-about: Create a report to help us improve
+about: Report a problem in the Windows API Code Pack
title: ''
-labels: ''
+labels: bug
assignees: ''
-
---
**Describe the bug**
-A clear and concise description of what the bug is.
+A clear description of what went wrong.
-**To Reproduce**
-Steps to reproduce the behavior:
-1. Go to '...'
-2. Click on '....'
-3. Scroll down to '....'
-4. See error
+**To reproduce**
+Minimal code or steps.
**Expected behavior**
-A clear and concise description of what you expected to happen.
-
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
-
-**Desktop (please complete the following information):**
- - OS: [e.g. iOS]
- - Browser [e.g. chrome, safari]
- - Version [e.g. 22]
+What you expected to happen.
-**Smartphone (please complete the following information):**
- - Device: [e.g. iPhone6]
- - OS: [e.g. iOS8.1]
- - Browser [e.g. stock browser, safari]
- - Version [e.g. 22]
+**Environment**
+- Windows version / build:
+- .NET TFM (e.g. net48, net10.0-windows):
+- NuGet package ID and version (e.g. WindowsAPICodePackShell 8.0.15.2):
+- App type: WinForms / WPF / other:
**Additional context**
-Add any other context about the problem here.
+Exception text, screenshots, or a link to a small repro project.
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 6309c347..5ad14ce9 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -9,7 +9,7 @@ This repository includes comprehensive GitHub Actions workflows for building, te
**Features:**
- Builds all .NET projects (.NET Framework 4.6.2-4.8.1, .NET 8-10)
-- Builds C++ DirectX project (x64, x86 platforms)
+- DirectX stub is not built or packaged
- Runs tests and uploads results
- Validates NuGet package generation
- Performs security scans
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 21db4577..39fe4d87 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -89,16 +89,10 @@ jobs:
/p:InformationalVersion=${{ steps.set-version.outputs.full-version }}+${{ github.sha }}
working-directory: .
- - name: Build C++ DirectX project
- run: |
- msbuild "Source/Current/Windows API CodePack/Components/DirectX/DirectX.vcxproj" /p:Configuration=${{ matrix.configuration }} /p:Platform=${{ matrix.platform }} /p:PlatformToolset=v143 /verbosity:normal
- working-directory: .
-
- - name: Run tests (if any)
+ - name: Run tests
run: |
dotnet test "${{ env.SOLUTION_PATH }}" --configuration ${{ matrix.configuration }} --platform ${{ matrix.platform }} --no-build --verbosity normal --logger trx --results-directory TestResults
working-directory: .
- continue-on-error: true
- name: Upload test results
uses: actions/upload-artifact@v4
@@ -149,9 +143,9 @@ jobs:
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- - name: Validate NuGet packages
+ - name: Restore and pack NuGet packages
run: |
- dotnet pack "${{ env.SOLUTION_PATH }}" --configuration Release --no-build --verbosity normal --output ./packages
+ dotnet pack "${{ env.SOLUTION_PATH }}" --configuration Release --verbosity normal --output ./packages
working-directory: .
- name: Validate package contents
diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml
index 753c0b05..bc1ed8b9 100644
--- a/.github/workflows/pr-validation.yml
+++ b/.github/workflows/pr-validation.yml
@@ -38,11 +38,6 @@ jobs:
dotnet build "${{ env.SOLUTION_PATH }}" --configuration Release --no-restore --verbosity normal
working-directory: .
- - name: Build C++ DirectX project
- run: |
- msbuild "Source/Current/Windows API CodePack/Components/DirectX/DirectX.vcxproj" /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /verbosity:normal
- working-directory: .
-
- name: Run code analysis
run: |
dotnet build "${{ env.SOLUTION_PATH }}" --configuration Release --no-restore --verbosity normal --property:RunAnalyzersDuringBuild=true
@@ -135,7 +130,9 @@ jobs:
New-Item -ItemType Directory -Path $extractPath -Force | Out-Null
# Extract package
- Expand-Archive -Path $package.FullName -DestinationPath $extractPath -Force
+ $zipPath = [System.IO.Path]::ChangeExtension($package.FullName, ".zip")
+ Copy-Item $package.FullName $zipPath -Force
+ Expand-Archive -Path $zipPath -DestinationPath $extractPath -Force
# Check for required files
$nuspecFile = Get-ChildItem -Path $extractPath -Filter "*.nuspec" -Recurse
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 0bb8c2c2..83edf5a2 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -152,11 +152,6 @@ jobs:
dotnet build "${{ env.SOLUTION_PATH }}" $buildProps
working-directory: .
- - name: Build C++ DirectX project
- run: |
- msbuild "Source/Current/Windows API CodePack/Components/DirectX/DirectX.vcxproj" /p:Configuration=Release /p:Platform=${{ matrix.platform }} /p:PlatformToolset=v143 /verbosity:normal
- working-directory: .
-
- name: Pack NuGet packages
run: |
dotnet pack "${{ env.SOLUTION_PATH }}" --configuration Release --platform ${{ matrix.platform }} --no-build --verbosity normal --output ./packages
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..7b6d3c5e
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,22 @@
+# Contributing
+
+Active development is under `Source/Current/Windows API CodePack`. `Source/Original` is an archive (legacy tests, full DirectX, original samples).
+
+## Build
+
+```powershell
+dotnet restore "Source/Current/Windows API CodePack/Windows API CodePack.sln"
+dotnet build "Source/Current/Windows API CodePack/Windows API CodePack.sln" -c Release
+dotnet test "Source/Current/Windows API CodePack/Windows API CodePack.sln" -c Release
+```
+
+Requires a Windows machine (WinForms/WPF/COM Shell APIs). Supported library TFMs: `net462`–`net481` and `net8.0-windows` / `net9.0-windows` / `net10.0-windows`.
+
+## Pull requests
+
+- Prefer small, focused changes with tests when the behavior is unit-testable.
+- Do not add machine-specific HintPaths or commit `bin`/`obj` outputs.
+- DirectX in Current is an unshipped stub; do not expand it. See `Source/Current/Windows API CodePack/Components/DirectX/README.md`.
+- Update `Changelog.md` for user-visible fixes and features.
+
+See [Source/Current/ROADMAP.md](Source/Current/ROADMAP.md) for planned work.
diff --git a/README.md b/README.md
index a3570801..22b9a4cb 100644
--- a/README.md
+++ b/README.md
@@ -1,117 +1,83 @@
-# Microsoft Windows API Codepack
+# Windows API Code Pack for .NET
[](https://github.com/Wagnerp/Windows-API-CodePack-NET/actions/workflows/ci.yml)
[](https://github.com/Wagnerp/Windows-API-CodePack-NET/actions/workflows/release.yml)
[](https://www.nuget.org/packages/WindowsAPICodePackCore/)
[](https://www.nuget.org/packages/WindowsAPICodePackCore/)
-=========================
+Managed wrappers for selected Windows Shell and desktop APIs, originally released by Microsoft as the Windows API Code Pack 1.1 and maintained here for modern .NET.
-License
--------
+**Active source:** [`Source/Current/Windows API CodePack`](Source/Current/Windows%20API%20CodePack)
+**License:** MIT — see [LICENSE](LICENSE)
+**Roadmap:** [Source/Current/ROADMAP.md](Source/Current/ROADMAP.md) · **Changes:** [Changelog.md](Changelog.md)
-The library is not developed anymore by Microsoft and seems to have been left as 'free to use'. A clarification or update about the licence terms from Microsoft is welcome, however.
-
-Release notes
--------------
+## Packages
-This release has the latest bug fixes applied, including the fix for 64-bit exceptions.
+| Package | Contents |
+|---------|----------|
+| [WindowsAPICodePack](https://www.nuget.org/packages/WindowsAPICodePack/) | Meta-package (all components) |
+| [WindowsAPICodePackCore](https://www.nuget.org/packages/WindowsAPICodePackCore/) | Task Dialogs, power, network list, restart/recovery |
+| [WindowsAPICodePackShell](https://www.nuget.org/packages/WindowsAPICodePackShell/) | Shell objects, Common File Dialogs, Explorer Browser, taskbar |
+| [WindowsAPICodePackSensors](https://www.nuget.org/packages/WindowsAPICodePackSensors/) | Sensor platform |
+| [WindowsAPICodePackExtendedLinguisticServices](https://www.nuget.org/packages/WindowsAPICodePackExtendedLinguisticServices/) | Extended Linguistic Services |
+| [WindowsAPICodePackShellExtensions](https://www.nuget.org/packages/WindowsAPICodePackShellExtensions/) | Preview handlers and thumbnail providers |
-Bugs
-----
+**Target frameworks:** .NET Framework 4.6.2–4.8.1 and .NET 8 / 9 / 10 (`net*-windows`). Windows desktop (WinForms/WPF) only.
-When you submit a bug:
+DirectX from the original Code Pack is **not shipped** in 8.x. The Current tree keeps an unbuilt stub; see [`Components/DirectX/README.md`](Source/Current/Windows%20API%20CodePack/Components/DirectX/README.md).
- - provide a short example code showing the bug
- - describe the expected behavior/result
- - if a pull request is applicable, please reference it
+## Usage notes
-Pull Requests
--------------
+### TaskDialog and comctl32 v6
-I'll be glad to accept pull requests if they fix a bug or add a worthwhile feature.
+If creating a `TaskDialog` throws `NotSupportedException` about comctl32.dll version 6, enable Common Controls v6 in the application manifest:
+```xml
+
+
+
+
+
+```
-Usage notes
------------
+Visual Studio can cache the old DLL in-process; restart the IDE if the error persists after adding the manifest.
-**TaskDialog**
+### Authenticode signing
-If you get the following exception when you instantiate a `TaskDialog`:
+Optional during build. Disabled by default.
-```
-An unhandled exception of type 'System.NotSupportedException' occurred in Microsoft.WindowsAPICodePack.dll
+**Certificate file:**
-Additional information: TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory.
+```xml
+
+ true
+ path\to\your\certificate.pfx
+ your-password
+
```
-To fix it, create an application manifest and un-comment the following block section:
+**Certificate store:**
+```xml
+
+ true
+ your-certificate-thumbprint
+
```
-
-
-```
-
-Note: you might have to restart Visual Studio as the DLLs seems to be cached in memory and rebuilding your project doesn't seem to be enough in some cases.
-
-**DirectX**
-
-The DirectX package will work under x86 and x64 configuration platforms but not for AnyCPU platform (because there is no such platform for C++/CLI projects). Consequently, the package will purposefully fail the build and tell you why it did.
-
-Note: package is here for historical reasons, it is highly recommended to use [SharpDX](http://sharpdx.org/) instead.
-
-**Authenticode Signing**
-
-The project supports Authenticode signing of DLLs to provide code integrity verification. To enable Authenticode signing during build:
-
-1. **Using a Certificate File (.pfx):**
- ```xml
-
- true
- path\to\your\certificate.pfx
- your-password
-
- ```
-
-2. **Using a Certificate from Certificate Store:**
- ```xml
-
- true
- your-certificate-thumbprint
-
- ```
-
-3. **Via MSBuild Command Line:**
- ```bash
- dotnet build /p:EnableAuthenticodeSigning=true /p:CodeSigningCertificatePath="path\to\certificate.pfx" /p:CodeSigningCertificatePassword="password"
- ```
-
-**Requirements:**
-- Windows SDK must be installed (SignTool.exe is required)
-- A valid code signing certificate (either .pfx file or installed in certificate store)
-- The certificate must be valid for code signing
-
-**Note:** Authenticode signing is disabled by default. You must explicitly enable it by setting `EnableAuthenticodeSigning=true`. The build will continue even if signing fails (with a warning), so you can build without a certificate for development purposes.
-**GitHub Actions Workflow Support:**
+Requires Windows SDK (`SignTool.exe`). The build continues with a warning if signing fails. For GitHub Actions, see [`.github/workflows/README.md`](.github/workflows/README.md) (`CODESIGN_CERTIFICATE_BASE64`, `CODESIGN_CERTIFICATE_PASSWORD`).
-Authenticode signing is also supported in GitHub Actions workflows. To enable signing in release builds:
+## Samples and original tree
-1. Add your code signing certificate as a GitHub secret:
- - `CODESIGN_CERTIFICATE_BASE64`: Base64-encoded PFX certificate file
- - `CODESIGN_CERTIFICATE_PASSWORD`: Certificate password (if required)
+- [`Source/Samples`](Source/Samples) — mix of modernized and legacy demos; prefer samples that reference `Source/Current`.
+- [`Source/Original`](Source/Original) — archive of the Microsoft-era sources, tests, and full DirectX.
-2. The release workflow will automatically sign all DLLs when these secrets are present.
+## Contributing
-See `.github/workflows/README.md` for detailed setup instructions.
\ No newline at end of file
+See [CONTRIBUTING.md](CONTRIBUTING.md). Bug reports should include Windows version, TFM, and package version ([template](.github/ISSUE_TEMPLATE/bug_report.md)).
diff --git a/SECURITY.md b/SECURITY.md
index bb6c3fd7..d36bfb27 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,18 +1,16 @@
# Security Policy
-## Supported Versions
+## Supported versions
-Use this section to tell people about which versions of your project are
-currently being supported with security updates.
+| Version | Supported |
+|---------|-----------|
+| 8.0.x | Yes |
+| Earlier | No |
-| Version | Supported |
-| ------- | ------------------ |
-| 8.0.x | :white_check_mark: |
+Security fixes are released on the current 8.0.x NuGet line.
-## Reporting a Vulnerability
+## Reporting a vulnerability
-Use this section to tell people how to report a vulnerability.
+Please use [GitHub Security Advisories](https://github.com/Wagnerp/Windows-API-CodePack-NET/security/advisories/new) for this repository. Do not open a public issue for unreleased vulnerabilities.
-Tell them where to go, how often they can expect to get an update on a
-reported vulnerability, what to expect if the vulnerability is accepted or
-declined, etc.
+You should receive an acknowledgement within a few days. If the report is accepted, a fix will be targeted for the next patch release when practical. If it is declined, we will explain why.
diff --git a/Source/Current/ROADMAP.md b/Source/Current/ROADMAP.md
new file mode 100644
index 00000000..c759cab9
--- /dev/null
+++ b/Source/Current/ROADMAP.md
@@ -0,0 +1,300 @@
+# Windows API Code Pack — Current Codebase Roadmap
+
+**Scope:** `Source/Current/Windows API CodePack`
+**Audit date:** 2026-07-19
+**Library version at audit:** 8.0.15.2
+
+This document is an audit-driven roadmap for improving, modernizing, and sustaining the active Code Pack. Items are prioritized **P0 → P2** and grouped by theme. Effort is approximate (S / M / L).
+
+---
+
+## Executive summary
+
+`Current` is a solid multi-TFM modernization of the classic Windows API Code Pack (SDK-style projects, nullable, .NET 8–10, NuGet packaging, CI/release pipelines). The largest gaps are **no automated tests**, **legacy interop and UI coupling**, a **DirectX stub that misleads consumers**, and **ecosystem debt** (stale docs, broken samples, inconsistent package metadata).
+
+| Area | Health | Headline |
+|------|--------|----------|
+| Multi-TFM / packaging | Good | net462–481 + net8/9/10-windows; signed packages; meta-package |
+| CI / release | Good− | Mature workflows; tests and some validation are no-ops/fragile |
+| Code quality | Mixed | Nullable + XML docs on; heavy COM/`DllImport`/`Hashtable` legacy |
+| Tests | Poor | Zero tests under Current |
+| Samples / docs | Poor | Many samples broken; root README stale |
+| DirectX | Deprecated | Empty native stub; not packaged |
+
+**Preserve:** TaskDialog, CommonFileDialogs, ExplorerBrowser (incl. search), Taskbar/JumpList/TabbedThumbnails, Shell property system, Sensors, ShellExtensions preview/thumbnail handlers, Authenticode signing support.
+
+---
+
+## Component map
+
+| Component | Role | ~CS files | Notes |
+|-----------|------|-----------|-------|
+| **Core** | TaskDialog, power, network, AppRestartRecovery, PropVariant, SafeHandles | ~124 | `UseWindowsForms` may be broader than needed |
+| **Shell** | Shell objects, dialogs, ExplorerBrowser, Taskbar, KnownFolders, DWM | ~335 | Largest surface; WPF + hard-coded WinForms refs |
+| **ShellExtensions** | Preview / thumbnail COM handlers | ~69 | Same WinForms HintPath pattern as Shell |
+| **Sensors** | Sensor API wrappers | ~93 | Recent NRE fix (#47) |
+| **ExtendedLinguisticServices** | ELS / mapping services | ~75 | Niche; still useful |
+| **WindowsAPICodePack** | Meta NuGet (all DLLs) | — | Best “one package” story |
+| **DirectX** | Stub DLL | 0 CS | Not shipped; CI still builds it |
+| **BugTest / ScratchProject** | Manual repro apps | — | Should not stay in shipping solution long-term |
+
+---
+
+## P0 — Critical (trust, correctness, consumer clarity)
+
+### 1. Add automated tests under Current
+**Effort:** L · **Why:** No regression gate; CI “Run tests” is effectively a no-op (`continue-on-error`). Recent bugs (ShellThumbnail COM lifetime, Sensors NRE, CommonFileDialog extension/name, ExplorerBrowser focus) are high-value regression cases.
+
+**Actions:**
+- Create `Source/Current/Windows API CodePack/Tests/` (xUnit or NUnit), TFMs at least `net48` + `net10.0-windows`.
+- Port viable tests from `Source/Original/source/Tests/` (PropVariant, PropertyKey, KnownFolders, Sensors metadata, ELS).
+- Add focused regression tests for Changelog-fixed issues (8.0.12–8.0.15.x).
+- Wire into `Windows API CodePack.slnx` and make CI fail on test failure.
+
+### 2. Fix Shell / ShellExtensions WinForms references
+**Effort:** S · **Why:** Hard-coded HintPaths to .NET Framework 4.8.1 reference assemblies break portable/CI-clean builds and fight SDK-style TFMs:
+
+```xml
+
+
+ C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8.1\...
+
+```
+
+**Actions:**
+- Prefer `true` (and keep `UseWPF`) instead of absolute HintPaths.
+- Verify multi-TFM build (net462–net481 and net*-windows) without machine-specific paths.
+
+### 3. Clarify / retire DirectX in Current
+**Effort:** S · **Why:** `Components/DirectX` is an empty Win32 DLL stub (not C++/CLI). Root README still describes C++/CLI AnyCPU limits. Consumers are misled; CI spends matrix time building it; toolset mismatch (project v145 vs workflows often v143).
+
+**Actions:**
+- Document clearly: DirectX is **not** in NuGet 8.x; recommend SharpDX / Vortice / Windows App SDK / Win2D as appropriate.
+- Prefer removing stub + CI steps from Current (keep Original as archive), or stop building it in CI if retained for solution compatibility.
+
+### 4. Rewrite consumer-facing documentation
+**Effort:** M · **Why:** Root `README.md` and component `Readme.md` files still read like the Microsoft-era pack (empty “Current Version”, 64-bit exception headline, DirectX C++/CLI notes). License on disk is MIT (Wagner modifications); README still hedges as if unclear.
+
+**Actions:**
+- Document: active path (`Source/Current`), NuGet IDs, supported TFMs, Windows requirements, samples status.
+- Point to `Changelog.md`, this roadmap, and workflow docs.
+- Refresh NuGet package **Description** fields (several still say “Windows Forms Development in the 1.1 version, released by Microsoft in 2009” despite .NET 8–10 support).
+- Fix package metadata inconsistencies (`RepositoryUrl` is literally `git` on Core/meta; Authors = package title).
+
+### 5. Fix fragile CI packaging validation
+**Effort:** S · **Why:** `package-validation` packing with `--no-build` in a separate job without artifacts is unreliable; PR nupkg “zip” validation is suspect.
+
+**Actions:**
+- Pack in the build job or pass artifacts between jobs.
+- Validate packages with `dotnet nuget` / proper tooling, not ad-hoc zip assumptions.
+
+---
+
+## P1 — High value (maintainability & modernization)
+
+### 6. Modernize P/Invoke surface
+**Effort:** L · **Evidence:** ~127 `DllImport`, **0** `LibraryImport`; only **4** SafeHandle types; ~62 `Marshal.ReleaseComObject`.
+
+**Actions:**
+- Migrate declarations to `[LibraryImport]` / source-generated interop where TFMs allow (net8+), with dual-path or polyfills for net462+.
+- Evaluate **CsWin32** for new/changed APIs to reduce hand-written marshalling bugs.
+- Expand SafeHandle usage (icons, windows, GDI objects, shell item lifetimes) beyond `SafeIconHandle` / `SafeWindowHandle` / `SafeRegionHandle`.
+- Prefer `Marshal.FinalReleaseComObject` / careful RCW ownership patterns; audit sites that release COM while still referenced (ShellThumbnail parent-ref pattern is the template).
+
+### 7. Reduce UI-framework coupling
+**Effort:** L · **Why:** Core/Sensors/ELS force `UseWindowsForms`; Shell forces WPF + WinForms. That pulls desktop UI stacks into consumers who only want TaskDialog, Jump Lists, or KnownFolders.
+
+**Actions (incremental):**
+- Split or multi-target: e.g. `Core` APIs that don’t need WinForms vs dialog hosts.
+- Consider optional packages: `WindowsAPICodePack.Shell.WinForms` / `.Wpf` vs a thinner Shell.Interop core.
+- Ensure `System.Drawing` usage is intentional (`System.Drawing.Common` implications on modern .NET).
+
+### 8. Replace legacy collections & CAS leftovers
+**Effort:** M · **Evidence:** ~38 `Hashtable` usages (notably generated `StronglyTypedProperties.cs`), ~6 `ArrayList`; `PowerManager` disables `SYSLIB0003` (CAS); obsolete `ClassInterfaceType.AutoDual` on ExplorerBrowser view events; ~982 SuppressMessage hits (many legacy FxCop/LinkDemand).
+
+**Actions:**
+- Replace `Hashtable`/`ArrayList` with `Dictionary<,>` / `List<>` in hand-written code; regenerate property wrappers with modern collections.
+- Remove CAS/`SecurityPermission` demands where obsolete on .NET Core+; keep netfx behavior documented if needed.
+- Prune `GlobalSuppressions` (Shell’s file alone ~199 KB) — many CA2122/LinkDemand rules are irrelevant on modern runtimes.
+
+### 9. Address known incomplete / risky Shell APIs
+**Effort:** M · **Examples:**
+- `StronglyTypedProperties.cs` — **~14k lines**, marked `// TODO: FIX THIS!!!`, Hashtable-backed cache.
+- `SystemProperties.cs` — **~10k lines** of generated property keys; keep as generated, improve generator.
+- `ShellItemArrayWrapper` — most `IShellItemArray` members throw `NotImplementedException`.
+- `ShellLibrary` — several `NotImplementedException` paths.
+- `TaskbarWindow.WindowToTellTaskbarAbout` — open TODO: throws `InvalidOperationException` in valid construction races.
+- `TabbedThumbnailManager` — TODO around `SetImage(IntPtr.Zero)`.
+- `IEntity.cs` — empty `// TODO`.
+
+**Actions:**
+- Triage: implement, obsolete, or document “partial COM surface” per type.
+- Fix TaskbarWindow title/proxy logic with tests (aligns with active TabbedThumbnail work).
+- Move property-system generation to an explicit tool/script in-repo so `FIX THIS` isn’t tribal knowledge.
+
+### 10. Migrate and catalog samples
+**Effort:** L · **Why:** Mix of modernized SDK samples and broken .NET 3.5 / wrong project-reference samples.
+
+**Actions:**
+- Add `Source/Samples/README.md` with status matrix (✅ / 🔧 / ❌).
+- Fix broken ExplorerBrowser demos that reference non-existent split Shell projects.
+- Prioritize migrating: TaskDialog, CommonFileDialogs, Taskbar, KnownFolders, ShellThumbnail.
+- Add `net10.0-windows` to modernized samples for parity.
+- Optional CI job building a curated samples solution.
+
+### 11. Retire BugTest / ScratchProject from the product solution
+**Effort:** S · **Why:** Manual repro harnesses duplicate ShellThumbnail scenarios; not automated tests.
+
+**Actions:**
+- Fold scenarios into Tests; move leftovers to an internal/samples folder or delete.
+- Keep `IsPackable=false`; exclude from release packaging.
+
+### 12. Align versioning story
+**Effort:** S · **Why:** Packages use 4-part versions (`8.0.15.2`); docs describe semver 3-part; version-increment workflow examples are stale.
+
+**Actions:**
+- Pick one scheme and document it in `.github/VERSIONING.md`.
+- Keep `Directory.Build.props` / targets / NuGet / assembly versions aligned (already a past pain point).
+
+### 13. Security & contribution hygiene
+**Effort:** S
+**Actions:**
+- Replace boilerplate `SECURITY.md` with reporting channel + supported versions.
+- Add `CONTRIBUTING.md` (build Current, TFMs, samples policy, PR expectations).
+- Windows/.NET-focused issue templates (OS build, TFM, package version, minimal repro).
+
+### 14. Local build parity
+**Effort:** S
+**Actions:**
+- Add root `build.ps1` (`restore` / `build` / `test` / `pack` / optional sign) matching CI.
+- Document dual `.sln` vs `.slnx` or consolidate.
+
+### 15. Dependency cleanup
+**Effort:** S
+**Actions:**
+- Revisit `Microsoft.NETCore.Platforms` 7.0.4 on Core/Sensors/ELS — often unnecessary on modern SDKs.
+- Enable consistent analyzers (`AnalysisLevel`, nullable warnings as errors in CI for net8+ first).
+
+---
+
+## P2 — Enhancements & future API surface
+
+### 16. Feature enhancements (product)
+| Idea | Notes |
+|------|--------|
+| **Win11 taskbar / Jump List polish** | Validate against current Shell behavior; document limitations vs WinUI/WASDK |
+| **IFileDialog customization** | More CommonFileDialog controls / events parity with native dialogs |
+| **ExplorerBrowser** | Continue search/navigation/event work (#14, #20, #21, #40); keyboard/focus edge cases |
+| **Shell property keys** | Refresh PKEY set for newer Windows properties; keep generation pipeline |
+| **Async APIs** | Optional `*Async` wrappers for long Shell ops / ELS mapping where useful |
+| **WinRT / Windows App SDK interop notes** | Not necessarily reimplement — document when to use WASDK vs Code Pack |
+| **Dark mode / DWM** | Optional helpers for modern glass/backdrop where DWM APIs still apply |
+| **AOT / trimming guidance** | Library is COM-heavy; publish trim/AOT warnings and supported scenarios rather than claiming full AOT |
+
+### 17. Packaging / architecture experiments
+- Source-link + deterministic builds verification.
+- Separate “interop-only” package without WPF/WinForms for advanced consumers.
+- Public API analyzers (`Microsoft.CodeAnalysis.PublicApiAnalyzers`) to catch breaking changes intentionally (PR workflow already has heuristics).
+
+### 18. ELS & Sensors longevity
+- Document Windows platform support (Sensors API availability varies).
+- Keep Sensors enumeration defensive (post-#47).
+- ELS: consider deprecation notice if usage is near-zero, or refresh samples.
+
+### 19. VB samples policy
+- Migrate top VB demos **or** formally deprecate and link C# equivalents.
+
+### 20. Housekeeping
+- Remove deprecated `build.yml` if unused; refresh `WORKFLOW_STATUS.md`.
+- Deduplicate component NuGet readmes (component-specific content, not copy-paste root).
+- Archive note at top of `Source/Original` (“read-only; tests/DirectX live here historically”).
+
+---
+
+## Suggested phasing
+
+### Phase A — Stabilize (in progress)
+
+1. Tests + blocking CI
+2. Shell WinForms HintPath fix
+3. DirectX docs/removal from CI
+4. README + NuGet description/metadata fix
+5. CI pack validation fix
+
+### Phase B — Harden (2–4 releases)
+6. Port Original tests + regression suite
+7. TaskbarWindow / TabbedThumbnail TODOs
+8. Sample migration wave 1
+9. LibraryImport pilot on Core native methods
+10. Retire ScratchProject/BugTest
+
+### Phase C — Modernize (ongoing)
+11. Property-system generator rewrite
+12. UI framework package split exploration
+13. Suppressions / Hashtable cleanup
+14. Optional async / Win11 polish
+15. Public API analyzer + samples CI
+
+---
+
+## Metrics to track
+
+| Metric | Current (audit) | Target |
+|--------|-----------------|--------|
+| Automated tests in Current | 0 | Growing suite; CI required |
+| `LibraryImport` usage | 0 | Increasing share of new/changed P/Invokes |
+| Broken samples (known) | Large share of `Source/Samples` | Curated set all ✅ |
+| Hard-coded Framework HintPaths | 2 projects | 0 |
+| DirectX in Current CI | Built | Removed or documented-only |
+| Package Description accuracy | Stale (2009-era) | Matches TFMs & features |
+| Open `TODO` / incomplete COM stubs | Several known | Triaged (fixed or documented) |
+
+---
+
+## Strengths to keep
+
+- Active maintenance and Changelog discipline (ExplorerBrowser search, Authenticode, .NET 10, real bugfixes).
+- Broad TFM matrix for desktop apps still on .NET Framework **and** modern .NET.
+- Coherent component split + unified meta-package.
+- XML documentation generation enabled on library projects.
+- Nullable reference types enabled across components.
+- Strong-name + optional Authenticode story for enterprise consumers.
+
+---
+
+## Out of scope / non-goals (recommended)
+
+- Full reimplementation of Original DirectX C++/CLI in Current.
+- Competing with Windows App SDK / WinUI for new app models — **interop and desktop WinForms/WPF** remain the niche.
+- Breaking public API churn without PublicApi analyzer + major version bump.
+
+---
+
+## Quick reference paths
+
+```
+Source/Current/Windows API CodePack/
+├── Components/
+│ ├── Core/
+│ ├── Shell/
+│ ├── ShellExtensions/
+│ ├── Sensors/
+│ ├── ExtendedLinguisticServices/
+│ ├── WindowsAPICodePack/ # meta-package
+│ └── DirectX/ # stub — decide fate
+├── BugTest/ # manual repro
+├── ScratchProject/ # manual repro
+├── Directory.Build.props|targets
+└── Windows API CodePack.sln(x)
+
+Related (outside Current, but roadmap-relevant):
+├── Source/Original/source/Tests/ # legacy tests to port
+├── Source/Samples/ # mixed modern/broken
+├── .github/workflows/ # CI/release
+├── README.md / Changelog.md / SECURITY.md
+└── Directory.Build.props # LibraryVersion
+```
+
+---
+
+*This roadmap is a living document. Update priorities as releases ship and as DirectX / samples / test decisions are made.*
diff --git a/Source/Current/Windows API CodePack/BugTest/BugTest.csproj b/Source/Current/Windows API CodePack/BugTest/BugTest.csproj
index 3c867ca5..4fe8060c 100644
--- a/Source/Current/Windows API CodePack/BugTest/BugTest.csproj
+++ b/Source/Current/Windows API CodePack/BugTest/BugTest.csproj
@@ -8,6 +8,8 @@
enablepreviewpreview
+ false
+ false
diff --git a/Source/Current/Windows API CodePack/Components/Core/Core.csproj b/Source/Current/Windows API CodePack/Components/Core/Core.csproj
index 06a4a471..3e2fdefc 100644
--- a/Source/Current/Windows API CodePack/Components/Core/Core.csproj
+++ b/Source/Current/Windows API CodePack/Components/Core/Core.csproj
@@ -16,7 +16,7 @@
TrueWindowsAPICodePackCore
- This package contains the core binary for the Windows API Code Pack needed for Windows Forms Development in the 1.1 version, released by Microsoft in 2009.
+ Core Windows API Code Pack types: Task Dialogs, power management, network list, application restart/recovery, and property-system primitives. Targets .NET Framework 4.6.2–4.8.1 and .NET 8–10 (Windows).License.md
@@ -26,12 +26,6 @@
Windows.png
- https://github.com/Wagnerp/Windows-API-CodePack-NET
-
- git
-
- $(Title)
-
$(Title)True
@@ -45,10 +39,6 @@
..\..\..\..\..\Output\bin
-
-
-
-
True
diff --git a/Source/Current/Windows API CodePack/Components/Core/Readme.md b/Source/Current/Windows API CodePack/Components/Core/Readme.md
index f08b1ecb..9d51a092 100644
--- a/Source/Current/Windows API CodePack/Components/Core/Readme.md
+++ b/Source/Current/Windows API CodePack/Components/Core/Readme.md
@@ -1,73 +1,7 @@
-Microsoft Windows API Codepack
-=========================
+# WindowsAPICodePackCore
-README
-======
+Task Dialogs, power management, network list, application restart/recovery, and property-system primitives (`PropertyKey`, `PropVariant`).
-## Current Version
+Install: `dotnet add package WindowsAPICodePackCore`
-
-
-License
--------
-
-The library is not developed anymore by Microsoft and seems to have been left as 'free to use'. A clarification or update about the licence terms from Microsoft is welcome, however.
-
-Release notes
--------------
-
-This release has the latest bug fixes applied, including the fix for 64-bit exceptions.
-
-Bugs
-----
-
-When you submit a bug:
-
- - provide a short example code showing the bug
- - describe the expected behavior/result
- - if a pull request is applicable, please reference it
-
-Pull Requests
--------------
-
-I'll be glad to accept pull requests if they fix a bug or add a worthwhile feature.
-
-
-Usage notes
------------
-
-**TaskDialog**
-
-If you get the following exception when you instantiate a `TaskDialog`:
-
-```
-An unhandled exception of type 'System.NotSupportedException' occurred in Microsoft.WindowsAPICodePack.dll
-
-Additional information: TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory.
-```
-
-To fix it, create an application manifest and un-comment the following block section:
-
-```
-
-
-```
-
-Note: you might have to restart Visual Studio as the DLLs seems to be cached in memory and rebuilding your project doesn't seem to be enough in some cases.
-
-**DirectX**
-
-The DirectX package will work under x86 and x64 configuration platforms but not for AnyCPU platform (because there is no such platform for C++/CLI projects). Consequently, the package will purposefully fail the build and tell you why it did.
-
-Note: package is here for historical reasons, it is highly recommended to use [SharpDX](http://sharpdx.org/) instead.
\ No newline at end of file
+See the [repository README](https://github.com/Wagnerp/Windows-API-CodePack-NET) for TFMs, TaskDialog (comctl32 v6) notes, and license.
diff --git a/Source/Current/Windows API CodePack/Components/DirectX/README.md b/Source/Current/Windows API CodePack/Components/DirectX/README.md
new file mode 100644
index 00000000..ac9fb6df
--- /dev/null
+++ b/Source/Current/Windows API CodePack/Components/DirectX/README.md
@@ -0,0 +1,9 @@
+# DirectX component (not shipped)
+
+This folder is a **Win32 stub DLL**, not the original C++/CLI DirectX wrappers from the 2009 Code Pack.
+
+- It is **not** included in any NuGet package (`WindowsAPICodePack*` 8.x).
+- CI does **not** build this project.
+- The full historical implementation lives under `Source/Original`.
+
+For new work, use [Vortice](https://github.com/amerkoleci/Vortice.Windows), Windows App SDK / Win2D, or another maintained DirectX/.NET stack. SharpDX is unmaintained.
diff --git a/Source/Current/Windows API CodePack/Components/Directory.Build.props b/Source/Current/Windows API CodePack/Components/Directory.Build.props
index 73e59502..baba39cb 100644
--- a/Source/Current/Windows API CodePack/Components/Directory.Build.props
+++ b/Source/Current/Windows API CodePack/Components/Directory.Build.props
@@ -12,6 +12,12 @@
$(LibraryVersion)
+ Peter William Wagner
+ Copyright (c) Microsoft Corporation. Modifications copyright (c) Peter William Wagner.
+ https://github.com/Wagnerp/Windows-API-CodePack-NET
+ https://github.com/Wagnerp/Windows-API-CodePack-NET
+ git
+ windows;api;shell;taskdialog;winforms;wpf;win10;win11;sensors;explorer
diff --git a/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/ExtendedLinguisticServices.csproj b/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/ExtendedLinguisticServices.csproj
index 99132f1a..8fa2c64a 100644
--- a/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/ExtendedLinguisticServices.csproj
+++ b/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/ExtendedLinguisticServices.csproj
@@ -16,24 +16,16 @@
TrueWindowsAPICodePackExtendedLinguisticServices
-
- This package contains the extended linguistic services binary for the Windows API Code Pack needed for Windows Forms Development in the 1.1 version, released by Microsoft in 2009.
-
+ Windows Extended Linguistic Services (language detection, transliteration, and related mapping services) for desktop apps. Targets .NET Framework 4.6.2–4.8.1 and .NET 8–10 (Windows).Windows.png
- git
-
- https://github.com/Wagnerp/Windows-API-CodePack-NET
-
License.mdTrueReadme.md
- $(Title)
-
$(Title)True
@@ -53,10 +45,6 @@
-
-
-
-
True
diff --git a/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/Readme.md b/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/Readme.md
index f08b1ecb..622ba027 100644
--- a/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/Readme.md
+++ b/Source/Current/Windows API CodePack/Components/ExtendedLinguisticServices/Readme.md
@@ -1,73 +1,7 @@
-Microsoft Windows API Codepack
-=========================
+# WindowsAPICodePackExtendedLinguisticServices
-README
-======
+Windows Extended Linguistic Services: language detection, transliteration, and mapping services.
-## Current Version
+Install: `dotnet add package WindowsAPICodePackExtendedLinguisticServices`
-
-
-License
--------
-
-The library is not developed anymore by Microsoft and seems to have been left as 'free to use'. A clarification or update about the licence terms from Microsoft is welcome, however.
-
-Release notes
--------------
-
-This release has the latest bug fixes applied, including the fix for 64-bit exceptions.
-
-Bugs
-----
-
-When you submit a bug:
-
- - provide a short example code showing the bug
- - describe the expected behavior/result
- - if a pull request is applicable, please reference it
-
-Pull Requests
--------------
-
-I'll be glad to accept pull requests if they fix a bug or add a worthwhile feature.
-
-
-Usage notes
------------
-
-**TaskDialog**
-
-If you get the following exception when you instantiate a `TaskDialog`:
-
-```
-An unhandled exception of type 'System.NotSupportedException' occurred in Microsoft.WindowsAPICodePack.dll
-
-Additional information: TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory.
-```
-
-To fix it, create an application manifest and un-comment the following block section:
-
-```
-
-
-```
-
-Note: you might have to restart Visual Studio as the DLLs seems to be cached in memory and rebuilding your project doesn't seem to be enough in some cases.
-
-**DirectX**
-
-The DirectX package will work under x86 and x64 configuration platforms but not for AnyCPU platform (because there is no such platform for C++/CLI projects). Consequently, the package will purposefully fail the build and tell you why it did.
-
-Note: package is here for historical reasons, it is highly recommended to use [SharpDX](http://sharpdx.org/) instead.
\ No newline at end of file
+See the [repository README](https://github.com/Wagnerp/Windows-API-CodePack-NET).
diff --git a/Source/Current/Windows API CodePack/Components/Sensors/Readme.md b/Source/Current/Windows API CodePack/Components/Sensors/Readme.md
index f08b1ecb..7a6e01e1 100644
--- a/Source/Current/Windows API CodePack/Components/Sensors/Readme.md
+++ b/Source/Current/Windows API CodePack/Components/Sensors/Readme.md
@@ -1,73 +1,7 @@
-Microsoft Windows API Codepack
-=========================
+# WindowsAPICodePackSensors
-README
-======
+Wrappers for the Windows Sensor Platform (ambient light, motion, and related types).
-## Current Version
+Install: `dotnet add package WindowsAPICodePackSensors`
-
-
-License
--------
-
-The library is not developed anymore by Microsoft and seems to have been left as 'free to use'. A clarification or update about the licence terms from Microsoft is welcome, however.
-
-Release notes
--------------
-
-This release has the latest bug fixes applied, including the fix for 64-bit exceptions.
-
-Bugs
-----
-
-When you submit a bug:
-
- - provide a short example code showing the bug
- - describe the expected behavior/result
- - if a pull request is applicable, please reference it
-
-Pull Requests
--------------
-
-I'll be glad to accept pull requests if they fix a bug or add a worthwhile feature.
-
-
-Usage notes
------------
-
-**TaskDialog**
-
-If you get the following exception when you instantiate a `TaskDialog`:
-
-```
-An unhandled exception of type 'System.NotSupportedException' occurred in Microsoft.WindowsAPICodePack.dll
-
-Additional information: TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory.
-```
-
-To fix it, create an application manifest and un-comment the following block section:
-
-```
-
-
-```
-
-Note: you might have to restart Visual Studio as the DLLs seems to be cached in memory and rebuilding your project doesn't seem to be enough in some cases.
-
-**DirectX**
-
-The DirectX package will work under x86 and x64 configuration platforms but not for AnyCPU platform (because there is no such platform for C++/CLI projects). Consequently, the package will purposefully fail the build and tell you why it did.
-
-Note: package is here for historical reasons, it is highly recommended to use [SharpDX](http://sharpdx.org/) instead.
\ No newline at end of file
+See the [repository README](https://github.com/Wagnerp/Windows-API-CodePack-NET).
diff --git a/Source/Current/Windows API CodePack/Components/Sensors/Sensors.csproj b/Source/Current/Windows API CodePack/Components/Sensors/Sensors.csproj
index 561d470f..07bbeca0 100644
--- a/Source/Current/Windows API CodePack/Components/Sensors/Sensors.csproj
+++ b/Source/Current/Windows API CodePack/Components/Sensors/Sensors.csproj
@@ -16,16 +16,10 @@
TrueWindowsAPICodePackSensors
-
- This package contains the sensors binary for the Windows API Code Pack needed for Windows Forms Development in the 1.1 version, released by Microsoft in 2009.
-
-
- https://github.com/Wagnerp/Windows-API-CodePack-NET
+ Windows Sensor Platform wrappers (ambient light, motion, and related sensor types) for desktop apps. Targets .NET Framework 4.6.2–4.8.1 and .NET 8–10 (Windows).Windows.png
- git
-
TrueLicense.md
@@ -45,10 +39,6 @@
..\..\..\..\..\Output\bin
-
-
-
-
diff --git a/Source/Current/Windows API CodePack/Components/Shell/Readme.md b/Source/Current/Windows API CodePack/Components/Shell/Readme.md
index f08b1ecb..7359ffd6 100644
--- a/Source/Current/Windows API CodePack/Components/Shell/Readme.md
+++ b/Source/Current/Windows API CodePack/Components/Shell/Readme.md
@@ -1,73 +1,7 @@
-Microsoft Windows API Codepack
-=========================
+# WindowsAPICodePackShell
-README
-======
+Windows Shell integration: Common File Dialogs, Explorer Browser, Known Folders, the property system, Jump Lists, and tabbed thumbnails.
-## Current Version
+Install: `dotnet add package WindowsAPICodePackShell`
-
-
-License
--------
-
-The library is not developed anymore by Microsoft and seems to have been left as 'free to use'. A clarification or update about the licence terms from Microsoft is welcome, however.
-
-Release notes
--------------
-
-This release has the latest bug fixes applied, including the fix for 64-bit exceptions.
-
-Bugs
-----
-
-When you submit a bug:
-
- - provide a short example code showing the bug
- - describe the expected behavior/result
- - if a pull request is applicable, please reference it
-
-Pull Requests
--------------
-
-I'll be glad to accept pull requests if they fix a bug or add a worthwhile feature.
-
-
-Usage notes
------------
-
-**TaskDialog**
-
-If you get the following exception when you instantiate a `TaskDialog`:
-
-```
-An unhandled exception of type 'System.NotSupportedException' occurred in Microsoft.WindowsAPICodePack.dll
-
-Additional information: TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory.
-```
-
-To fix it, create an application manifest and un-comment the following block section:
-
-```
-
-
-```
-
-Note: you might have to restart Visual Studio as the DLLs seems to be cached in memory and rebuilding your project doesn't seem to be enough in some cases.
-
-**DirectX**
-
-The DirectX package will work under x86 and x64 configuration platforms but not for AnyCPU platform (because there is no such platform for C++/CLI projects). Consequently, the package will purposefully fail the build and tell you why it did.
-
-Note: package is here for historical reasons, it is highly recommended to use [SharpDX](http://sharpdx.org/) instead.
\ No newline at end of file
+Requires Core. See the [repository README](https://github.com/Wagnerp/Windows-API-CodePack-NET).
diff --git a/Source/Current/Windows API CodePack/Components/Shell/Shell.csproj b/Source/Current/Windows API CodePack/Components/Shell/Shell.csproj
index ef956308..d688faf3 100644
--- a/Source/Current/Windows API CodePack/Components/Shell/Shell.csproj
+++ b/Source/Current/Windows API CodePack/Components/Shell/Shell.csproj
@@ -10,18 +10,14 @@
enabletrue
+ trueWindowsAPICodePackShell
-
- This package contains the shell binary for the Windows API Code Pack needed for Windows Forms Development in the 1.1 version, released by Microsoft in 2009.
-
- https://github.com/Wagnerp/Windows-API-CodePack-NET
+ Windows Shell integration for WinForms and WPF: Common File Dialogs, Explorer Browser, Known Folders, Taskbar, Jump Lists, tabbed thumbnails, and the Shell property system. Targets .NET Framework 4.6.2–4.8.1 and .NET 8–10 (Windows).Windows.png
- gitTrueLicense.mdReadme.md$(Title)
- $(Authors)TrueWindowsAPICodePack.snkTrue
@@ -34,16 +30,6 @@
-
-
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8.1\System.Windows.Forms.dll
-
-
-
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8.1\WindowsFormsIntegration.dll
-
-
-
True
diff --git a/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnail.cs b/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnail.cs
index 83b651be..0009fec6 100644
--- a/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnail.cs
+++ b/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnail.cs
@@ -360,6 +360,9 @@ public void InvalidatePreview()
///
public event EventHandler? TabbedThumbnailClosed;
+ ///
+ /// The event that occurs when a tab is closing on the taskbar thumbnail preview.
+ ///
public event EventHandler? TabbedThumbnailClosing;
///
@@ -550,4 +553,10 @@ protected virtual void Dispose(bool disposing)
}
#endregion
+
+ ///
+ /// Raises the event.
+ ///
+ /// The event arguments.
+ protected virtual void OnTabbedThumbnailClosed(TabbedThumbnailClosedEventArgs e) => TabbedThumbnailClosed?.Invoke(this, e);
}
\ No newline at end of file
diff --git a/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnailClosingEventArgs.cs b/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnailClosingEventArgs.cs
index caabc8aa..9dae9f89 100644
--- a/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnailClosingEventArgs.cs
+++ b/Source/Current/Windows API CodePack/Components/Shell/Taskbar/TabbedThumbnailClosingEventArgs.cs
@@ -1,7 +1,7 @@
namespace Microsoft.WindowsAPICodePack.Taskbar;
-//
+///
/// Event args for the TabbedThumbnailClosing event. The application should set
/// the Cancel property to true if the thumbnail should not be removed.
///
diff --git a/Source/Current/Windows API CodePack/Components/ShellExtensions/Readme.md b/Source/Current/Windows API CodePack/Components/ShellExtensions/Readme.md
index f08b1ecb..bc2ddcf5 100644
--- a/Source/Current/Windows API CodePack/Components/ShellExtensions/Readme.md
+++ b/Source/Current/Windows API CodePack/Components/ShellExtensions/Readme.md
@@ -1,73 +1,7 @@
-Microsoft Windows API Codepack
-=========================
+# WindowsAPICodePackShellExtensions
-README
-======
+Helpers for implementing Windows preview handlers and thumbnail providers (WinForms and WPF).
-## Current Version
+Install: `dotnet add package WindowsAPICodePackShellExtensions`
-
-
-License
--------
-
-The library is not developed anymore by Microsoft and seems to have been left as 'free to use'. A clarification or update about the licence terms from Microsoft is welcome, however.
-
-Release notes
--------------
-
-This release has the latest bug fixes applied, including the fix for 64-bit exceptions.
-
-Bugs
-----
-
-When you submit a bug:
-
- - provide a short example code showing the bug
- - describe the expected behavior/result
- - if a pull request is applicable, please reference it
-
-Pull Requests
--------------
-
-I'll be glad to accept pull requests if they fix a bug or add a worthwhile feature.
-
-
-Usage notes
------------
-
-**TaskDialog**
-
-If you get the following exception when you instantiate a `TaskDialog`:
-
-```
-An unhandled exception of type 'System.NotSupportedException' occurred in Microsoft.WindowsAPICodePack.dll
-
-Additional information: TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory.
-```
-
-To fix it, create an application manifest and un-comment the following block section:
-
-```
-
-
-```
-
-Note: you might have to restart Visual Studio as the DLLs seems to be cached in memory and rebuilding your project doesn't seem to be enough in some cases.
-
-**DirectX**
-
-The DirectX package will work under x86 and x64 configuration platforms but not for AnyCPU platform (because there is no such platform for C++/CLI projects). Consequently, the package will purposefully fail the build and tell you why it did.
-
-Note: package is here for historical reasons, it is highly recommended to use [SharpDX](http://sharpdx.org/) instead.
\ No newline at end of file
+See the [repository README](https://github.com/Wagnerp/Windows-API-CodePack-NET).
diff --git a/Source/Current/Windows API CodePack/Components/ShellExtensions/ShellExtensions.csproj b/Source/Current/Windows API CodePack/Components/ShellExtensions/ShellExtensions.csproj
index 0ba7ff99..6e0ab079 100644
--- a/Source/Current/Windows API CodePack/Components/ShellExtensions/ShellExtensions.csproj
+++ b/Source/Current/Windows API CodePack/Components/ShellExtensions/ShellExtensions.csproj
@@ -10,15 +10,13 @@
enabletrue
+ trueWindowsAPICodePackShellExtensions
-
- This package contains extensions to the shell binary for the Windows API Code Pack needed for Windows Forms Development in the 1.1 version, released by Microsoft in 2009.
-
+ Shell extension helpers for Windows preview handlers and thumbnail providers (WinForms and WPF). Targets .NET Framework 4.6.2–4.8.1 and .NET 8–10 (Windows).Windows.pngLicense.mdTrueReadme.md
- $(Title)$(Title)TrueWindowsAPICodePack.snk
@@ -33,16 +31,6 @@
-
-
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8.1\System.Windows.Forms.dll
-
-
-
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8.1\WindowsFormsIntegration.dll
-
-
-
True
diff --git a/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/Readme.md b/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/Readme.md
index 64c99775..96ddf931 100644
--- a/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/Readme.md
+++ b/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/Readme.md
@@ -37,6 +37,7 @@ using Microsoft.WindowsAPICodePack.ShellExtensions;
- .NET Framework 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
- .NET 8.0 (Windows)
- .NET 9.0 (Windows)
+- .NET 10.0 (Windows)
## Individual Packages
diff --git a/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/WindowsAPICodePack.csproj b/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/WindowsAPICodePack.csproj
index 97441188..77c4411a 100644
--- a/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/WindowsAPICodePack.csproj
+++ b/Source/Current/Windows API CodePack/Components/WindowsAPICodePack/WindowsAPICodePack.csproj
@@ -25,12 +25,6 @@
Windows.png
- https://github.com/Wagnerp/Windows-API-CodePack-NET
-
- git
-
- $(Title)
-
$(Title)True
diff --git a/Source/Current/Windows API CodePack/ScratchProject/ScratchProject.csproj b/Source/Current/Windows API CodePack/ScratchProject/ScratchProject.csproj
index 23d5fcab..8c69e5b7 100644
--- a/Source/Current/Windows API CodePack/ScratchProject/ScratchProject.csproj
+++ b/Source/Current/Windows API CodePack/ScratchProject/ScratchProject.csproj
@@ -6,6 +6,8 @@
enabletrueenable
+ false
+ false
diff --git a/Source/Current/Windows API CodePack/Tests/GlobalUsings.cs b/Source/Current/Windows API CodePack/Tests/GlobalUsings.cs
new file mode 100644
index 00000000..c802f448
--- /dev/null
+++ b/Source/Current/Windows API CodePack/Tests/GlobalUsings.cs
@@ -0,0 +1 @@
+global using Xunit;
diff --git a/Source/Current/Windows API CodePack/Tests/KnownFoldersTests.cs b/Source/Current/Windows API CodePack/Tests/KnownFoldersTests.cs
new file mode 100644
index 00000000..24b32f85
--- /dev/null
+++ b/Source/Current/Windows API CodePack/Tests/KnownFoldersTests.cs
@@ -0,0 +1,32 @@
+using System.Reflection;
+using Microsoft.WindowsAPICodePack.Shell;
+
+namespace WindowsAPICodePack.Tests;
+
+public class KnownFoldersTests
+{
+ [Fact]
+ public void DesktopKnownFolderIsAvailable()
+ {
+ IKnownFolder? desktop = KnownFolders.Desktop;
+
+ Assert.NotNull(desktop);
+ Assert.False(string.IsNullOrWhiteSpace(desktop.CanonicalName));
+ Assert.NotEqual(Guid.Empty, desktop.FolderId);
+ }
+
+ [Fact]
+ public void AllContainsDesktopWhenPresent()
+ {
+ IKnownFolder? desktop = KnownFolders.Desktop;
+ Assert.NotNull(desktop);
+ Assert.Contains(KnownFolders.All, folder => folder.FolderId == desktop.FolderId);
+ }
+
+ [Fact]
+ public void StaticKnownFolderPropertiesAreIKnownFolder()
+ {
+ PropertyInfo[] properties = typeof(KnownFolders).GetProperties(BindingFlags.Static | BindingFlags.Public);
+ Assert.Contains(properties, info => info.PropertyType == typeof(IKnownFolder) && info.Name == nameof(KnownFolders.Desktop));
+ }
+}
diff --git a/Source/Current/Windows API CodePack/Tests/PropVariantTests.cs b/Source/Current/Windows API CodePack/Tests/PropVariantTests.cs
new file mode 100644
index 00000000..c5d6a844
--- /dev/null
+++ b/Source/Current/Windows API CodePack/Tests/PropVariantTests.cs
@@ -0,0 +1,88 @@
+using System.Runtime.InteropServices;
+using MS.WindowsAPICodePack.Internal;
+
+namespace WindowsAPICodePack.Tests;
+
+public class PropVariantTests
+{
+ [Theory]
+ [MemberData(nameof(FromObjectTestValues))]
+ public void StaticFromObjectTest(object inputObject, VarEnum expectedVarType)
+ {
+ using PropVariant pv = PropVariant.FromObject(inputObject);
+
+ Assert.Equal(inputObject, pv.Value);
+ Assert.Equal(expectedVarType, pv.VarType);
+ Assert.False(pv.IsNullOrEmpty);
+ }
+
+ [Theory]
+ [MemberData(nameof(InputObjectValues))]
+ public void DisposeClearsValue(object inputObject)
+ {
+ using PropVariant pv = PropVariant.FromObject(inputObject);
+
+ Assert.NotNull(pv.Value);
+ Assert.NotEqual(VarEnum.VT_EMPTY, pv.VarType);
+ Assert.False(pv.IsNullOrEmpty);
+
+ pv.Dispose();
+
+ Assert.Null(pv.Value);
+ Assert.Equal(VarEnum.VT_EMPTY, pv.VarType);
+ Assert.True(pv.IsNullOrEmpty);
+ }
+
+ [Fact]
+ public void DefaultConstructorIsEmpty()
+ {
+ using PropVariant pv = new();
+
+ Assert.True(pv.IsNullOrEmpty);
+ Assert.Equal(VarEnum.VT_EMPTY, pv.VarType);
+ Assert.Null(pv.Value);
+ }
+
+ [Fact]
+ public void FromObjectNullIsEmpty()
+ {
+ using PropVariant pv = PropVariant.FromObject(null);
+
+ Assert.True(pv.IsNullOrEmpty);
+ Assert.Equal(VarEnum.VT_EMPTY, pv.VarType);
+ Assert.Null(pv.Value);
+ }
+
+ public static IEnumerable