События WPF Stylus, когда стилус/перо находятся вдали от экрана

Можно ли реагировать (через StylusButtonDown и т.д. или альтернативы) на нажатия кнопок (т.е. одной из кнопок стилуса, а не кнопок в каком-то приложении), которые происходят, когда стилус/перо не касается экрана, т.е. зависает где-то в воздухе в радиусе действия ноутбука? Кажется, что они срабатывают только в том случае, если кончик пера действительно касается поверхности экрана. Конкретно мне не нужно знать о положении кнопки. Буквально при нажатии на кнопку ствола.

Я использую Microsoft Surface и, в частности, Surface Pen, который поставляется с ним, если это имеет значение. Мне не нужно, чтобы он был кроссплатформенным, переносимым или что-то в этом роде. На самом деле, решения на других языках (C++ и т. д.) подходят. Хакерские решения очень приветствуются.


person TravisG    schedule 17.01.2020    source источник


Ответы (5)


AutoHotKey — вот ответ!

AutoHotKey — это инструмент с открытым исходным кодом, который помогает создавать настраиваемые автоматические ответы на события устройства ввода Windows.

AutoHotKey поддерживает Surface Pen. Он также поддерживает сценарий, когда перо находится далеко от экрана.

Surface Pen подключается к Windows через Bluetooth с диапазоном сигнала в несколько метров. Таким образом, технически возможно использовать перо Surface в качестве пульта дистанционного управления для Windows!

Один из самых популярных сценариев — Использование Surface Pen в качестве контроллера презентации.

Вот работающий скрипт AutoHotKey для управления презентацией Powerpoint с помощью Surface Pen:

;  File name: surface-pen-slide-show-control.ahk
;
;  This program helps the presenter scroll through slides, using Surface Pen
;  
;  Single-click on pen button to scroll forward
;  Double-click on pen button to scroll backward
;

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

#IfWinActive ahk_class screenClass
#F20::
  Send, {Right}
Return

#F19::
  Send, {Left}
Return

Дополнительная информация и помощь:

person Gopinath    schedule 05.02.2020
comment
Спасибо, звучит многообещающе! Я попробую, чтобы увидеть, работает ли это. - person TravisG; 05.02.2020

У меня может быть решение, которое будет работать с используемыми в настоящее время технологиями, такими как Bluetooth и Wi-Fi, которые находятся в ручке и на вашем Microsoft Surface. Но вам нужно будет запрограммировать некоторые части самостоятельно (большинство упомянутых техник находятся в библиотеках с открытым исходным кодом).

После того, как вы соедините перо с Surface, вы должны подключиться к перу с помощью Wi-Fi и Bluetooth.

<сильный>1. Вариант

Есть хорошая статья, объясняющая триангуляцию Bluetooth, которую мы будем использовать для триангуляции пера на близком расстоянии, за исключением того, что мы будем использовать Bluetooth и Wi-Fi (у нас нет 3-й точки), поэтому это не будет так точно, как 3 точки. Но с двумя точками вы можете измерить расстояние по этой таблице и найти, где их пересечение, в таком маленьком пространстве это выполнимо.

Таблица измерений

Используйте аналогичный метод с Wi-Fi для второй точки триангуляции, вы можете увидеть исходные коды для триангуляции Wi-Fi там.

Следующим шагом будет калибровка положения ручки в держателе, что означает, что ручка будет находиться на одной стороне поверхности (для упрощения предположим, что она находится только на правой, более короткой стороне).

из этого вы можете вычислить площадь экрана

Allowed area:

offsetHeightOfPenScreenRation = ScreenHeight - penHardwareHeight

NonValidX = StartpenPositionX - ScreenWidth < penPositionX or StartpenPositionX < penPositionX

NonValidY = StartpenPositionY - ScreenHeight < penPositionY or StartpenPosition+offsetHeightOfPenScreenRation < penPositionY

penIsClose = not ( NonValidX or NonValidY)

Треугольник

Вот как это может работать, вам нужно будет держать это программное обеспечение работающим в фоновом режиме, и это может серьезно повлиять на батарею, вам понадобится внешний адаптер Wi-Fi для Интернета.

У меня нет Microsoft Surface, поэтому я не могу его закодировать, потому что у меня нет устройства, чтобы попробовать его, но это рабочая идея. С небольшой настройкой точности это может быть действительно точное позиционирование.

<сильный>2. Вариант

Триангуляция Wi-Fi: https://github.com/kevindu/wifi-ap-positioning можно использовать отдельно, и вы можете передать местоположение через Bluetooth, если вы можете войти в прошивку пера, но этот вариант не будет таким точным.

person Jiri Otoupal イり オトウパー    schedule 01.02.2020

Насколько я знаю, у Microsoft Surface нет сенсоров вокруг экрана. Так что нет, нет событий, которые бы реагировали на стилус/перо, когда они находятся рядом с экраном.

Хотя, если вы инженер, вы могли бы сами создать какие-то датчики, а потом создавать события, которые бы реагировали на такие вещи.

person Nikas Žalias    schedule 30.01.2020

Единственный способ, который я вижу, это включить сами датчики для кнопок, а поскольку он уже подключен с помощью bluetooth или WiFi, поэтому используйте необходимый метод триангуляции для калибровки устройства. Ну, я считаю, что это хакерский ответ, поскольку у Microsoft Surface нет датчиков вокруг экрана.

person Chris    schedule 04.02.2020

Если вы действительно ищете «хакерское решение», то у меня есть идея, но это будет очень грязный способ сделать это. Несмотря на то, что API, поддерживающего кнопку, не существует, система реагирует на нажатие кнопки, даже если стилус не касается экрана. Вы можете создать приложение, которое при запуске считывает следующие аргументы командной строки: ClickOnce, DoubleClick, PressAndHold. В зависимости от предоставленного аргумента приложение должно отправить соответствующее сообщение вашему основному приложению. Теперь можно зайти в «настройки пера» и в зависимости от действия выбрать для запуска вышеуказанное приложение с соответствующим параметром.

person Hawex    schedule 04.02.2020