Adicionar suporte a eventos de sondagem
Para configurar corretamente o driver WIA para relatar eventos de sondagem, faça o seguinte:
Defina Capabilities=0x33 no arquivo INF do dispositivo. (Consulte Arquivos INF para dispositivos WIA para obter detalhes.)
Relatar STI_GENCAP_NOTIFICATIONS e STI_USD_GENCAP_NATIVE_PUSHSUPPORT no método IStiUSD::GetCapabilities .
Relate todos os eventos com suporte no método IWiaMiniDrv::d rvGetCapabilities .
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.
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:
Verificando a status online do dispositivo.
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;
}