ugee-tablet-driver
v1.0.4
Published
汉王友基数位板驱动Electron插件,基于libSign库
Maintainers
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;注意事项
- 此驱动仅支持 Windows 平台
- 需要确保 libSign.dll 与应用可执行文件在同一目录或系统路径中
- 确保使用 electron-rebuild 重新构建模块以匹配 Electron 的 ABI 版本
- 使用 electron-builder 打包时,需将 libSign.dll 添加到 extraResources 中
支持的设备型号
本驱动支持大多数汉王友基(UGEE/XP-PEN)数位板设备,包括但不限于:
- Deco 系列
- Star 系列
- Artist 系列
- UGEE M系列
许可证
ISC
