npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ugee-tablet-driver

v1.0.4

Published

汉王友基数位板驱动Electron插件,基于libSign库

Readme

汉王友基数位板 Electron 驱动

基于 libSign 的汉王友基(UGEE/XP-PEN)数位板驱动的 Node.js 原生模块,专为 Electron 应用设计。此驱动允许你在 Electron 应用中使用数位板设备,获取实时笔数据并处理压感信息。

功能特点

  • 基于 libSign 底层库,支持多种汉王友基数位板型号
  • 支持压感绘图和笔事件追踪
  • 提供完整的 TypeScript 类型定义
  • 针对 Electron 应用优化
  • 支持设备状态监控和管理
  • 易于集成到现有应用

安装

npm install ugee-tablet-driver --save

重要提示

由于此包包含原生模块,你需要确保针对 Electron 的 ABI 版本重新构建它:

# 使用 electron-rebuild
npx electron-rebuild -f -w ugee-tablet-driver

# 或者如果你使用 electron-builder
npm install --save-dev electron-builder
# 在 package.json 中添加:
# "build": {
#   "extraResources": [
#     "node_modules/ugee-tablet-driver/libSign.dll"
#   ]
# }

基本用法

const { TabletDriver, Constants } = require('ugee-tablet-driver');

// 创建驱动实例
const tabletDriver = new TabletDriver();

// 初始化驱动
const initResult = tabletDriver.initialize();
if (initResult === Constants.ErrorCode.OK) {
  console.log('驱动初始化成功');
  
  // 检查设备连接状态
  const deviceStatus = tabletDriver.getDeviceStatus();
  if (deviceStatus === Constants.ErrorCode.OK) {
    console.log('设备已连接');
    
    // 打开设备
    const openResult = tabletDriver.openDevice();
    if (openResult === Constants.ErrorCode.OK) {
      console.log('设备打开成功');
      
      // 获取设备信息
      const deviceInfo = tabletDriver.getDeviceInfo();
      if (deviceInfo.result === Constants.ErrorCode.OK) {
        console.log('设备信息:', deviceInfo.deviceInfo);
      }
      
      // 注册笔数据回调
      tabletDriver.registerDataCallback((data) => {
        if (data.eventType === Constants.EventType.Pen) {
          console.log('笔位置:', data.x, data.y);
          console.log('压力值:', data.pressure);
          console.log('状态:', data.penStatus);
        }
      });
      
      // 设置为笔模式
      tabletDriver.changeDeviceMode(Constants.DeviceRunMode.Pen);
    }
  }
}

// 应用退出前清理资源
process.on('exit', () => {
  if (tabletDriver) {
    tabletDriver.unregisterDataCallback();
    tabletDriver.closeDevice();
    tabletDriver.cleanup();
  }
});

TypeScript 支持

此包包含完整的 TypeScript 类型定义:

import { TabletDriver, Constants, DeviceInfo, DataPacket } from 'ugee-tablet-driver';

const tabletDriver = new TabletDriver();
// ... 其余代码与 JavaScript 示例相同 ...

API 参考

TabletDriver 类

初始化和资源管理

  • initialize(): 初始化驱动,返回错误码
  • cleanup(): 清理资源,返回错误码
  • getDeviceStatus(): 获取设备连接状态,返回错误码
  • openDevice(): 打开已连接的设备,返回错误码
  • closeDevice(): 关闭设备,返回错误码

设备信息和设置

  • getDeviceInfo(): 获取设备信息,返回设备信息对象
  • getScreenRect(): 获取屏幕区域,返回屏幕区域对象
  • changeDeviceMode(mode): 更改设备工作模式,返回错误码
  • mouseControl(controlled): 控制是否将笔事件转换为鼠标事件
  • setExtendDisplay(extendDisplay): 设置是否在扩展屏幕上显示
  • rotateMode(mode): 设置旋转模式,返回错误码

回调注册

  • registerDataCallback(callback): 注册笔数据回调
  • unregisterDataCallback(): 注销笔数据回调
  • registerDeviceStatusCallback(callback): 注册设备状态回调
  • unregisterDeviceStatusCallback(): 注销设备状态回调
  • registerTouchCallback(callback): 注册触摸数据回调
  • unregisterTouchCallback(): 注销触摸数据回调

Constants 常量

包含多个枚举类型的常量对象:

  • EventType: 事件类型枚举
  • PenStatus: 笔状态枚举
  • KeyStatus: 按键状态枚举
  • ButtonStatus: 按钮状态枚举
  • DeviceStatus: 设备状态枚举
  • TouchStatus: 触摸状态枚举
  • DeviceRunMode: 设备运行模式枚举
  • ErrorCode: 错误码枚举

示例:简单绘图应用

const { app, BrowserWindow } = require('electron');
const path = require('path');
const { TabletDriver, Constants } = require('ugee-tablet-driver');

let mainWindow;
let tabletDriver = null;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 1024,
    height: 768,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true,
      nodeIntegration: false
    }
  });

  mainWindow.loadFile('index.html');
  
  // 初始化数位板
  initTabletDriver();
  
  mainWindow.on('closed', () => {
    mainWindow = null;
    
    // 清理数位板资源
    if (tabletDriver) {
      tabletDriver.unregisterDataCallback();
      tabletDriver.closeDevice();
      tabletDriver.cleanup();
      tabletDriver = null;
    }
  });
}

function initTabletDriver() {
  tabletDriver = new TabletDriver();
  
  const initResult = tabletDriver.initialize();
  if (initResult === Constants.ErrorCode.OK) {
    console.log('驱动初始化成功');
    
    const deviceStatus = tabletDriver.getDeviceStatus();
    if (deviceStatus === Constants.ErrorCode.OK) {
      const openResult = tabletDriver.openDevice();
      if (openResult === Constants.ErrorCode.OK) {
        // 注册笔数据回调
        tabletDriver.registerDataCallback((data) => {
          if (mainWindow && data.eventType === Constants.EventType.Pen) {
            mainWindow.webContents.send('pen-data', data);
          }
        });
        
        // 设置为笔模式
        tabletDriver.changeDeviceMode(Constants.DeviceRunMode.Pen);
      }
    }
  }
}

app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

在 React 应用中使用

可以在 Electron + React 应用中轻松集成此驱动:

// 在主进程中初始化驱动,并通过 IPC 发送数据到渲染进程
// 在渲染进程的 React 组件中:

import React, { useEffect, useRef, useState } from 'react';
import './DrawingCanvas.css';

function DrawingCanvas() {
  const canvasRef = useRef(null);
  const [drawing, setDrawing] = useState(false);
  const [penStatus, setPenStatus] = useState('未连接');
  
  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    
    // 设置画布尺寸
    canvas.width = canvas.offsetWidth;
    canvas.height = canvas.offsetHeight;
    
    // 设置线条样式
    ctx.lineCap = 'round';
    ctx.lineJoin = 'round';
    ctx.lineWidth = 2;
    
    // 监听数位板数据
    window.electronAPI.onPenData((data) => {
      // 将数位板坐标映射到画布
      const x = (data.x / 32768) * canvas.width;
      const y = (data.y / 32768) * canvas.height;
      
      // 根据压力调整线宽
      if (data.pressure > 0) {
        ctx.lineWidth = 1 + (data.pressure / 8192) * 5;
      }
      
      // 处理不同的笔状态
      if (data.penStatus === 1) { // 按下
        setDrawing(true);
        ctx.beginPath();
        ctx.moveTo(x, y);
        setPenStatus('按下');
      } else if (data.penStatus === 2 && drawing) { // 移动
        ctx.lineTo(x, y);
        ctx.stroke();
        setPenStatus('移动');
      } else if (data.penStatus === 3) { // 抬起
        setDrawing(false);
        setPenStatus('抬起');
      }
    });
    
    return () => {
      // 清理
    };
  }, []);
  
  return (
    <div className="drawing-container">
      <div className="canvas-wrapper">
        <canvas ref={canvasRef} className="drawing-canvas" />
      </div>
      <div className="status-bar">
        笔状态: {penStatus}
      </div>
    </div>
  );
}

export default DrawingCanvas;

注意事项

  1. 此驱动仅支持 Windows 平台
  2. 需要确保 libSign.dll 与应用可执行文件在同一目录或系统路径中
  3. 确保使用 electron-rebuild 重新构建模块以匹配 Electron 的 ABI 版本
  4. 使用 electron-builder 打包时,需将 libSign.dll 添加到 extraResources 中

支持的设备型号

本驱动支持大多数汉王友基(UGEE/XP-PEN)数位板设备,包括但不限于:

  • Deco 系列
  • Star 系列
  • Artist 系列
  • UGEE M系列

许可证

ISC