Я использую IStylusSyncPlugin , добавленный к RealTimeStylus плагинов для получения X, Y, Давления и отметки времени от стилуса. Это работает нормально, пока окно, на котором я собираю эти данные, не теряет фокус. После этого, даже если фокус возвращается к окну, StylusSyncPlugin не получает данные. Кто-нибудь есть идеи, что я могу сделать, чтобы решить эту проблему? Я обнаружил, что события стилуса из главного окна (например, PreviewStylusMove ) все еще запускаются, но точки из этих событий не содержат метки времени. Простой пример кода, который может быть полезен для воспроизведения этой проблемы:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
RealTimeStylus rts = new RealTimeStylus(new WindowInteropHelper(this).Handle);
rts.AsyncPluginCollection.Add(new SyncStylusPlugin());
rts.Enabled = true;
}
class SyncStylusPlugin : IStylusSyncPlugin
{
public DataInterestMask DataInterest => DataInterestMask.Packets;
public void Packets(RealTimeStylus sender, PacketsData data)
{
Console.WriteLine("Packets arrived");
}
public void StylusDown(RealTimeStylus sender, StylusDownData data) { }
public void StylusUp(RealTimeStylus sender, StylusUpData data) { }
public void CustomStylusDataAdded(RealTimeStylus sender, CustomStylusData data) { }
public void Error(RealTimeStylus sender, ErrorData data) { }
public void InAirPackets(RealTimeStylus sender, InAirPacketsData data) { }
public void RealTimeStylusDisabled(RealTimeStylus sender, RealTimeStylusDisabledData data) { }
public void RealTimeStylusEnabled(RealTimeStylus sender, RealTimeStylusEnabledData data) { }
public void StylusButtonDown(RealTimeStylus sender, StylusButtonDownData data) { }
public void StylusButtonUp(RealTimeStylus sender, StylusButtonUpData data) { }
public void StylusInRange(RealTimeStylus sender, StylusInRangeData data) { }
public void StylusOutOfRange(RealTimeStylus sender, StylusOutOfRangeData data) { }
public void SystemGesture(RealTimeStylus sender, SystemGestureData data) { }
public void TabletAdded(RealTimeStylus sender, TabletAddedData data) { }
public void TabletRemoved(RealTimeStylus sender, TabletRemovedData data) { }
}
}
Я обнаружил, что нажмите значок приложения на панели задач, чтобы RealTimeStylus снова заработал. Есть ли способ вызвать те же события, что и мышью при нажатии на этот значок? Какие события должны быть запущены?
РЕДАКТИРОВАТЬ:
Во время чтения документов Microsoft о RealTimeStylus я обнаружил, что «Когда вы создаете RealTimeStylus объект, у вас есть возможность присоединить его к дескриптору окна или к элементу управления. Присоединение объекта RealTimeStylus к дескриптору окна требует дополнительных разрешений. Для получения дополнительной информации об этих разрешениях см. Частичное доверие для API-интерфейсов StylusInput «. «RealTimeStylus, который принимает параметр дескриптора, требует разрешения UIPermissionWindow.All Windows и SecurityPermissionFlag.UnmanagedCode, в дополнение к разрешениям, требуемым конструктором, который принимает параметр attachControl». Кто-нибудь знает, как проверить, есть ли у Window эти разрешения, и как отследить их, чтобы проверить, теряет ли Window их иногда при потере фокуса?
EDIT2: Я попытался установить UIPermission, добавив [UIPermission(SecurityAction.Demand, Window =UIPermissionWindow.AllWindows)]
для класса главного окна, а также путем установки new UIPermission(UIPermissionWindow.AllWindows).Demand();
в конструкторе главного окна, но это ничего не меняет.
EDIT3: Следующее, что я заметил, это то, что события StylusInRange и StylusOutOfRange работают каждый раз, даже если окно не имеет фокуса.