Compartilhar via


Adicionar suporte a eventos de sondagem

Para configurar corretamente o driver WIA para relatar eventos de sondagem, faça o seguinte:

  1. Defina Capabilities=0x33 no arquivo INF do dispositivo. (Consulte Arquivos INF para dispositivos WIA para obter detalhes.)

  2. Relatar STI_GENCAP_NOTIFICATIONS e STI_USD_GENCAP_NATIVE_PUSHSUPPORT no método IStiUSD::GetCapabilities .

  3. Relate todos os eventos com suporte no método IWiaMiniDrv::d rvGetCapabilities .

  4. Responda a chamadas para o método IStiUSD::GetStatus . O serviço WIA chama esse método em um intervalo predefinido que é configurável no arquivo INF. A configuração padrão é um intervalo de 1 segundo.

  5. Relate a resposta adequada de informações de evento no método IStiUSD::GetNotificationData .

O serviço WIA chama o método IStiUSD::GetStatus para duas operações principais:

  1. Verificando a status online do dispositivo.

  2. Sondagem de eventos de dispositivo, como um evento de botão de ação.

Determinar a solicitação de operação pode ser feito verificando o membro StatusMask da estrutura STI_DEVICE_STATUS . O membro StatusMask pode ser uma das seguintes solicitações:

STI_DEVSTATUS_ONLINE_STATE
Essa solicitação de operação verifica se o dispositivo está online e deve ser preenchido definindo o membro dwOnlinesState da estrutura STI_DEVICE_STATUS.

STI_DEVSTATUS_EVENTS_STATE
Esta solicitação de operação verifica se há eventos de dispositivo. Ele deve ser preenchido definindo o membro dwEventHandlingState da estrutura STI_DEVICE_STATUS. O valor que deve ser usado é STI_EVENTHANDLING_PENDING. (O dispositivo tem um evento pendente e está aguardando para denunciá-lo ao serviço WIA.)

Quando STI_EVENTHANDLING_PENDING é definido, o serviço WIA é sinalizado de que ocorreu um evento no driver WIA. O serviço WIA chama o método IStiUSD::GetNotificationData para obter mais informações sobre o evento.

O método IStiUSD::GetNotificationData é chamado para eventos sondados e eventos de interrupção. É nesse método que você deve preencher as informações de evento adequadas para retornar ao serviço WIA.

Nota Sempre desmarque o sinalizador STI_EVENTHANDLING_PENDING no membro dwEventHandlingState para garantir que ele seja definido corretamente quando ocorrer um evento de dispositivo. Esse driver WIA deve definir a variável de membro da classe m_guidLastEvent para o GUID de evento adequado quando um evento é detectado. O m_guidLastEvent é verificado posteriormente quando o serviço WIA chama o método IStiUSD::GetNotificationData . A variável de membro m_guidLastEvent é definida na classe CWIADevice (no snippet de código a seguir), usada para armazenar em cache o último evento sinalizado. Depois que essa variável de membro tiver sido solicitada pelo serviço WIA, ela sempre será definida como GUID_NULL.

O exemplo a seguir mostra uma implementação do método IStiUSD::GetStatus .

STDMETHODIMP CWIADevice::GetStatus(PSTI_DEVICE_STATUS pDevStatus)
{
  //
  // If the caller did not pass in the correct parameters,
  // then fail the call with E_INVALIDARG.
  //

  if(!pDevStatus)
  {
      return E_INVALIDARG;
  }

  HRESULT hr = S_OK;

  //
  // If we are asked, verify state of an event handler 
  //(front panel buttons, user controlled attachments, etc.).
  //
  // If your device requires polling, then this is where you would
  // specify the event result.
  // However, It is not recommended to have polled events.
  // Interrupt events are better for performance, and reliability.
  // See the SetNotificationsHandle method for how to
  // implement interrupt events.
  //

  //
  // clear the dwEventHandlingState field first to make sure we are really setting
  // a pending event.
  //

  pDevStatus->dwEventHandlingState &= ~STI_EVENTHANDLING_PENDING;
  if (pDevStatus->StatusMask & STI_DEVSTATUS_EVENTS_STATE) {

    //
    // set the polled event result here, for the GetNotificationData()
    // method to read and report.
    // (m_guidLastEvent will be read in GetNotificationData)
    //

    LONG lEventResult = 0;
    PollMyDeviceForEvents(&lEventResult)

    if(lEventResult == DEVICE_SCAN_BUTTON_PRESSED) {

        //
        // polled event result was one we know about
        //

        m_guidLastEvent = WIA_EVENT_SCAN_IMAGE;
    } else {

        //
        // nothing happened, so continue
        //

        m_guidLastEvent = GUID_NULL;
    }

    if (m_guidLastEvent != GUID_NULL) {

        //
        // if the event GUID is NOT GUID_NULL, set the
        // STI_EVENTHANDLING_PENDING flag letting the WIA service
        // know that we have an event ready. This will tell the WIA
        // service to call GetNotificationData() for the event
        // specific information.
        //

        pDevStatus->dwEventHandlingState |= STI_EVENTHANDLING_PENDING;
    }
  }
  return S_OK;
}