C# IStylusSyncPlugin在windows失去焦点后未接收数据
我使用添加到插件,以获得X,Y,压力和定时器滴答从触笔。在我收集这些数据的窗口失去焦点之前,这一切都很正常。之后,即使焦点回到窗口,StylusSyncPlugin也不会接收数据。有人知道我能做些什么来解决这个问题吗?我发现,来自主窗口(例如)的触控笔事件仍在触发,但这些事件的点不包含时间戳。 有助于再现此问题的简单代码示例:C# IStylusSyncPlugin在windows失去焦点后未接收数据,c#,wpf,focus,tablet-pc,stylus-pen,C#,Wpf,Focus,Tablet Pc,Stylus Pen,我使用添加到插件,以获得X,Y,压力和定时器滴答从触笔。在我收集这些数据的窗口失去焦点之前,这一切都很正常。之后,即使焦点回到窗口,StylusSyncPlugin也不会接收数据。有人知道我能做些什么来解决这个问题吗?我发现,来自主窗口(例如)的触控笔事件仍在触发,但这些事件的点不包含时间戳。 有助于再现此问题的简单代码示例: public partial class MainWindow : Window { public MainWindow() {
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的文章时,我发现“创建RealTimeStylus对象时,可以选择将其附加到窗口句柄或控件。将RealTimeStylus对象附加到窗口句柄需要附加权限。有关这些权限的详细信息,请参阅。”接受handle参数的RealTimeStylus需要UIPermissionWindow.AllWindows和SecurityPermissionFlag.UnmanagedCode权限,以及接受attachedControl参数的构造函数所需的权限。“是否有人知道如何检查Windows是否具有这些权限,以及如何跟踪这些权限,以检查Windows是否有时会在焦点丢失时丢失这些权限?”
EDIT2:
我试图通过将[UIPermission(SecurityAction.Demand,Window=UIPermissionWindow.AllWindows)]
添加到主窗口类并通过设置新UIPermission(UIPermissionWindow.AllWindows.Demand())来设置UIPermission代码>在主窗口构造函数中,但它不会更改任何内容
EDIT3:
我注意到的下一件事是,StylusInRange和StylusOutOfRange事件每次都在工作,即使窗口没有焦点。这与您的问题类似吗?不,不一样。我的问题是,RealTimeStylus有时在窗口失去焦点(并在一段时间后重新获得焦点)后不收集数据,因此您不太可能正确识别原因。rts变量必须是窗口类的一个字段,这样RCW就不能过早地进行垃圾收集。不幸的是,这不是由GC引起的,将rst设为窗口类的字段不会改变任何事情。我还发现,如果我多次更改窗口的焦点,rst将再次开始收集数据(ofc。在下一次焦点更改后,它将停止…)。