3

如何在 Windows 上通过压力访问笔输入?我正在制作一个绘图程序,并且一直在使用 wintab,但是我的新计算机上不存在 wintab。Wintab 似乎已被弃用,但显然有一些较新的 API,称为 Windows Ink 和 Tablet PC。

问题是我找不到有关如何实际使用最近的笔 API 的文档或示例。API 需要可用于普通的非托管 C++ 桌面应用程序。另外,如果可能的话,我真的宁愿避免使用 UWP,因为我不想处理“部署”或“签名”。

我可以在哪里下载具有 C/C++ 标头和库的 SDK,可以为我提供原始笔输入?

4

2 回答 2

2

我使用 Realtimestylus API 而不是 wintab 获得了更好的结果。因为在绘制时,wintab 似乎没有足够频繁地返回数据包以实现平滑线。

Windows RTS API 给了我更多的信息包,因此绘图时的结果更流畅,并且可以访问更多的笔信息,例如倾斜和笔按钮按下。

有一个使用 RealTimeStylus 和 SDL 的不错的小型演示应用程序: https ://backworlds.com/under-pressure/ 它在实现中包含注释,其中解释了如何访问原始平板电脑输入。

示例代码包含从 rtscom.h 中的接口类 IStylusSyncPlugin 派生的事件处理程序类。通过此接口,您可以使用 STDMETHODS 注册笔和触摸事件,例如:STDMETHOD(StylusButtonDown){}。

要获得屏幕坐标中的实际笔位置有点困难。因为您首先需要使用 STDMETHOD(Packets) 将 x,y 坐标作为数据包获取。您还需要使用 IRealTimeStylus::GetPacketDescriptionData() 来描述要接收的数据包以及接收顺序。

最后,您需要使用 Gdiplus::Graphics::GetDpiX() 根据 dpi 将 X、Y 输入转换为屏幕坐标

X = dpiX * (float)pLastPacket[g_lContexts[iCtx].x] / 2540;

Y = dpiY * (float)pLastPacket[g_lContexts[iCtx].y] / 2540;

所有这些都在 Anders Ekermo 的示例代码中提供。

希望能帮助到你。

于 2020-05-01T00:26:32.493 回答
1

查看 RealTimeStylus 和 MS Pointer API(WM_PointerXxx 消息)。这是两种不同的方式。

于 2018-04-29T17:40:03.070 回答