https://github.com/airtaxi/deskband11lib
.NET library for embedding native WinUI 3 / WPF widgets directly into the Windows 11 taskbar as always-visible deskband companions. NuGet packages for WinUI and WPF.
https://github.com/airtaxi/deskband11lib
csharp deskband deskband-widget dotnet library nativeaot now-playing nuget nuget-package shell-traywnd taskbar widget win32 windows-11 windows-app-sdk winui winui-3 winui3 wpf
Last synced: 11 days ago
JSON representation
.NET library for embedding native WinUI 3 / WPF widgets directly into the Windows 11 taskbar as always-visible deskband companions. NuGet packages for WinUI and WPF.
- Host: GitHub
- URL: https://github.com/airtaxi/deskband11lib
- Owner: airtaxi
- License: mit
- Created: 2026-06-16T06:39:30.000Z (about 1 month ago)
- Default Branch: master
- Last Pushed: 2026-06-26T06:19:12.000Z (27 days ago)
- Last Synced: 2026-07-02T23:32:56.642Z (20 days ago)
- Topics: csharp, deskband, deskband-widget, dotnet, library, nativeaot, now-playing, nuget, nuget-package, shell-traywnd, taskbar, widget, win32, windows-11, windows-app-sdk, winui, winui-3, winui3, wpf
- Language: C#
- Homepage: https://www.nuget.org/packages/Deskband11Lib.WinUI
- Size: 938 KB
- Stars: 15
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.ko.md
- License: LICENSE
Awesome Lists containing this project
README
# Deskband11Lib
[](https://www.nuget.org/packages/Deskband11Lib.WinUI)
[](https://www.nuget.org/packages/Deskband11Lib.Wpf)
[](https://github.com/airtaxi/Deskband11Lib/actions/workflows/pack-and-publish.yml)
[](LICENSE)
π [English](README.md) | νκ΅μ΄
Deskband11Libλ Windows 11 μμ
νμμ€ μμ μ± UIλ₯Ό μμ°μ€λ½κ² μ¬λ¦΄ μ μκ² ν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬μ
λλ€. μμ λμ보λ, λΉ λ₯Έ μ μ΄ ν¨λ, μν νμκΈ°, λ―Έλμ΄ μμ ―, λ°μ²μ²λΌ νμ λμ λμ΄μΌ νλ κΈ°λ₯μ λ°μ€ν¬ν±μ μΌλΆμ²λΌ λ§λ€ μ μμ΅λλ€.

## ν¨ν€μ§ ꡬμ±
Deskband11Libλ UI νλ μμν¬λ³ NuGet ν¨ν€μ§λ‘ μ 곡λ©λλ€. μμ
νμμ€μ λΆμ΄λ ν΅μ¬ λ‘μ§μ `Deskband11Lib.Core`μ λ€μ΄ μκ³ , WinUIμ WPF ν¨ν€μ§λ κ° νλ μμν¬μμ μ°κΈ° μ¬μ΄ APIλ₯Ό μ 곡ν©λλ€. μ΄ν Avalonia κ°μ νλ μμν¬λ κ°μ λ°©μμΌλ‘ μΆκ°ν μ μμ΅λλ€.
| ν¨ν€μ§ | μ€λͺ
|
| --------------------- | ---------------------------------------------------------------------------------------------------- |
| `Deskband11Lib.Core` | μμ
νμμ€ μ°½ μ°ΎκΈ°, λ μ΄μμ κ³μ°, UI Automation μΈ‘μ , Explorer μ¬μμ κ°μ§, Win32 HWND νΈμ€ν
μ λ΄λΉν©λλ€. UI νλ μμν¬μ μμ‘΄νμ§ μμ΅λλ€. |
| `Deskband11Lib.WinUI` | WinUI 3 μ±μ© ν¨ν€μ§μ
λλ€. μ±μμ μ°λ WinUI 컨νΈλ‘€, μ€νμΌ, Composition κΈ°λ₯μΌλ‘ μμ
νμμ€ μμ ―μ λ§λ€ μ μμ΅λλ€. |
| `Deskband11Lib.Wpf` | WPF μ±μ© ν¨ν€μ§μ
λλ€. WPFλ‘ λ§λ μ½ν
μΈ λ₯Ό κ°μ λ°©μμΌλ‘ Windows 11 μμ
νμμ€μ λ°°μΉν μ μμ΅λλ€. |
## μ£Όμ κΈ°λ₯
- μ±μμ μ°λ 컨νΈλ‘€κ³Ό μ€νμΌμ κ·Έλλ‘ νμ©ν΄ μμ
νμμ€ μμ ―μ λ§λ€ μ μμ΅λλ€.
- λ³λ μ°½μ μ΄μ§ μμλ νμν μ 보λ₯Ό νμ 보μ΄λ μμΉμ λμΈ μ μμ΅λλ€.
- νμ΄λ¨Έ, λ―Έλμ΄ μ¬μ, κ³μ μ ν, λΉλ μν, μ₯μΉ λͺ¨λν°λ§, λΉ λ₯Έ μ€ν κ°μ κΈ°λ₯μ μκ² μ λ¦¬ν΄ λ°°μΉνκΈ° μ’μ΅λλ€.
- κ³ μ μ±, μ€ν μ€μΈ μ±, μλ¦Ό μμκ³Ό κ²ΉμΉμ§ μλλ‘ λ¨λ μμ
νμμ€ κ³΅κ°μ λ§μΆ° μμΉλ₯Ό μ‘μ΅λλ€.
- λ μ΄μμμ΄ λ°λ λ μμ°μ€λ½κ² μμ§μ΄λλ‘ κΈ°λ³Έ easing ν¨μλ₯Ό μ 곡ν©λλ€. Linear, Sine, Quadratic, Cubic, Quartic, Quintic, Exponential, Circle κ³μ΄μ μ¬μ©ν μ μμ΅λλ€.
- Explorerκ° μ¬μμλλ©΄ μ±μ΄ μμ
νμμ€ μ°½μ λ€μ λΆμΌ μ μλλ‘ μ΄λ²€νΈλ₯Ό μ 곡ν©λλ€.
- WinUI ν¨ν€μ§λ Windows App SDK μ±κ³Ό NativeAOT κ²μλ₯Ό μ§μν©λλ€.
## μ€μΉ
μ¬μ© μ€μΈ UI νλ μμν¬μ λ§λ ν¨ν€μ§λ₯Ό μ€μΉνμλ©΄ λ©λλ€.
```powershell
# WinUI 3
dotnet add package Deskband11Lib.WinUI
# WPF
dotnet add package Deskband11Lib.Wpf
```
`Deskband11Lib.Core`λ νμν κ²½μ° μλμΌλ‘ ν¨κ» μ€μΉλ©λλ€.
## κΈ°λ³Έ μ¬μ©λ²
### WinUI 3
WinUI μ°½μ λ§λ λ€ `TaskbarContentHost`μ μ°κ²°ν©λλ€. μ΄κΈ° μμ
νμμ€ λ μ΄μμμ΄ μ€λΉλλ©΄ μ°½μ μμ
νμμ€μ λΆμ΄κ³ νμ±νν©λλ€.
```csharp
using Deskband11Lib.Core;
using Deskband11Lib.WinUI;
var window = new MainWindow();
var host = new TaskbarContentHost(window, rootElement, new TaskbarContentHostOptions
{
PreferredWidth = 360,
PreferredHeight = 48
});
await host.AttachWhenLayoutReadyAsync();
window.Activate();
```
### WPF
WPFμμλ API νλ¦μ κ°μ΅λλ€. μ°¨μ΄λ `Window`μ `FrameworkElement`κ° WPF νμ
μ΄λΌλ μ λΏμ
λλ€.
```csharp
using Deskband11Lib.Core;
using Deskband11Lib.Wpf;
var window = new MainWindow();
var host = new TaskbarContentHost(window, rootElement, new TaskbarContentHostOptions
{
PreferredWidth = 360,
PreferredHeight = 48
});
await host.AttachWhenLayoutReadyAsync();
window.Show();
```
### Explorer μ¬μμ
Explorerκ° μ¬μμλλ©΄ μμ
νμμ€μ λΆμ΄ μλ μμ μ°½λ μ¬λΌμ§λλ€. μ΄λλ `TaskbarWindowRecreated` μ΄λ²€νΈμμ μ°½μ λ€μ λ§λ€μ΄ λΆμ΄λ©΄ λ©λλ€.
```csharp
host.TaskbarWindowRecreated += async (_, _) =>
{
await RecreateMainWindowAsync();
};
```
### 보쑰 λͺ¨λν° λ€μ μ°κ²°
`PreferredMonitorIdentity`λ₯Ό 보쑰 λͺ¨λν°μ μμ
νμμ€λ‘ μ€μ ν μνμμ ν΄λΉ λͺ¨λν°μ μ°κ²°μ΄ λκΈ°λ©΄, Deskband11Libκ° μλμΌλ‘ κΈ°λ³Έ μμ
νμμ€λ‘ ν΄λ°±ν©λλ€. μ΄ν 보쑰 λͺ¨λν°κ° λ€μ μ°κ²°λλ©΄ νΈμ€ν
λ μ°½λ 보쑰 λͺ¨λν°μ μμ
νμμ€λ‘ μλμΌλ‘ λμκ°λλ€ β μ± μΈ‘μμ μΆκ°λ‘ μ²λ¦¬ν μ½λλ νμ μμ΅λλ€.
## λμ λ°©μ
Deskband11Libλ μ± μ°½μ μμ
νμμ€ μμ λ€μ΄κ° ν¬κΈ°λ‘ λ§μΆκ³ , μ€μ μμ
νμμ€ λ μ΄μμμ΄ λ°λ λλ§λ€ μμΉλ₯Ό λ€μ μ‘μ΅λλ€. λ΄λΆμ μΌλ‘λ μΌλ°μ μΈ Win32 μ°½ λΆλͺ¨ κ΄κ³λ₯Ό μ¬μ©ν©λλ€.
- κΈ°λ³Έ μμ
νμμ€ μ°½μΈ `Shell_TrayWnd`λ₯Ό μ°Ύκ±°λ, `PreferredMonitorIdentity` κ°μ λ°λΌ 보쑰 λͺ¨λν°μ μμ
νμμ€ μ°½μΈ `Shell_SecondaryTrayWnd`λ₯Ό μ°Ύμ΅λλ€.
- μ±μμ λ§λ μΌλ° `Window`λ₯Ό λ°μ΅λλ€.
- μ°½ μ€νμΌμ μ΅μμ νμ
μ°½μμ μμ μ°½ μ€νμΌλ‘ λ°κΏλλ€.
- `SetParent`λ‘ μ°½μ μμ
νμμ€μ μμ μ°½μΌλ‘ λΆμ
λλ€.
- μμ
νμμ€ λ²νΌκ³Ό μλ¦Ό μμ μ¬μ΄μμ μ¬μ©ν μ μλ μμμ κ³μ°νλ©°, μμ
νμμ€ μ λ ¬(μΌμͺ½ λλ κ°μ΄λ°)μ ν¨κ» κ³ λ €ν©λλ€.
- `SetWindowPos`μ `SetWindowRgn`μΌλ‘ μ°½ μμΉμ ν΄λ¦¬ν μμμ μ‘°μ ν©λλ€.
νμ¬ Windows 11μμλ μμ
νμμ€μ μμ HWNDλ§ μ΄ν΄λ΄μλ μ€μ λ²νΌ νμ μμ μ μΌλ‘ μκΈ° μ΄λ ΅κ³ , μμ
νμμ€ μ½ν
μΈ μ λ ¬μ΄ μΌμͺ½μΌ μλ μκ³ κ°μ΄λ°μΌ μλ μμ΅λλ€. κ·Έλμ Deskband11Libλ UI AutomationμΌλ‘ μμ λ²νΌ(`AutomationId = StartButton`)κ³Ό μμΌλ©΄ λ μ¨ μμ ―(`WidgetsButton`), κ·Έλ¦¬κ³ μ€λ₯Έμͺ½μΌλ‘ μ΄μ΄μ§λ μμ
νμμ€ μ± λ²νΌ λ¬Άμμ μ νν μ°Ύμλ
λλ€. λν λ μ§μ€νΈλ¦¬μ `TaskbarAl` κ°μΌλ‘ μμ
νμμ€ μ λ ¬μ μ½κ³ , μ€ν¨νλ©΄ μμ λ²νΌ μμΉλ‘ μΆμ ν©λλ€. κ°μ§ν μ λ ¬μ λ°νμΌλ‘, κ°μ΄λ° μ λ ¬μΌ λλ μμ λ²νΌ κ·Έλ£Ή μμͺ½μ λ¨λ κ³΅κ° μ€ λ λμ μͺ½μ μ½ν
μΈ λ₯Ό λ°°μΉνλ―λ‘ μμ λ²νΌ, μ± λ²νΌ, λ μ¨ μμ ―, μλ¦Ό μμ μ΄λ κ²λ κ°λ¦¬μ§ μμ΅λλ€. 보쑰 λͺ¨λν°μ μμ
νμμ€μμλ μλ¦Ό μμ μ μ© HWNDκ° μμΌλ―λ‘, UI Automationμ΄ μκ³μ μλ¦Ό λ¬Άμ(`AutomationId = SystemTrayIcon` / `NotifyItemIcon`)κΉμ§ μ°Ύμ μ€λ₯Έμͺ½ κ²½κ³λ₯Ό κ³μ°ν©λλ€. μ΄ μμ
μ UI μ€λ λ λ°μμ μ€νλκ³ κ²°κ³Όλ μΊμλλ―λ‘, λ μ΄μμμ κ°±μ νλ λμ μ± UIκ° λ©μΆμ§ μμ΅λλ€.
## μ΅μ
λͺ¨λ μ΅μ
μ `Deskband11Lib.Core.TaskbarContentHostOptions`μ μ μλμ΄ μκ³ , WinUIμ WPF ν¨ν€μ§μμ 곡ν΅μΌλ‘ μ¬μ©ν©λλ€.
| μ΅μ
| κΈ°λ³Έκ° | μ€λͺ
|
| ------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `PreferredWidth` | `360` | μ½ν
μΈ κ° μ¬μ©ν λλΉμ
λλ€. effective pixel λ¨μμ
λλ€. |
| `PreferredHeight` | `48` | μ½ν
μΈ κ° μ¬μ©ν λμ΄μ
λλ€. effective pixel λ¨μμ
λλ€. |
| `AnimateLayoutChanges` | `true` | μμ
νμμ€ μμμ μμΉλ ν¬κΈ°κ° λ°λ λ μ λλ©μ΄μ
μ μ μ©ν©λλ€. |
| `LayoutAnimationDuration` | `500` | λ μ΄μμ μ λλ©μ΄μ
μκ°μ
λλ€. ms λ¨μμ
λλ€. |
| `LayoutAnimationEasing` | `EasingFunctions.CircleOut` | λ μ΄μμ μ λλ©μ΄μ
μ μ¬μ©ν easing delegate(`Func`)μ
λλ€. μ€λ²μ μλ κΈ°λ³Έ easingμ `Deskband11Lib.Core.EasingFunctions`μμ μ 곡ν©λλ€. |
| `Placement` | `Auto` | `Auto`λ κ°μ΄λ° μ λ ¬μΌ λ μμ λ²νΌ κ·Έλ£Ή μμͺ½ λ¨λ κ³΅κ° μ€ λ λμ μͺ½μ μ½ν
μΈ λ₯Ό λ‘λλ€. μΌμͺ½ 곡κ°μ΄ λ λμΌλ©΄ κ°μ₯ μΌμͺ½ λ(`LeftEdge`μ λμΌ)μ, μ€λ₯Έμͺ½ 곡κ°μ΄ λ λμΌλ©΄ μλ¦Ό μμ μμ λ°°μΉνλ©°, μΌμͺ½ μ λ ¬μΌ λλ `BeforeNotificationArea`λ‘ λμν©λλ€. `LeftEdge`λ κ°μ΄λ° μ λ ¬μΌ λ λ μ¨ μμ ― λ°λ‘ μ€λ₯Έμͺ½, μμ
νμμ€μ κ°μ₯ μΌμͺ½ λμ μ½ν
μΈ λ₯Ό λλ©°, μΌμͺ½ μ λ ¬μΌ λλ `BeforeNotificationArea`λ‘ λμν©λλ€. `BeforeNotificationArea`λ νμ μλ¦Ό μμ μμ λ‘λλ€. `BeforeStartButton`μ μμ λ²νΌ μμͺ½μ λλ©°, κ°μ΄λ° μ λ ¬μ΄ μλλ©΄ `BeforeNotificationArea`λ‘ λμν©λλ€. |
| `TrackTaskbarButtons` | `true` | UI AutomationμΌλ‘ μμ
νμμ€ λ²νΌ μμμ μΆμ ν©λλ€. |
| `TrackNotificationArea` | `true` | μ½ν
μΈ κ° μλ¦Ό μμμ μΉ¨λ²νμ§ μλλ‘ ν©λλ€. |
| `PreferredMonitorIdentity` | `0` | μ΄λ μμ
νμμ€μ νΈμ€ν
ν μ§ μ νν©λλ€. `0`μ΄λ©΄ κΈ°λ³Έ μμ
νμμ€(`Shell_TrayWnd`)μ μλλ€. `1`μ΄λ©΄ 첫 λ²μ§Έ 보쑰 λͺ¨λν°μ μμ
νμμ€(`Shell_SecondaryTrayWnd`), `2`λ©΄ κ·Έ λ€μ, νλ©΄ μΌμͺ½λΆν° μ€λ₯Έμͺ½ μμλ‘ λ§€νλ©λλ€. μμ²ν 보쑰 λͺ¨λν°μ μμ
νμμ€μ΄ μμΌλ©΄ κΈ°λ³Έ μμ
νμμ€λ‘ ν΄λ°±ν©λλ€. |
| `LayoutRefreshInterval` | `500 ms` | μμ
νμμ€ λ μ΄μμμ λ€μ νμΈνλ μ£ΌκΈ°μ
λλ€. |
## μμ
νμμ€ μ λ ¬
Deskband11Libλ λ μ§μ€νΈλ¦¬μ `TaskbarAl` κ°μ μ½μ΄ Windows 11 μμ
νμμ€μ΄ μΌμͺ½ μ λ ¬μΈμ§ κ°μ΄λ° μ λ ¬μΈμ§ κ°μ§νκ³ , μ€ν¨νλ©΄ μμ λ²νΌ μμΉλ‘ μΆμ ν©λλ€. `TaskbarContentHost`μμ `GetTaskbarAlignment()`λ₯Ό νΈμΆνλ©΄ `TaskbarAlignment`(`Left`, `Center`, `Unknown`) κ°μ μ»μ μ μμ΅λλ€. κ°μ§λ μ λ ¬μ `Placement = Auto`μ λμμ κ²°μ ν©λλ€.
## λ΄μ₯ Easing ν¨μ
`Deskband11Lib.Core.EasingFunctions`μλ `LayoutAnimationEasing`μ λ°λ‘ λ£μ μ μλ easing ν¨μλ€μ΄ μ€λΉλμ΄ μμ΅λλ€.
- `EasingFunctions.Linear`
- `EasingFunctions.SineIn` / `SineOut` / `SineInOut`
- `EasingFunctions.QuadraticIn` / `QuadraticOut` / `QuadraticInOut`
- `EasingFunctions.CubicIn` / `CubicOut` / `CubicInOut`
- `EasingFunctions.QuarticIn` / `QuarticOut` / `QuarticInOut`
- `EasingFunctions.QuinticIn` / `QuinticOut` / `QuinticInOut`
- `EasingFunctions.ExponentialIn` / `ExponentialOut` / `ExponentialInOut`
- `EasingFunctions.CircleIn` / `CircleOut` / `CircleInOut`
νμνλ©΄ μ§μ μμ±ν `Func` delegateλ₯Ό λ겨λ λ©λλ€.
## μν νλ‘μ νΈ
μ μ½λλ ν΅μ¬ APIλ§ λ³΄μ¬μ£Όλ μ΅μ μμ μ
λλ€. μ€μ μμ
νμμ€ μ±μ λ§λ€ λλ μ°½ μλͺ
μ£ΌκΈ°, μμ μμ, Explorer μ¬μμ 볡ꡬ, νλ μμν¬λ³ νΈμ€ν
μ²λ¦¬κ° μ€μνλ―λ‘ μν νλ‘μ νΈλ₯Ό λ¨Όμ μ°Έκ³ νμλ κ²μ κΆμ₯ν©λλ€.
- `Deskband11Lib.WinUI.Sample`: WinUI 3 λ° Windows App SDK μ±μ© μνμ
λλ€.
- `Deskband11Lib.Wpf.Sample`: WPF μ±μ© μνμ
λλ€. ν
λ리 μλ ν¬λͺ
νΈμ€νΈ μ°½ μ€μ λ ν¬ν¨λμ΄ μμ΅λλ€.
## μꡬ μ¬ν
- Windows 11.
- μ νν UI νλ μμν¬μ νΈνλλ λμ νλ μμν¬.
- WinUI 3λ Windows App SDKκ° νμν©λλ€.
- WPFλ νλ‘μ νΈ νμΌμ `UseWPF=true`κ° νμν©λλ€.
## νλ‘μ νΈ κ°λ°
```powershell
dotnet restore
dotnet build Deskband11Lib.slnx -c Debug
dotnet publish Deskband11Lib.WinUI.Sample\Deskband11Lib.WinUI.Sample.csproj -c Release -r win-x64
```
## κ°μ¬μ λ§
[zadjii](https://github.com/zadjii)μ [Deskband11](https://github.com/zadjii/Deskband11)μ κ°μ¬λ립λλ€. Windows 11 μμ
νμμ€ μμ μ± μ½ν
μΈ λ₯Ό μ¬λ¦°λ€λ ν΅μ¬ μμ΄λμ΄λ ν΄λΉ νλ‘μ νΈμμ μμλμκ³ , Deskband11Libλ κ·Έ νλ₯ν λ°μμμ ν° μκ°μ λ°μμ΅λλ€.
## λΌμ΄μ μ€
Deskband11Libλ [MIT License](LICENSE)λ‘ λ°°ν¬λ©λλ€.
## μμ±μ
[Howon Lee (airtaxi)](https://github.com/airtaxi)κ° λ§λ€μμ΅λλ€.