Método ILocationEvents::OnLocationChanged (locationapi.h)
[La API de ubicación de Win32 está disponible para su uso en los sistemas operativos especificados en la sección Requisitos. En versiones posteriores podría modificarse o no estar disponible. En su lugar, use la API Windows.Devices.Geolocation . ]
Se le llama cuando hay disponible un nuevo informe de ubicación.
Sintaxis
HRESULT OnLocationChanged(
[in] REFIID reportType,
[in] ILocationReport *pLocationReport
);
Parámetros
[in] reportType
REFIID que contiene el identificador de interfaz del tipo de informe contenido en pLocationReport.
[in] pLocationReport
Puntero a la instancia de ILocationReport que contiene el nuevo informe de ubicación.
Valor devuelto
Si este método se realiza correctamente, devuelve S_OK. De lo contrario, devuelve un código de error de HRESULT.
Comentarios
ILocationReport es la interfaz base de tipos de informe de ubicación específicos. La interfaz real que recibe el autor de la llamada para pLocationReport coincidirá con el tipo especificado por reportType.
Si la aplicación llama a OnLocationChanged como resultado de su primer uso de ubicación, la llamada puede provocar que aparezca una notificación en la barra de tareas y que se registre un evento de actividad de ubicación en Visor de eventos.
Ejemplos
La siguiente implementación de ejemplo de OnLocationChanged controla el evento de cambio de ubicación para un informe de latitud y longitud. Esta implementación imprime la siguiente información sobre un evento de cambio de ubicación de latitud y longitud: la marca de tiempo, el identificador del sensor, la latitud, la longitud, el radio de error, la altitud y el error de altitud.
// This is called when there is a new location report
STDMETHODIMP CLocationEvents::OnLocationChanged(REFIID reportType, ILocationReport* pLocationReport)
{
// If the report type is a Latitude/Longitude report (as opposed to IID_ICivicAddressReport or another type)
if (IID_ILatLongReport == reportType)
{
CComPtr<ILatLongReport> spLatLongReport;
// Get the ILatLongReport interface from ILocationReport
if ((SUCCEEDED(pLocationReport->QueryInterface(IID_PPV_ARGS(&spLatLongReport)))) && (NULL != spLatLongReport.p))
{
// Print the Report Type GUID
wchar_t szGUID[64];
wprintf(L"\nReportType: %s", GUIDToString(IID_ILatLongReport, szGUID, ARRAYSIZE(szGUID)));
// Print the Timestamp and the time since the last report
SYSTEMTIME systemTime;
if (SUCCEEDED(spLatLongReport->GetTimestamp(&systemTime)))
{
// Compute the number of 100ns units that difference between the current report's time and the previous report's time.
ULONGLONG currentTime = 0, diffTime = 0;
if (TRUE == SystemTimeToFileTime(&systemTime, (FILETIME*)¤tTime))
{
diffTime = (currentTime > m_previousTime) ? (currentTime - m_previousTime) : 0;
}
wprintf(L"\nTimestamp: YY:%d, MM:%d, DD:%d, HH:%d, MM:%d, SS:%d, MS:%d [%I64d]\n",
systemTime.wYear,
systemTime.wMonth,
systemTime.wDay,
systemTime.wHour,
systemTime.wMinute,
systemTime.wSecond,
systemTime.wMilliseconds,
diffTime / 10000); // Display in milliseconds
m_previousTime = currentTime; // Set the previous time to the current time for the next report.
}
// Print the Sensor ID GUID
GUID sensorID = {0};
if (SUCCEEDED(spLatLongReport->GetSensorID(&sensorID)))
{
wchar_t szGUID[64];
wprintf(L"SensorID: %s\n", GUIDToString(sensorID, szGUID, ARRAYSIZE(szGUID)));
}
DOUBLE latitude = 0, longitude = 0, altitude = 0, errorRadius = 0, altitudeError = 0;
// Print the Latitude
if (SUCCEEDED(spLatLongReport->GetLatitude(&latitude)))
{
wprintf(L"Latitude: %f\n", latitude);
}
// Print the Longitude
if (SUCCEEDED(spLatLongReport->GetLongitude(&longitude)))
{
wprintf(L"Longitude: %f\n", longitude);
}
// Print the Altitude
if (SUCCEEDED(spLatLongReport->GetAltitude(&altitude)))
{
wprintf(L"Altitude: %f\n", altitude);
}
else
{
// Altitude is optional and may not be available
wprintf(L"Altitude: Not available.\n");
}
// Print the Error Radius
if (SUCCEEDED(spLatLongReport->GetErrorRadius(&errorRadius)))
{
wprintf(L"Error Radius: %f\n", errorRadius);
}
// Print the Altitude Error
if (SUCCEEDED(spLatLongReport->GetAltitudeError(&altitudeError)))
{
wprintf(L"Altitude Error: %f\n", altitudeError);
}
else
{
// Altitude Error is optional and may not be available
wprintf(L"Altitude Error: Not available.\n");
}
}
}
return S_OK;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 7 [solo aplicaciones de escritorio],Windows 7 |
Servidor mínimo compatible | No se admite ninguno |
Plataforma de destino | Windows |
Encabezado | locationapi.h |
Archivo DLL | LocationAPI.dll |