Compartilhar via


Dados de plug-in e a classe RealTimeStylus

Os plug-ins para a classe RealTimeStylus devem implementar a interface IStylusSyncPlugin ou IStylusAsyncPlugin ou ambos. Embora você precise implementar todos os métodos de interface de plug-in, seu plug-in recebe apenas chamadas em métodos sinalizados na propriedade Microsoft.StylusInput.IStylusSyncPlugin.DataInterest ou Microsoft.StylusInput.IStylusAsyncPlugin.DataInterest .

Os métodos definidos nas interfaces usam objetos no namespace Microsoft.StylusInput.PluginData para passar os dados da caneta para os plug-ins. A tabela a seguir descreve os objetos de dados que são parâmetros nos métodos de notificação e lista o valor DataInterestMask associado à notificação.

Dados de plug-in Valor de DataInterestMask Descrição
Customstylusdata CustomStylusDataAdded Dados de aplicativo personalizados que um plug-in adiciona.
Errordata Erro Informações de erro que o objeto RealTimeStylus adiciona em resposta a uma exceção sem tratamento em um de seus plug-ins.
Inairpacketsdata InAirPackets Informações de pacote para movimento de caneta enquanto a caneta está no ar acima do digitalizador.
Packetsdata Pacotes Informações de pacote para movimento de caneta enquanto a caneta está tocando o digitalizador.
Realtimestylusdisableddata RealTimeStylusDisabled Informações que o objeto RealTimeStylus adiciona quando está sendo desabilitado.
RealTimeStylusEnabledData RealTimeStylusEnabled Informações que o objeto RealTimeStylus adiciona quando está sendo habilitado.
Stylusbuttondowndata Stylusbuttondown Informações sobre o botão de caneta específico que está sendo pressionado.
Stylusbuttonupdata Stylusbuttonup Informações sobre o botão de caneta específico que está sendo liberado.
Stylusdowndata Stylusdown Informações de pacote para uma caneta à medida que a caneta é trazida em contato com o digitalizador.
Stylusinrangedata Stylusinrange Informações sobre a caneta específica que está entrando na área de entrada do objeto RealTimeStylus ou inserindo o intervalo de detecção do digitalizador acima da área de entrada do objeto RealTimeStylus .
Stylusoutofrangedata Stylusoutofrange Informações sobre a caneta específica que está deixando a área de entrada do objeto RealTimeStylus ou deixando o intervalo de detecção do digitalizador acima da área de entrada do objeto RealTimeStylus .
Stylusupdata Stylusup Informações de pacote para uma caneta à medida que a caneta é levantada do digitalizador.
Systemgesturedata Systemgesture Informações que o objeto RealTimeStylus adiciona quando detecta um gesto do sistema.
Tabletaddeddata Tablet Adicionado Informações sobre o objeto Tablet que está sendo adicionado.
Tabletremoveddata TabletRemoved Informações sobre o objeto Tablet que está sendo removido.

 

Para obter informações sobre como o objeto RealTimeStylus manipula o fluxo de dados da caneta tablet, consulte Trabalhando com a classe RealTimeStylus.

Interesse de dados

O objeto RealTimeStylus verifica a propriedade Microsoft.StylusInput.IStylusSyncPlugin.DataInterest ou Microsoft.StylusInput.IStylusAsyncPlugin.DataInterest de um plug-in quando o plug-in é adicionado à coleção de plug-ins síncrona ou assíncrona do objeto RealTimeStylus . Portanto, você deve usar a propriedade DataInterest para assinar todas as notificações que essa instância do plug-in usa, embora com pouca frequência, mas não para nenhuma das notificações que essa instância do plug-in nunca usa. Para notificações que seu plug-in usa apenas ocasionalmente marcar o estado do plug-in no método de notificação primeiro e retornar se a notificação não for usada pelo plug-in em seu estado atual.

Um plug-in recebe apenas chamadas em métodos sinalizados na propriedade Microsoft.StylusInput.IStylusSyncPlugin.DataInterest ou Microsoft.StylusInput.IStylusAsyncPlugin.DataInterest do plug-in. Para obter mais informações sobre os valores possíveis da propriedade DataInterest de um plug-in, consulte a enumeração DataInterestMask .

Timing

Os dados são enfileirados no objeto RealTimeStylus antes de serem passados para os plug-ins na coleção de plug-ins assíncrona. A lista a seguir descreve algumas situações que talvez você precise considerar ao criar um plug-in assíncrono.

  • Quando o objeto RealTimeStylus é desabilitado , o plug-in assíncrono pode receber outras notificações enfileiradas antes que seu método RealTimeStylusDisabled seja chamado. Nessa situação, chamadas do plug-in para alguns dos métodos e propriedades do objeto RealTimeStylus geram uma exceção. As informações relevantes para o plug-in devem ser armazenadas em cache quando o objeto RealTimeStylus estiver habilitado.
  • O método ClearStylusQueues do objeto RealTimeStylus pode remover informações da fila de saída. Portanto, os plug-ins assíncronos não podem depender do recebimento de todas as notificações relevantes.
  • Quando um objeto Tablet que está disponível para o objeto RealTimeStylus é removido, o plug-in assíncrono pode receber notificação de caneta enfileirada para o tablet antes que seu método TabletRemoved seja chamado. Nessa situação, chamar o método GetTabletPropertyDescriptionCollection do objeto RealTimeStylus não funciona. As informações relevantes para o plug-in devem ser armazenadas em cache quando o objeto RealTimeStylus estiver habilitado ou quando um novo tablet for adicionado.

Dependendo do aplicativo, você pode melhorar o desempenho ao desabilitar um objeto RealTimeStylus . Quando a propriedade Enabled do objeto RealTimeStylus é definida como FALSE, os dados nas filas de entrada e saída são processados até que as filas estejam vazias. Você pode chamar o método ClearStylusQueues do objeto RealTimeStylus para limpar as filas antes de desabilitar o objeto RealTimeStylus.

Dados habilitados e desabilitados

Quando o objeto RealTimeStylus está habilitado, cada plug-in recebe uma chamada para seu método Microsoft.StylusInput.IStylusSyncPlugin.RealTimeStylusEnabled ou Microsoft.StylusInput.IStylusAsyncPlugin.RealTimeStylusEnabled . O objeto RealTimeStylusEnabledData passado na notificação contém uma coleção dos identificadores de contexto para os tablets disponíveis no momento em que o objeto RealTimeStylus está habilitado.

Observação

Como os dados de plug-in da coleção de plug-ins assíncrona do objeto RealTimeStylus são enfileirados, os plug-ins assíncronos podem receber dados antes de receber uma chamada para seu método RealTimeStylusDisabled , mas depois que o objeto RealTimeStylus é desabilitado . Observe que alguns dos métodos e propriedades do objeto RealTimeStylus geram uma exceção se o objeto RealTimeStylus estiver desabilitado .

 

O objeto RealTimeStylus chama os métodosMicrosoft.StylusInput.IStylusSyncPlugin.RealTimeStylusEnabled e Microsoft.StylusInput.IStylusSyncPlugin.RealTimeStylusDisabled no thread do qual o objeto RealTimeStylus está habilitado ou do qual o plug-in síncrono é adicionado.

Geralmente, adicione ou remova plug-ins enquanto o objeto RealTimeStylus está desabilitado . Para obter mais informações sobre como adicionar e remover plug-ins ao objeto RealTimeStylus , consulte Plug-ins e a classe RealTimeStylus.

Dados do tablet

Quando um tablet que o objeto RealTimeStylus pode usar é adicionado ou removido do Tablet PC enquanto o objeto RealTimeStylus está habilitado, o objeto RealTimeStylus notifica seus plug-ins de que um objeto Tablet foi adicionado ou removido. Cada objeto RealTimeStylus mantém uma lista de identificadores exclusivos para os objetos Tablet com os quais ele pode interagir. O objeto RealTimeStylus tem dois métodos para traduzir entre o identificador exclusivo e o objeto Tablet, os métodos GetTabletContextIdFromTablet e GetTabletFromTabletContextId .

Observação

As informações sobre um tablet não estão mais disponíveis no objeto RealTimeStylus depois que o tablet é removido do Tablet PC.

 

Dados da caneta tablet

O objeto RealTimeStylus passa informações sobre a caneta tablet para seus plug-ins em vários dos métodos de notificação. As informações sobre a caneta tablet são representadas por um objeto Stylus . Esse objeto é um instantâneo do estado da caneta tablet no momento em que os dados foram coletados. Como os plug-ins recebem os dados da caneta tablet como parte do fluxo de dados da caneta tablet, os plug-ins devem usar as informações no objeto Stylus em vez de verificar o estado atual de uma caneta tablet específica por meio da classe Cursor .

Cada objeto Stylus contém o identificador de contexto do tablet para o tablet que gerou os dados.

Dados de gesto do sistema

O objeto RealTimeStylus recebe dados sobre gestos do sistema conforme eles são reconhecidos pelo Tablet PC. A tabela a seguir descreve a ordem na qual os objetos SystemGestureData ocorrem no fluxo de dados da caneta tablet em relação a outros dados de caneta tablet.

Systemgesture Objetos que precedem o objeto SystemGestureData Objetos que vêm após o objeto SystemGestureData
Toque O objeto StylusDownData .
O objeto StylusUpData .
DoubleTap O objeto StylusDownData , o objeto SystemGestureData para o gesto do sistema Tap e os objetos StylusUpData .
O segundo objeto StylusDownData .
RightTap O objeto StylusDownData e o objeto SystemGestureData para o membro HoldEnter da enumeração SystemGesure .
O objeto StylusUpData .
Arrastar O objeto StylusDownData .
O objeto StylusUpData .
RightDrag O objeto StylusDownData .
O objeto StylusUpData .
HoldEnter O objeto StylusDownData .
O objeto StylusUpData .
Nota: Esse gesto do sistema não será reconhecido se o usuário iniciar um gesto do sistema Drag ou RightDrag .
HoldLeave Não implementado.
Não implementado.
HoverEnter Vários objetos InAirPacketsData de baixa velocidade média.
Nota: Pode haver um atraso perceptível antes de receber o gesto do sistema HoverEnter . O objeto RealTimeStylus só receberá esses dados se o objeto RealTimeStylus estiver anexado à janela ou ao controle que está diretamente sob a caneta no momento do gesto do sistema.
HoverLeave O objeto SystemGestureData para o gesto do sistema HoverEnter e vários objetos InAirPacketsData de velocidade média suficiente.
Nota: Pode haver um atraso perceptível antes de receber o gesto do sistema HoverLeave . O objeto RealTimeStylus só receberá esses dados se o objeto RealTimeStylus estiver anexado à janela ou ao controle que está diretamente sob a caneta no momento do gesto do sistema.

 

Dados de caneta personalizados

Os dados de caneta personalizados podem ser adicionados ao objeto RealTimeStylus chamando o método AddCustomStylusDataToQueue . Os dados de caneta personalizados podem ser adicionados às filas do objeto RealTimeStylus em um dos três locais.

  • Quando o parâmetro de fila é definido como Saída, os dados personalizados são adicionados à fila de saída do objeto RealTimeStylus após os dados atualmente sendo processados pela coleção de plug-in síncrona.
  • Quando o parâmetro de fila é definido como OutputImmediate, os dados personalizados são adicionados à fila de saída do objeto RealTimeStylus antes que os dados atualmente sejam processados pela coleção de plug-ins síncrona.
  • Quando o parâmetro de fila é definido como Entrada, os dados personalizados são adicionados à fila de entrada do objeto RealTimeStylus e são enviados para a coleção de plug-in síncrona antes de novos dados do fluxo de dados da caneta tablet.

Em cada um dos casos anteriores, os dados adicionados por plug-ins subsequentes na coleção de plug-ins síncronos são adicionados após os dados adicionados pelos plug-ins anteriores.

Observação

Se a chamada para o método AddCustomStylusDataToQueue for feita de um plug-in síncrono em resposta a uma chamada a um de seus métodos IStylusSyncPlugin , os dados de caneta personalizados serão adicionados ao fluxo de dados da caneta tablet de maneira previsível; caso contrário, ele é adicionado à fila em relação aos dados de caneta atuais que o objeto RealTimeStylus está processando e não em relação aos dados que o plug-in assíncrono está processando. O método AddCustomStylusDataToQueue gerará uma exceção se o objeto RealTimeStylus estiver desabilitado .

 

Os dados de caneta personalizados são adicionados à fila como um objeto CustomStylusData e os plug-ins recebem esses dados por meio do método Microsoft.StylusInput.IStylusSyncPlugin.CustomStylusDataAdded ou Microsoft.StylusInput.IStylusAsyncPlugin.CustomStylusDataAdded .

Os objetos DynamicRenderer e GestureRecognizer podem adicionar dados de caneta personalizados à fila. Para obter mais informações sobre o DynamicRenderer e os objetos GestureRecognizer , consulte Plug-ins do Dynamic-Renderer e Plug-ins recognizer.

O objeto RealTimeStylus chama o método Microsoft.StylusInput.IStylusSyncPlugin.CustomStylusDataAdded no thread do qual recebe a chamada para seu método AddCustomStylusDataToQueue .

O diagrama a seguir ilustra a adição de dados de caneta personalizados à fila de saída com o parâmetro de fila definido como Saída.

ilustração mostrando o fluxo de dados de caneta personalizado para a fila de saída

Neste diagrama, os círculos com letras "A" e "B" representam dados de caneta tablet que já foram adicionados à fila de saída do objeto RealTimeStylus e que ainda não foram enviados para a coleção de plug-ins assíncrona. O círculo com letras "C" representa os dados da caneta tablet que o objeto RealTimeStylus está processando no momento. Ele é enviado para a coleção de plug-in síncrono e colocado na fila de saída. Os círculos numerados "1", "2" e "3" representam dados de caneta personalizados que foram adicionados à fila de saída pelo primeiro, segundo e terceiro plug-ins síncronos, respectivamente, em resposta aos dados da caneta tablet representados por "C". Os plug-ins adicionaram os dados de caneta personalizados com o parâmetro de fila definido como StylusQueues. O círculo vazio representa a posição na fila de saída em que os dados futuros da caneta tablet são adicionados.

O diagrama a seguir ilustra a adição de dados de caneta personalizados à fila de saída com o parâmetro de fila definido como OutputImmediate.

Diagrama que mostra o fluxo de dados de caneta personalizado para a fila de saída.

Neste diagrama, os círculos com letras "A" e "B" representam dados de caneta tablet que já foram adicionados à fila de saída do objeto RealTimeStylus e que ainda não foram enviados para a coleção de plug-ins assíncrona. O círculo com letras "C" representa os dados da caneta tablet que o objeto RealTimeStylus está processando no momento. Ele é enviado para a coleção de plug-in síncrono e colocado na fila de saída. Os círculos numerados "1", "2" e "3" representam dados de caneta personalizados que foram adicionados à fila de saída pelo primeiro, segundo e terceiro plug-ins síncronos, respectivamente, em resposta aos dados da caneta tablet representados por "C". Os plug-ins adicionaram os dados de caneta personalizados com o parâmetro de fila definido como OutputImmediate. O círculo vazio representa a posição na fila de saída em que os dados futuros da caneta tablet são adicionados.

O diagrama a seguir ilustra a adição de dados de caneta personalizados à fila de entrada.

ilustração mostrando o fluxo de dados de caneta personalizado para a fila de saída

Neste diagrama, os círculos com letras "A" e "B" representam dados de caneta tablet que já foram adicionados à fila de saída do objeto RealTimeStylus e que ainda não foram enviados para a coleção de plug-ins assíncrona. O círculo com letras "C" representa os dados da caneta tablet que o objeto RealTimeStylus está processando no momento. Ele é enviado para a coleção de plug-in síncrono e colocado na fila de saída. Os círculos numerados "1", "2" e "3" representam dados de caneta personalizados que foram adicionados à fila de entrada pelo primeiro, segundo e terceiro plug-ins síncronos, respectivamente, em resposta aos dados da caneta tablet representados por "C". Os plug-ins adicionaram os dados de caneta personalizados com o parâmetro de fila definido como Entrada. Os dados de caneta personalizados numerados "1" são então passados para os plug-ins síncronos e, em seguida, para a fila de saída antes que os dados de caneta personalizados sejam numerados como "2" e "3", ambos processados antes que os próximos dados da caneta tablet sejam processados. O círculo vazio representa a posição na fila de saída em que os dados futuros da caneta tablet são adicionados.

Dados de erro

Quando um plug-in gera uma exceção, o fluxo normal de dados é interrompido. O objeto RealTimeStylus gera um objeto ErrorData e chama:

Se o plug-in que gerou a exceção for um plug-in síncrono, o objeto ErrorData será adicionado à fila de saída. Em seguida, o objeto RealTimeStylus retoma o processamento normal dos dados originais.

O diagrama a seguir ilustra a adição de dados de erro aos dados da caneta tablet.

fluxo de dados de caneta personalizada para a fila de saída com a adição de dados de erro

Neste diagrama, os círculos com letras "A" e "B" representam dados de caneta tablet que já foram adicionados à fila de saída do objeto RealTimeStylus e que ainda não foram enviados para a coleção de plug-ins assíncrona. O círculo com letras "C" representa os dados da caneta tablet que o objeto RealTimeStylus está processando no momento. O círculo com letras "e" representa um objeto ErrorData gerado pelo objeto RealTimeStylus quando o segundo plug-in síncrono, Plug-in Síncrono 2, gera uma exceção enquanto está processando "C". O objeto RealTimeStylus pausa o processamento de "C" e passa "e" para o plug-in que gerou a exceção e todos os plug-ins subsequentes. Em seguida, o objeto RealTimeStylus coloca "e" na fila de saída e retoma o processamento de "C", que é passado para os plug-ins restantes na coleção de plug-ins síncrona e colocado na fila de saída após "e". O círculo vazio representa a posição na fila de saída em que os dados futuros da caneta tablet são adicionados.

Se um plug-in gerar uma exceção de seu método Error, o objeto RealTimeStylus capturará a exceção, mas não gerará um novo objeto ErrorData . Isso é para evitar a recursão.

Os dados de erro são adicionados à fila de saída após quaisquer dados de caneta personalizados adicionados na posição OutputImmediate antes da exceção que criou os dados de erro e antes de quaisquer dados de caneta personalizados adicionados na posição OutputImmediate por plug-ins subsequentes na coleção de plug-ins síncrona.

O diagrama a seguir ilustra como os dados de erro são adicionados à fila de saída em relação aos dados personalizados adicionados à fila OutputImmediate .

dados de erro adicionados à fila de saída em relação aos dados personalizados adicionados à fila outputimmediate.

Neste diagrama, os círculos com letras "A" e "B" representam dados de caneta tablet que já foram adicionados à fila de saída do objeto RealTimeStylus e que ainda não foram enviados para a coleção de plug-ins assíncrona. O círculo com letras "C" representa os dados da caneta tablet que o objeto RealTimeStylus está processando no momento. Os círculos numerados "1", "2" e "3" são adicionados pelo primeiro, segundo e terceiro plug-ins síncronos, respectivamente, à fila OutputImmediate em resposta aos dados representados pelo círculo com letras "C". O círculo com letras "e" representa os dados de erro gerados em resposta a uma exceção gerada pelo segundo plug-in depois que o segundo plug-in adicionou dados personalizados à fila de saída na posição OutputImmediate .

Se qualquer plug-in síncrono adicionar dados de caneta personalizados à fila de entrada em resposta aos dados de erro, os dados serão adicionados imediatamente antes dos dados de erro. Se qualquer um dos plug-ins síncronos adicionar dados de caneta personalizados à fila de saída na posição Saída em resposta aos dados de erro, os dados serão adicionados imediatamente após os dados de erro.

O objeto RealTimeStylus chama o método Microsoft.StylusInput.IStylusSyncPlugin.Error no thread do qual a exceção é gerada.

Microsoft.Ink.Tablet

Microsoft.StylusInput.PluginData

Microsoft.StylusInput.DataInterestMask

Microsoft.StylusInput.RealTimeStylus

Trabalhando com a classe RealTimeStylus