Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
Bunun yerine UWP Algılayıcı API'sini kullanın.
COM tabanlı Algılayıcı API'si kullanım dışıdır ve yeni uygulamalarda kullanılmamalıdır. Ek özellik veya geliştirme planlanmıyor ve destek sınırlı olacak.
Algılayıcı API'si, geri çağırma arabirimleri aracılığıyla olay bildirimleri sağlar.
Olay bildirimlerini almak için programınızın gerekli COM geri çağırma arabirimlerini uygulaması gerekir. Algılayıcılardan olay almak için ISensorEventsuygulamanız gerekir. Algılayıcı yöneticisinden olay almak için ISensorManagerEventsuygulamanız gerekir.
Aşağıdaki örnek kod,ISensorEvents uygulayan bir sınıf oluşturur.
class CMyEvents : public ISensorEvents
{
public:
STDMETHODIMP QueryInterface(REFIID iid, void** ppv)
{
if (ppv == NULL)
{
return E_POINTER;
}
if (iid == __uuidof(IUnknown))
{
*ppv = static_cast<IUnknown*>(this);
}
else if (iid == __uuidof(ISensorEvents))
{
*ppv = static_cast<ISensorEvents*>(this);
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) AddRef()
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) Release()
{
ULONG count = InterlockedDecrement(&m_cRef);
if (count == 0)
{
delete this;
return 0;
}
return count;
}
//
// ISensorEvents methods.
//
STDMETHODIMP OnEvent(
ISensor *pSensor,
REFGUID eventID,
IPortableDeviceValues *pEventData)
{
HRESULT hr = S_OK;
// Handle custom events here.
return hr;
}
STDMETHODIMP OnDataUpdated(
ISensor *pSensor,
ISensorDataReport *pNewData)
{
HRESULT hr = S_OK;
if(NULL == pNewData ||
NULL == pSensor)
{
return E_INVALIDARG;
}
ULONG ulHour = 0;
ULONG ulMinute = 0;
ULONG ulSecond = 0;
PROPVARIANT var = {};
hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_HOUR, &var);
if(SUCCEEDED(hr))
{
if(var.vt == VT_UI4)
{
// Get the hour value.
ulHour = var.ulVal;
}
}
PropVariantClear(&var);
if(SUCCEEDED(hr))
{
hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_MINUTE, &var);
}
if(SUCCEEDED(hr))
{
if(var.vt == VT_UI4)
{
// Get the hour value.
ulMinute = var.ulVal;
}
}
PropVariantClear(&var);
if(SUCCEEDED(hr))
{
hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_SECOND, &var);
}
if(SUCCEEDED(hr))
{
if(var.vt == VT_UI4)
{
// Get the hour value.
ulSecond = var.ulVal;
}
}
PropVariantClear(&var);
if(SUCCEEDED(hr))
{
// Print
wprintf_s(L"Current local time is: \n");
wprintf_s(L"%02d:%02d:%02d (asynchronous)\n", ulHour, ulMinute, ulSecond);
}
return hr;
}
STDMETHODIMP OnLeave(
REFSENSOR_ID sensorID)
{
HRESULT hr = S_OK;
// Perform any housekeeping tasks for the sensor that is leaving.
// For example, if you have maintained a reference to the sensor,
// release it now and set the pointer to NULL.
return hr;
}
STDMETHODIMP OnStateChanged(
ISensor* pSensor,
SensorState state)
{
HRESULT hr = S_OK;
if(NULL == pSensor)
{
return E_INVALIDARG;
}
if(state == SENSOR_STATE_READY)
{
wprintf_s(L"\nTime sensor is now ready.");
}
else if(state == SENSOR_STATE_ACCESS_DENIED)
{
wprintf_s(L"\nNo permission for the time sensor.\n");
wprintf_s(L"Enable the sensor in the control panel.\n");
}
return hr;
}
private:
long m_cRef;
};
Geri çağırma arabirimini hayata geçirdikten sonra, geri çağırma sınıfınızın bir örneğine işaret eden bir belirli algılayıcı sağlayarak algılayıcıdan olay bildirimleri almaya başlayabilirsiniz.
Aşağıdaki örnek kod, geri çağırma sınıfının bir örneğini oluşturur ve ardından bir algılayıcıdan olay bildirimleri isteğinde bulunur.
CMyEvents* pEventClass = NULL;
ISensorEvents* pMyEvents = NULL;
if(SUCCEEDED(hr))
{
// Create an instance of the event class.
pEventClass = new(std::nothrow) CMyEvents();
}
if(SUCCEEDED(hr))
{
// Retrieve the pointer to the callback interface.
hr = pEventClass->QueryInterface(IID_PPV_ARGS(&pMyEvents));
}
if(SUCCEEDED(hr))
{
// Start receiving events.
hr = pSensor->SetEventSink(pMyEvents);
}
Algılayıcı yöneticisinden olay almak için benzer kodlar yazabilirsiniz.
Aşağıdaki örnek kod, olay bildirimlerini almayı nasıl durduracağınızı gösterir.
if(SUCCEEDED(hr))
{
hr = pSensor->SetEventSink(NULL);
}
Rapor Aralığı İsteme
Uygulamanızın veri güncelleştirilmiş olayları ne sıklıkta aldığına ilişkin bir değer önerebilirsiniz. Ancak algılayıcıların belirli bir aralıkta olay sağlaması gerekmez. Önerilen değerinizin algılayıcının olayları tetiklerken kullandığı gerçek rapor aralığıyla eşleşmeyebileceğini unutmayın. Gerçek rapor aralığını öğrenmek için SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL özelliğinin değerini Algılayıcı Özelliklerini Alma ve Ayarlamabölümünde açıklandığı gibi alın.
Aşağıdaki örnek kod, SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL özelliği için yeni bir değer isteyen bir yardımcı işlev oluşturur. Fonksiyon, özelliğin ayarlanacağı algılayıcıya bir işaretçi ve ayarlanacak yeni rapor aralığını belirten bir ULONG değeri alır.
HRESULT SetCurrentReportInterval(ISensor* pSensor, ULONG ulNewInterval)
{
assert(pSensor);
HRESULT hr = S_OK;
IPortableDeviceValues* pPropsToSet = NULL; // Input
IPortableDeviceValues* pPropsReturn = NULL; // Output
// Create the input object.
hr = CoCreateInstance(__uuidof(PortableDeviceValues),
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPropsToSet));
if(SUCCEEDED(hr))
{
// Add the current report interval property.
hr = pPropsToSet->SetUnsignedIntegerValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, ulNewInterval);
}
if(SUCCEEDED(hr))
{
// Only setting a single property, here.
hr = pSensor->SetProperties(pPropsToSet, &pPropsReturn);
}
// Test for failure.
if(hr == S_FALSE)
{
HRESULT hrError = S_OK;
// Check results for failure.
hr = pPropsReturn->GetErrorValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, &hrError);
if(SUCCEEDED(hr))
{
// Print an error message.
wprintf_s(L"\nSetting current report interval failed with error 0x%X\n", hrError);
// Return the error code.
hr = hrError;
}
}
else if(hr == E_ACCESSDENIED)
{
// No permission. Take appropriate action.
}
SafeRelease(&pPropsToSet);
SafeRelease(&pPropsReturn);
return hr;
}
İlgili konular
-
Algılayıcı API'leri Olayları Hakkında