Как вы получаете информацию о давлении стилуса на окнах?
Кто-нибудь знает здравомыслящий способ получения информации о давлении планшета / стилуса в Windows?
Можно отличить стилус от мыши с помощью::GetMessageExtraInfo, но вы не можете получить больше информации, кроме этого. Я также обнаружил, что WinTab API находится в отдаленном уголке сайта Wacom, но это, насколько я могу судить, не является частью окон, и имеет совершенно отличную систему событий / сообщений от очереди сообщений.
Учитывая все, что я хочу, это самая основная информация о давлении, безусловно, есть стандартный Win32/COM API, кто-нибудь знает, что это может быть?
3 ответа
Текущий способ сделать это - обработать сообщения WM_POINTERnnn. Обратите внимание, что это для Win 8 и более поздних версий.
Обратите внимание, что вы получите эти сообщения для сенсорного И пера, поэтому вам нужно будет знать pointerType, чтобы проверить работу пера. WPARAM, полученный WNDPROC для сообщений WM_POINTERnnnn, таких как WM_POINTERUPDATE и других сообщений, содержит идентификатор указателя, который вам понадобится для запроса дополнительной информации. Опытным путем я обнаружил, что 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
Вам необходимо использовать API-интерфейс Pen / Ink для планшетных ПК. COM-версия API находится в InkObj.dll. Вот отправная точка для документации: http://msdn.microsoft.com/en-us/library/ms700664.aspx
Если я правильно помню, InkObj.dll доступен на Windows XP SP2 и на всех последующих клиентских ОС Windows, независимо от того, является ли компьютер планшетным ПК.
ОБНОВИТЬ:
Прошло уже много лет с тех пор, как я первоначально предоставил этот ответ, но wintab стал стандартом де-факто, и Ntrig более или менее свернулся, в конечном счете создавая оболочку, позволяющую получать доступ к API wintab через этот дигитайзер.
( http://www.tabletpcbuzz.com/showthread.php?37547-N-trig-Posts-WinTAB-Support-Driver)
Это довольно поздний ответ, но недавно мы с женой приобрели планшетный компьютер Dell XT, который, как оказалось, на самом деле использует NTrig, набор интерфейсов, использующих Ink, принятый новый Windows API, поставляемый с Windows XP Tablet Edition, затем SP 2 и все последующие версии.
Многие планшеты Wacom и другие используют Wintab API, который в настоящее время не открыт и не разрешен к использованию. Из того, что я слышал, люди, которые поддерживают это, довольно счастливы.
Так что это зависит от того, какой тип планшета вы используете, и драйверов, которые вы установили для него. По моему предвзятому мнению, вы должны работать с Ink, так как она обеспечивает (или, по крайней мере, через NTrig и Windows 7 БУДЕТ) возможность мультитач и, вероятно, станет новым стандартом для интерфейсов планшета. Но на данный момент устройства NTrig не транслируют информацию о давлении и угле в обычные приложения на основе Wintab, такие как Photoshop или Corel Painter. Приложения, как правило, требуют, по крайней мере, некоторой поддержки для Microsoft Tablet API для правильной работы.
Если вы используете среду выполнения Windows UWP, это довольно просто. PointerEventArgs событие, кажется, есть все необходимые данные.
Фрагмент проекта шаблона модифицированного основного приложения (C++/WinRT) из Visual Studio 2019:
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 и т. Д.