Skip to content

TheSevenPens/WinPenKit

Repository files navigation

WinPenKit

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.

Benefits

  • 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

Packages

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

Scribble 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#

Quick Start (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
}

Quick Start (C++/Rust)

#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);

Documentation

See the Docs/ folder for:

For general pen input knowledge (API comparisons, DPI handling, Wintab gotchas), see the devnotes repo.

History

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.

License

The text and information contained in this repository may be freely used, copied, or distributed without compensation or licensing restrictions.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors