共用方式為


新增輪詢事件支援

若要正確設定 WIA 驅動程式以報告輪詢事件,請執行下列動作:

  1. 在裝置的 INF 檔案中設定 Capabilities=0x33 。 (如需詳細資訊,請參閱 WIA 裝置的 INF 檔案 。)

  2. IStiUSD::GetCapabilities方法中的報表STI_GENCAP_NOTIFICATIONS和STI_USD_GENCAP_NATIVE_PUSHSUPPORT。

  3. 報告 IWiaMiniDrv::d rvGetCapabilities 方法中的所有支援事件。

  4. 回應 IStiUSD::GetStatus 方法的 呼叫。 WIA 服務會以可在 INF 檔案中設定的預設間隔呼叫這個方法。 預設設定為 1 秒間隔。

  5. IStiUSD::GetNotificationData 方法中報告適當的事件資訊回應。

WIA 服務會針對兩個主要作業呼叫 IStiUSD::GetStatus 方法:

  1. 檢查裝置的線上狀態。

  2. 輪詢裝置事件,例如按鈕事件。

藉由檢查STI_DEVICE_STATUS結構的StatusMask成員,即可判斷作業要求。 StatusMask成員可以是下列其中一個要求:

STI_DEVSTATUS_ONLINE_STATE
此作業要求會檢查裝置是否在線上,而且應該藉由設定STI_DEVICE_STATUS結構的 dwOnlinesState 成員來填入。

STI_DEVSTATUS_EVENTS_STATE
此作業要求會檢查裝置事件。 它應該藉由設定STI_DEVICE_STATUS結構的 dwEventHandlingState 成員來填入。 應該使用的值是STI_EVENTHANDLING_PENDING。 (裝置有擱置中的事件,正在等候向 WIA 服務回報。)

設定STI_EVENTHANDLING_PENDING時,WIA 服務會發出訊號,指出 WIA 驅動程式中發生事件。 WIA 服務會呼叫 IStiUSD::GetNotificationData 方法,以取得事件的詳細資訊。

系統會針對輪詢的事件和中斷事件呼叫 IStiUSD::GetNotificationData 方法。 在此方法中,您應該填寫適當的事件資訊,以返回 WIA 服務。

注意 請一律清除 dwEventHandlingState 成員中的STI_EVENTHANDLING_PENDING旗標,以確保裝置事件發生時已正確設定。 當偵測到事件時,此 WIA 驅動程式應該將 m_guidLastEvent 類別成員變數設定為適當的事件 GUID。 WIA 服務呼叫IStiUSD::GetNotificationData方法時,稍後會檢查m_guidLastEventm_guidLastEvent成員變數定義于CWIADevice類別中, (下列程式碼片段) ,用來快取最後一個發出訊號的事件。 WIA 服務要求此成員變數之後,它一律會設定為 GUID_Null。

下列範例示範 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;
}