ILocationEvents::OnLocationChanged 方法 (locationapi.h)
[Win32 位置 API 可用於需求一節中指定的作業系統。 它在後續版本中可能會變更或無法使用。 請改用 Windows.Devices.Geolocation API。 ]
當新的位置報表可供使用時呼叫。
語法
HRESULT OnLocationChanged(
[in] REFIID reportType,
[in] ILocationReport *pLocationReport
);
參數
[in] reportType
REFIID ,其中包含 pLocationReport 中包含的報表類型介面識別碼。
[in] pLocationReport
包含新位置報表之 ILocationReport 實例的指標。
傳回值
如果此方法成功,則會傳回 S_OK。 否則,它會傳回 HRESULT 錯誤碼。
備註
ILocationReport 是特定位置報表類型的基底介面。 呼叫端針對 pLocationReport 接收的實際介面會符合 reportType 所指定的類型。
如果應用程式在第一次使用位置時呼叫 OnLocationChanged,則呼叫可能會導致通知出現在任務欄中,並導致位置活動事件記錄在 事件檢視器 中。
注意 如果下列兩個條件都成立,應用程式就不會收到 OnLocationChanged 的預期位置變更事件。 首先,應用程式會在 LOCALSERVICE、SYSTEM 或 NETWORKSERVICE 使用者帳戶的內容中以服務的形式執行。 其次,當使用者在 控制台 中選取預設位置時手動變更預設位置,或應用程式呼叫 IDefaultLocation::SetReport 時,位置變更事件會產生。
範例
下列 OnLocationChanged 實作範例會處理緯度/經度報表的位置變更事件。 此實作會列印有關緯度/經度位置變更事件的下列資訊:時間戳、感測器標識碼、緯度、經度、錯誤半徑、高度和高度錯誤。
// 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;
}
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 7 [僅限傳統型應用程式],Windows 7 |
最低支援的伺服器 | 都不支援 |
目標平台 | Windows |
標頭 | locationapi.h |
Dll | LocationAPI.dll |