IStylusSyncPlugin не получает данные после того, как windows потерял фокус - PullRequest
2 голосов
/ 21 января 2020

Я использую 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 работают каждый раз, даже если окно не имеет фокуса.

...