This is a unified pen input SDK for modern Windows writen for someone devleoping a drawing application or something similar. It is SIMPLE and EASY.
- You don't need to know anything about the complications of Windows Pen Input
- You don't need to know anything about the complications of WinTab drivers
- Both managed and unmanaged libraries are provided so you can use the languages you want
- Can switch APIs in your apps dynamically without even restarting the app
- Consistent spatial scope across every API — Wintab, WM_POINTER, and framework pointer events all deliver pen data over the same region
- Supports WinTab high-resolution
| Package | Purpose | Works in |
|---|---|---|
| WinPenKit | Core library (Wintab + WM_POINTER) | Any .NET app |
| WinPenKit.Native | C++ DLL with C ABI | Any native app (C++, Rust, Zig) |
| WinPenKit.WinUI | WinUI 3 pointer events | WinUI 3 apps |
| WinPenKit.Wpf | WPF stylus events | WPF apps |
| WinPenKit.WinForms | WinForms IMessageFilter | WinForms apps |
| WinPenKit.Avalonia | Avalonia pointer events | Avalonia apps |
These demo apps proving the SDK end-to-end, all with bitmap-backed rendering and ribbon UI:
| App | Framework | Renderer | Language |
|---|---|---|---|
| Scribble.Win32 | Win32/GDI | GDI BitBlt | C++ |
| Scribble.Rust | egui | tiny-skia | Rust |
| Scribble.WinUI | WinUI 3 | SkiaSharp | C# |
| Scribble.Wpf | WPF | SkiaSharp | C# |
| Scribble.WinForms | WinForms | SkiaSharp | C# |
| Scribble.Avalonia | Avalonia | SkiaSharp | C# |
| WinPenKit.TestConsole | Console | (headless) | C# |
using WinPenKit;
// Discover available APIs.
var apis = PenSessionFactory.GetAvailableApis();
// Create and start a session.
using var session = PenSessionFactory.Create(apis[0]);
session.Start();
// Poll on a render timer (~60fps).
var points = session.DrainPoints();
foreach (var pt in points)
{
// pt.DesktopX/Y — physical screen pixels
// pt.Pressure — 0 to session.MaxPressure
// pt.Azimuth, pt.TiltX — both tilt representations
}#include "pen_session.h"
PenInputApi apis[8];
int count = pen_session_get_available_apis(apis, 8);
PenSessionHandle session = pen_session_create(apis[0]);
pen_session_start(session, app_hwnd);
PenPoint points[64];
int n = pen_session_drain_points(session, points, 64);
pen_session_destroy(session);See the Docs/ folder for:
- GETTING-STARTED.md — Project overview and setup
- HOW_TO_USE.md — Usage guide with gotchas and best practices
- SCRIBBLE-APPS.md — Details on each scribble demo app
- BUILD.md — Build instructions
- CI.md — CI/Release workflow, versioning, and releasing
- Planning/ — NuGet publishing plan
For general pen input knowledge (API comparisons, DPI handling, Wintab gotchas), see the devnotes repo.
This project was extracted from Wacom_WinTabDN, which contains the low-level WintabDN .NET library. The design evolved through 6 phases from a Wintab-specific session into a unified multi-API, multi-framework, multi-language pen input SDK.
The text and information contained in this repository may be freely used, copied, or distributed without compensation or licensing restrictions.