插件和 RealTimeStylus 类

RealTimeStylus 对象旨在提供对平板电脑笔中数据流的实时访问。 插件(实现 IStylusSyncPluginIStylusAsyncPlugin 接口的对象)可以添加到 RealTimeStylus 对象中。 同步插件通常由高优先级线程上的 RealTimeStylus 对象直接调用,而异步插件通常在应用程序的用户界面 (UI) 线程上调用。 为需要实时访问数据流且在计算上不要求的任务(如数据包筛选)创建或使用同步插件。 为不需要实时访问数据流的任务(如墨迹收集)创建或使用异步插件。

某些任务在计算上可能要求苛刻,但需要实时访问数据流,例如多击手势识别。 为了满足这些需求,StylusInput API 提供了一个级联 RealTimeStylus 模型,允许你使用两个 RealTimeStylus 对象,每个对象在其自己的线程上运行。 有关级联 RealTimeStylus 模型的详细信息,请参阅 级联 RealTimeStylus 模型

IStylusSyncPluginIStylusAsyncPlugin 接口定义相同的方法。 这些方法允许 RealTimeStylus 对象将笔数据传递给每个插件,无论它是异步插件还是同步插件。 Microsoft.StylusInput.IStylusSyncPlugin.DataInterestMicrosoft.StylusInput.IStylusAsyncPlugin.DataInterest 属性允许每个插件订阅平板电脑笔数据流中的特定数据。 插件应仅订阅执行其任务所需的数据,从而最大程度地降低性能需求。 有关线程处理和 RealTimeStylus 类的详细信息,请参阅 StylusInput API 的线程处理注意事项

RealTimeStylus 对象使用 Microsoft.StylusInput.PluginData 命名空间中的对象将笔数据传递给其插件。RealTimeStylus 还会捕获插件引发的异常。当 RealTimeStylus 捕获异常时,它会通过调用 IStylusSyncPlugin.ErrorIStylusAsyncPlugin.Error 方法通知插件。 有关使用插件数据的详细信息,请参阅 插件数据和 RealTimeStylus 类。 有关错误处理的详细信息,请参阅 StylusInput API 的错误处理注意事项 和插件数据和 RealTimeStylus 类的“错误数据”部分。

注意

必须至少将一个插件附加到 RealTimeStylus 对象,然后才能启用 RealTimeStylus 对象。

 

以下主题介绍插件的一些常见类别。

特殊注意事项

由于 RealTimeStylus 对象的复杂性,应注意以下事项。

如果插件修改其附加到的插件集合, 则 RealTimeStylus 对象将引发异常。 仅当插件作为该集合的成员被 RealTimeStylus 对象调用时,才会发生这种情况。

下面的 C# 示例是导致 RealTimeStylus 对象引发异常的代码。

using Microsoft.Ink;
using Microsoft.StylusInput;
using Microsoft.StylusInput.PluginData;

// ...
public class thePlugin : Microsoft.StylusInput.IStylusAsyncPlugin
{
    // ...

    // Called when a system gesture occurs.
    public void SystemGesture(RealTimeStylus sender, SystemGestureData data)
    {
        // The following line will cause the realtime stylus that calls this method
        // to throw an exception.
        sender.Dispose();
    }
    
    // ...
}

如果插件调用 RealTimeStylus 对象的 Dispose 方法,则 RealTimeStylus 对象将引发异常。 仅当插件在 RealTimeStylus 对象调用时,才会发生这种情况。

下面的 C# 示例是导致 RealTimeStylus 对象引发异常的代码。

using Microsoft.Ink;
using Microsoft.StylusInput;
using Microsoft.StylusInput.PluginData;

// ...
public class thePlugin : Microsoft.StylusInput.IStylusAsyncPlugin
{
    Microsoft.StylusInput.GestureRecognizer theGestureRecognizer;

    // ...

    // Called when a system gesture occurs.
    public void SystemGesture(RealTimeStylus sender, SystemGestureData data)
    {
        // The following line will cause the realtime stylus that calls this method
        // to throw an exception.
        sender.AsyncPluginCollection.Add(this.theGestureRecognizer);
    }
    
    // ...
}

启用 RealTimeStylus 对象时,可以修改插件集合;但是,这会使应用程序的行为更难预测。 启用 RealTimeStylus 对象时添加插件时, RealTimeStylus 对象调用插件的 IStylusAsyncPlugin.RealTimeStylusEnabledIStylusSyncPlugin.RealTimeStylusEnabled 方法。 启用 RealTimeStylus 对象时删除插件时, RealTimeStylus 对象调用插件的 IStylusAsyncPlugin.RealTimeStylusDisabledIStylusSyncPlugin.RealTimeStylusDisabled 方法。 这允许插件保持其正确状态,而无需检查 RealTimeStylus 对象的 Enabled 属性。

启用 RealTimeStylus 对象时添加插件时,插件接收的插件数据可能没有足够的信息来充分建立初始数据的上下文。 例如,新添加的插件可能开始从笔中的笔接收数据包数据。 同样,在启用 RealTimeStylus 对象时删除插件时,该插件收到的插件数据可能不足以完成数据处理。

注意

为了获得整体稳定性,请在调用其 RealTimeStylusEnabledRealTimeStylusDisabled 方法时重置插件的内部状态。

 

级联 RealTimeStylus 模型

StylusInput API 的错误处理注意事项

插件数据和 RealTimeStylus 类

StylusInput API 的线程处理注意事项