6

Is anyone aware of a sane way to get tablet/stylus pressure information on Windows?

It's possible to distinguish stylus from mouse with ::GetMessageExtraInfo, but you can't get any more information beyond that. I also found the WinTab API in a out of the way corner of the Wacom site, but that's not part of windows as far as i can tell, and has a completely distinct event/messaging system from the message queue.

Given all I want is the most basic pressure information surely there is a standard Win32/COM API, is anyone aware of what it might be?

4

4 回答 4

2

更新:
自从我最初提供这个答案以来已经有很多年了,但是 wintab 已经成为事实上的标准,并且 Ntrig 或多或少地折叠了,最终构建了一个包装器以允许通过这个数字化仪访问 wintab API。
( http://www.tabletpcbuzz.com/showthread.php?37547-N-trig-Posts-WinTAB-Support-Driver )

这是一个相当晚的回应,但最近我和我的妻子购买了一台戴尔 XT 平板电脑,事实证明它实际上使用了 NTrig,这是一套使用 Ink 的界面,Windows XP 平板电脑版附带的公认的新 Windows API,然后是 SP 2 和之后的所有版本。

许多 Wacom 平板电脑和其他平板电脑使用 Wintab API,该 API 当前未开放,也未真正允许使用。据我所知,维护它的人非常高兴。

所以这取决于你使用的是什么类型的平板电脑,以及你为它安装的驱动程序。在我的偏见中,您应该使用 Ink,因为它提供(或至少通过 NTrig 和 Windows 7 将提供)多点触控功能,并且很可能成为平板电脑界面的新标准。但截至目前,NTrig 设备并未将其压力和角度信息转换为常见的基于 Wintab 的应用程序,例如 Photoshop 或 Corel Painter。这些应用程序往往需要至少对 Microsoft 的 Tablet API 提供一些支持才能正常运行。

于 2009-07-20T16:11:34.433 回答
2

您需要使用 Tablet PC Pen/Ink API。API 的 COM 版本位于 InkObj.dll 中。这是文档的起点:http: //msdn.microsoft.com/en-us/library/ms700664.aspx

如果我没记错的话,InkObj.dll 在 Windows XP SP2 和所有更高版本的 Windows 客户端操作系统上都可用,无论机器是否是 Tablet PC。

于 2009-04-09T02:06:07.057 回答
2

当前执行此操作的方法是处理 WM_POINTERnnn 消息。请注意,这适用于 Win 8 及更高版本。

请注意,您将获得触摸和笔的这些消息,因此您需要知道指针类型才能测试笔。WNDPROC 收到的 WM_POINTERnnnn 消息(例如 WM_POINTERUPDATE 和其他消息)的 WPARAM 包含指针 id,您需要它来请求更多信息。根据经验,我发现 WM_POINTERUPDATE 会导致包含压力数据的信息,而如果指针标志指示向下/向上,则没有压力信息。

const WORD wid = GET_POINTERID_WPARAM(wParam);
POINTER_INFO piTemp = {NULL};
GetPointerInfo(wid, &piTemp);
if (piTemp.pointerType == PT_PEN
{
    UINT32 entries = 0;
    UINT32 pointers = 0;

    GetPointerFramePenInfoHistory(wid, &entries, &pointers, NULL); // how many
    // TODO, allocate space needed for the info, process the data in a loop to retrieve it, test pointerInfo.pointerFlags for down/up/update.

}

一旦你知道你正在处理笔,你可以从 POINTER_PEN_INFO 结构中获取压力信息。

这类似于处理触摸,但对于触摸,您需要手势识别和惯性。有一个 Microsoft 示例说明如何使用这些函数。

这是构建谈话的一部分: https ://channel9.msdn.com/Events/Build/2013/4-022

于 2017-05-08T15:49:37.997 回答
0

如果使用UWP Windows 运行时,那么它非常简单。PointerEventArgs事件似乎包含所有必要的数据

来自 Visual Studio 2019 的已修改核心应用 (C++/WinRT)模板项目片段:

void OnPointerMoved(IInspectable const &, PointerEventArgs const &args)
{
    if (m_selected)
    {
        float2 const point = args.CurrentPoint().Position();

        m_selected.Offset(
            {
                point.x + m_offset.x,
                point.y + m_offset.y,
                0.0f
            });

        // (new!) Change sprite color based on pen pressure and tilt
        auto sprite = m_selected.as<SpriteVisual>();
        
        auto const props = args.CurrentPoint().Properties();
        auto const pressure = props.Pressure();
        auto const orientation = props.Orientation() / 360.0f;
        auto const tiltx = (props.XTilt() + 90) / 180.0f;
        auto const tilty = (props.YTilt() + 90) / 180.0f;

        Compositor compositor = m_visuals.Compositor();
        sprite.Brush(compositor.CreateColorBrush({
            (uint8_t)(pressure * 0xFF),
            (uint8_t)(tiltx * 0xFF),
            (uint8_t)(tilty * 0xFF),
            (uint8_t)(orientation * 0xFF)
            }));
    }
}

类似的代码可能适用于 C#、JavaScript 等。

于 2020-09-24T22:40:59.163 回答