新增輪詢事件支援
若要正確設定 WIA 驅動程式以報告輪詢事件,請執行下列動作:
在裝置的 INF 檔案中設定 Capabilities=0x33 。 (如需詳細資訊,請參閱 WIA 裝置的 INF 檔案 。)
IStiUSD::GetCapabilities方法中的報表STI_GENCAP_NOTIFICATIONS和STI_USD_GENCAP_NATIVE_PUSHSUPPORT。
報告 IWiaMiniDrv::d rvGetCapabilities 方法中的所有支援事件。
回應 IStiUSD::GetStatus 方法的 呼叫。 WIA 服務會以可在 INF 檔案中設定的預設間隔呼叫這個方法。 預設設定為 1 秒間隔。
在 IStiUSD::GetNotificationData 方法中報告適當的事件資訊回應。
WIA 服務會針對兩個主要作業呼叫 IStiUSD::GetStatus 方法:
檢查裝置的線上狀態。
輪詢裝置事件,例如按鈕事件。
藉由檢查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_guidLastEvent。 m_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;
}