插件和 RealTimeStylus 类

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

某些任务在计算上可能要求很高,但需要对数据流进行实时访问,例如多击手势识别。 为了满足这些需求,StylusInput API 提供了一个级联 RealTimeStylus 模型,使你能够使用两个 RealTimeStylus 对象,每个对象在其自己的线程上运行。 有关级联 RealTimeStylus 模型的详细信息,请参阅 Cascaded 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 方法时,重置插件的内部状态。

 

Cascaded RealTimeStylus 模型

StylusInput API 的错误处理注意事项

插件数据和 RealTimeStylus 类

触笔Input API 线程处理注意事项