An open API service indexing awesome lists of open source software.

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.

Awesome Lists containing this project

README

          

# Deskband11Lib

[![NuGet WinUI](https://img.shields.io/nuget/v/Deskband11Lib.WinUI.svg)](https://www.nuget.org/packages/Deskband11Lib.WinUI)
[![NuGet WPF](https://img.shields.io/nuget/v/Deskband11Lib.Wpf.svg)](https://www.nuget.org/packages/Deskband11Lib.Wpf)
[![Pack and Publish](https://github.com/airtaxi/Deskband11Lib/actions/workflows/pack-and-publish.yml/badge.svg)](https://github.com/airtaxi/Deskband11Lib/actions/workflows/pack-and-publish.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

🌐 [English](README.md) | ν•œκ΅­μ–΄

Deskband11LibλŠ” Windows 11 μž‘μ—… ν‘œμ‹œμ€„ μ•ˆμ— μ•± UIλ₯Ό μžμ—°μŠ€λŸ½κ²Œ 올릴 수 있게 ν•΄μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. μž‘μ€ λŒ€μ‹œλ³΄λ“œ, λΉ λ₯Έ μ œμ–΄ νŒ¨λ„, μƒνƒœ ν‘œμ‹œκΈ°, λ―Έλ””μ–΄ μœ„μ ―, 런처처럼 항상 λˆˆμ— 띄어야 ν•˜λŠ” κΈ°λŠ₯을 λ°μŠ€ν¬ν†±μ˜ μΌλΆ€μ²˜λŸΌ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

![Deskband11Lib μŠ€ν¬λ¦°μƒ·](.github/screenshot.png)

## νŒ¨ν‚€μ§€ ꡬ성

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)κ°€ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.