Compartir a través de


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.

Nota Una aplicación no recibe el evento de cambio de ubicación esperado de OnLocationChanged si se cumplen las dos condiciones siguientes. En primer lugar, la aplicación se ejecuta como un servicio, en el contexto de la cuenta de usuario LOCALSERVICE, SYSTEM o NETWORKSERVICE. En segundo lugar, el evento de cambio de ubicación se produce al cambiar la ubicación predeterminada manualmente cuando el usuario selecciona Ubicación predeterminada en Panel de control o mediante programación cuando una aplicación llama a IDefaultLocation::SetReport.
 

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*)&currentTime))
                {
                    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