WPF Stylus События, когда Stylus / Pen находится вне экрана - PullRequest
5 голосов
/ 17 января 2020

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

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

Ответы [ 5 ]

3 голосов
/ 01 февраля 2020

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

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

1. Опция

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

Measure Table

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

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

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

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)

Trianglualtion

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

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

2. Опция

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

1 голос
/ 05 февраля 2020

AutoHotKey - это ответ!

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

AutoHotKey поддерживает Surface Pen. Он также поддерживает сценарий отсутствия ручки от экрана.

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

Один из самых популярных сценариев ios - Использование 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

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

0 голосов
/ 04 февраля 2020

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

0 голосов
/ 04 февраля 2020

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

0 голосов
/ 30 января 2020

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

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

...