Compartilhar via


Método ILocationEvents::OnLocationChanged (locationapi.h)

[A API de Localização do Win32 está disponível para uso nos sistemas operacionais especificados na seção Requisitos. Ele poderá ser alterado ou ficar indisponível em versões subsequentes. Em vez disso, use a API Windows.Devices.Geolocation . ]

Chamado quando um novo relatório de localização está disponível.

Sintaxe

HRESULT OnLocationChanged(
  [in] REFIID          reportType,
  [in] ILocationReport *pLocationReport
);

Parâmetros

[in] reportType

REFIID que contém a ID da interface do tipo de relatório contido em pLocationReport.

[in] pLocationReport

Ponteiro para a instância ILocationReport que contém o novo relatório de localização.

Retornar valor

Se o método for bem-sucedido, ele retornará S_OK. Caso contrário, ele retornará um código de erro HRESULT.

Comentários

ILocationReport é a interface base de tipos de relatório de localização específicos. A interface real que o chamador recebe para pLocationReport corresponderá ao tipo especificado por reportType.

Se o aplicativo chamar OnLocationChanged como resultado de seu primeiro uso de localização, a chamada poderá fazer com que uma notificação apareça na barra de tarefas e fazer com que um evento de Atividade de Local seja conectado Visualizador de Eventos.

Nota Um aplicativo não receberá o evento de alteração de local esperado de OnLocationChanged se ambas as condições a seguir forem verdadeiras. Primeiro, o aplicativo é executado como um serviço, no contexto da conta de usuário LOCALSERVICE, SYSTEM ou NETWORKSERVICE. Em segundo lugar, o evento de alteração de local resulta da alteração do local padrão, manualmente quando o usuário seleciona Local Padrão no Painel de Controle ou programaticamente quando um aplicativo chama IDefaultLocation::SetReport.
 

Exemplos

A implementação de exemplo a seguir de OnLocationChanged manipula o evento de alteração de local para um relatório de latitude/longitude. Essa implementação imprime as seguintes informações sobre um evento de alteração de local de latitude/longitude: o carimbo de data/hora, a ID do sensor, a latitude, a longitude, o raio do erro, a altitude e o erro de altitude.

// 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 Valor
Cliente mínimo com suporte Windows 7 [somente aplicativos da área de trabalho], Windows 7
Servidor mínimo com suporte Nenhum compatível
Plataforma de Destino Windows
Cabeçalho locationapi.h
DLL LocationAPI.dll