2

我正在使用添加到RealTimeStylus插件中的IStylusSyncPlugin从触控笔获取 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 再次工作。单击此图标时,有没有办法像鼠标一样触发相同的事件?应该触发哪些事件?

编辑:

在阅读有关 RealTimeStylus 的Microsoft 文档时,我发现“当您创建 RealTimeStylus 对象时,您可以选择将其附加到窗口句柄或控件。将 RealTimeStylus 对象附加到窗口句柄需要额外的权限。更多有关这些权限的信息,请参阅StylusInput API 的部分信任注意事项。” “采用 handle 参数的 RealTimeStylus 需要 UIPermissionWindow.AllWindows 和 SecurityPermissionFlag.UnmanagedCode 权限,以及采用 attachControl 参数的构造函数所需的权限。” 有谁知道如何检查 Window 是否具有这些权限,以及如何跟踪它们以检查 Window 是否有时会在焦点丢失时丢失它们?

EDIT2: 我尝试通过添加[UIPermission(SecurityAction.Demand, Window =UIPermissionWindow.AllWindows)]到主窗口类以及new UIPermission(UIPermissionWindow.AllWindows).Demand();在主窗口构造函数中设置来设置 UIPermission,但它没有任何改变。

EDIT3: 我注意到的下一件事是,StylusInRange 和 StylusOutOfRange 事件每次都在工作,即使窗口没有焦点。

4

0 回答 0