刚接触Windows Mobile是同事写的程序,在手机上开启GPRS定位时获取手机的经纬度坐标,由于获取不到卫星,在执行程序的时候报空异常。由此开始接触Windows Moblile,看了看同事的代码,然后再往上搜索资料,MSDN,,博客园,连百度文库也看了。呵呵。最后,还是在Windows Mobile6.0自带的Samples\PocketPC\CS里面看到例子和微软DLL文件的内部类。下面是GpsSample.cs例子代码,这个例子是获取GPS经纬度的例子,用到Microsoft.WindowsMobile.Samples.Location这个DLL文件,希望给其他初学者带来一些方便。
View Code 1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this sample source code is subject to the terms of the Microsoft 6 // license agreement under which you licensed this sample source code. If 7 // you did not accept the terms of the license agreement, you are not 8 // authorized to use this sample source code. For the terms of the license, 9 // please see the license agreement between you and Microsoft or, if applicable, 10 // see the LICENSE.RTF on your install media or the root of your tools installation. 11 // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. 12 // 13 // 14 // Copyright (c) Microsoft Corporation. All rights reserved. 15 // 16 // 17 // Use of this source code is subject to the terms of the Microsoft end-user 18 // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. 19 // If you did not accept the terms of the EULA, you are not authorized to use 20 // this source code. For a copy of the EULA, please see the LICENSE.RTF on your 21 // install media. 22 using System; 23 using System.Drawing; 24 using System.Collections; 25 using System.Windows.Forms; 26 using System.Data; 27 using Microsoft.WindowsMobile.Samples.Location; 28 29 namespace GpsTest 30 { 31 /// <summary> 32 /// Summary description for Form1. 33 /// </summary> 34 public class Form1 : System.Windows.Forms.Form 35 { 36 private System.Windows.Forms.MenuItem exitMenuItem; 37 private System.Windows.Forms.MainMenu mainMenu1; 38 private System.Windows.Forms.Label status; 39 private MenuItem menuItem2; 40 private MenuItem startGpsMenuItem; 41 private MenuItem stopGpsMenuItem; 42 43 44 private EventHandler updateDataHandler; 45 GpsDeviceState device = null ; 46 GpsPosition position = null ; 47 48 Gps gps = new Gps(); 49 50 public Form1() 51 { 52 // 53 // Required for Windows Form Designer support 54 // 55 InitializeComponent(); 56 57 // 58 // TODO: Add any constructor code after InitializeComponent call 59 // 60 } 61 /// <summary> 62 /// Clean up any resources being used. 63 /// </summary> 64 protected override void Dispose( bool disposing ) 65 { 66 base .Dispose( disposing ); 67 } 68 #region Windows Form Designer generated code 69 /// <summary> 70 /// Required method for Designer support - do not modify 71 /// the contents of this method with the code editor. 72 /// </summary> 73 private void InitializeComponent() 74 { 75 this .mainMenu1 = new System.Windows.Forms.MainMenu(); 76 this .exitMenuItem = new System.Windows.Forms.MenuItem(); 77 this .menuItem2 = new System.Windows.Forms.MenuItem(); 78 this .startGpsMenuItem = new System.Windows.Forms.MenuItem(); 79 this .stopGpsMenuItem = new System.Windows.Forms.MenuItem(); 80 this .status = new System.Windows.Forms.Label(); 81 // 82 // mainMenu1 83 // 84 this .mainMenu1.MenuItems.Add( this .exitMenuItem); 85 this .mainMenu1.MenuItems.Add( this .menuItem2); 86 // 87 // exitMenuItem 88 // 89 this .exitMenuItem.Text = " Exit " ; 90 this .exitMenuItem.Click += new System.EventHandler( this .exitMenuItem_Click); 91 // 92 // menuItem2 93 // 94 this .menuItem2.MenuItems.Add( this .startGpsMenuItem); 95 this .menuItem2.MenuItems.Add( this .stopGpsMenuItem); 96 this .menuItem2.Text = " GPS " ; 97 // 98 // startGpsMenuItem 99 // 100 this .startGpsMenuItem.Text = " Start GPS " ; 101 this .startGpsMenuItem.Click += new System.EventHandler( this .startGpsMenuItem_Click); 102 // 103 // stopGpsMenuItem 104 // 105 this .stopGpsMenuItem.Enabled = false ; 106 this .stopGpsMenuItem.Text = " Stop GPS " ; 107 this .stopGpsMenuItem.Click += new System.EventHandler( this .stopGpsMenuItem_Click); 108 // 109 // status 110 // 111 this .status.Location = new System.Drawing.Point( 0 , 0 ); 112 this .status.Size = new System.Drawing.Size( 237 , 173 ); 113 this .status.Text = " label1 " ; 114 // 115 // Form1 116 // 117 this .ClientSize = new System.Drawing.Size( 240 , 268 ); 118 this .Controls.Add( this .status); 119 this .Menu = this .mainMenu1; 120 this .Text = " Form1 " ; 121 this .Load += new System.EventHandler( this .Form1_Load); 122 this .Closed += new System.EventHandler( this .Form1_Closed); 123 124 } 125 #endregion 126 127 /// <summary> 128 /// The main entry point for the application. 129 /// </summary> 130 131 static void Main() 132 { 133 Application.Run( new Form1()); 134 } 135 136 private void exitMenuItem_Click( object sender, EventArgs e) 137 { 138 if (gps.Opened) 139 { 140 gps.Close(); 141 } 142 143 Close(); 144 } 145 146 private void Form1_Load( object sender, System.EventArgs e) 147 { 148 updateDataHandler = new EventHandler(UpdateData); 149 150 status.Text = "" ; 151 152 status.Width = Screen.PrimaryScreen.WorkingArea.Width; 153 status.Height = Screen.PrimaryScreen.WorkingArea.Height; 154 155 gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged); 156 gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged); 157 } 158 159 protected void gps_LocationChanged( object sender, LocationChangedEventArgs args) 160 { 161 position = args.Position; 162 163 // call the UpdateData method via the updateDataHandler so that we 164 // update the UI on the UI thread 165 Invoke(updateDataHandler); 166 167 } 168 169 void gps_DeviceStateChanged( object sender, DeviceStateChangedEventArgs args) 170 { 171 device = args.DeviceState; 172 173 // call the UpdateData method via the updateDataHandler so that we 174 // update the UI on the UI thread 175 Invoke(updateDataHandler); 176 } 177 178 void UpdateData( object sender, System.EventArgs args) 179 { 180 if (gps.Opened) 181 { 182 string str = "" ; 183 if (device != null ) 184 { 185 str = device.FriendlyName + " " + device.ServiceState + " , " + device.DeviceState + " \n " ; 186 } 187 188 if (position != null ) 189 { 190 191 if (position.LatitudeValid) 192 { 193 str += " Latitude (DD):\n " + position.Latitude + " \n " ; 194 str += " Latitude (D,M,S):\n " + position.LatitudeInDegreesMinutesSeconds + " \n " ; 195 } 196 197 if (position.LongitudeValid) 198 { 199 str += " Longitude (DD):\n " + position.Longitude + " \n " ; 200 str += " Longitude (D,M,S):\n " + position.LongitudeInDegreesMinutesSeconds + " \n " ; 201 } 202 203 if (position.SatellitesInSolutionValid && 204 position.SatellitesInViewValid && 205 position.SatelliteCountValid) 206 { 207 str += " Satellite Count:\n " + position.GetSatellitesInSolution().Length + " / " + 208 position.GetSatellitesInView().Length + " ( " + 209 position.SatelliteCount + " )\n " ; 210 } 211 212 if (position.TimeValid) 213 { 214 str += " Time:\n " + position.Time.ToString() + " \n " ; 215 } 216 } 217 218 status.Text = str; 219 220 } 221 } 222 223 private void Form1_Closed( object sender, System.EventArgs e) 224 { 225 if (gps.Opened) 226 { 227 gps.Close(); 228 } 229 } 230 231 private void stopGpsMenuItem_Click( object sender, EventArgs e) 232 { 233 if (gps.Opened) 234 { 235 gps.Close(); 236 } 237 238 startGpsMenuItem.Enabled = true ; 239 stopGpsMenuItem.Enabled = false ; 240 } 241 242 private void startGpsMenuItem_Click( object sender, EventArgs e) 243 { 244 if ( ! gps.Opened) 245 { 246 gps.Open(); 247 } 248 249 startGpsMenuItem.Enabled = false ; 250 stopGpsMenuItem.Enabled = true ; 251 } 252 } 253 }建议用Double类型保存经纬度。
例子比较简单,相信大家都很随意的都能看懂。下面是DLL文件里面包含的类文件,感兴趣的朋友可以看下。
DegreesMinutesSeconds.cs 主要负责经纬度坐标的分秒变化
View Code 1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this sample source code is subject to the terms of the Microsoft 6 // license agreement under which you licensed this sample source code. If 7 // you did not accept the terms of the license agreement, you are not 8 // authorized to use this sample source code. For the terms of the license, 9 // please see the license agreement between you and Microsoft or, if applicable, 10 // see the LICENSE.RTF on your install media or the root of your tools installation. 11 // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. 12 // 13 #region Using directives 14 15 using System; 16 17 #endregion 18 19 namespace Microsoft.WindowsMobile.Samples.Location 20 { 21 /// <summary> 22 /// class that represents a gps coordinate in degrees, minutes, and seconds. 23 /// </summary> 24 public class DegreesMinutesSeconds 25 { 26 27 bool isPositive; 28 /// <summary> 29 /// Returns true if the degrees, minutes and seconds refer to a positive value, 30 /// false otherwise. 31 /// </summary> 32 public bool IsPositive 33 { 34 get { return isPositive; } 35 } 36 37 uint degrees; 38 /// <summary> 39 /// The degrees unit of the coordinate 40 /// </summary> 41 public uint Degrees 42 { 43 get { return degrees; } 44 } 45 46 uint minutes; 47 /// <summary> 48 /// The minutes unit of the coordinate 49 /// </summary> 50 public uint Minutes 51 { 52 get { return minutes; } 53 } 54 55 double seconds; 56 /// <summary> 57 /// The seconds unit of the coordinate 58 /// </summary> 59 public double Seconds 60 { 61 get { return seconds; } 62 } 63 64 /// <summary> 65 /// Constructs a new instance of DegreesMinutesSeconds converting 66 /// from decimal degrees 67 /// </summary> 68 /// <param name="decimalDegrees"> Initial value as decimal degrees </param> 69 public DegreesMinutesSeconds( double decimalDegrees) 70 { 71 isPositive = (decimalDegrees > 0 ); 72 73 degrees = ( uint ) Math.Abs(decimalDegrees); 74 75 double doubleMinutes = (Math.Abs(decimalDegrees) - Math.Abs(( double )degrees)) * 60.0 ; 76 minutes = ( uint ) doubleMinutes; 77 78 seconds = (doubleMinutes - ( double )minutes) * 60.0 ; 79 } 80 81 /// <summary> 82 /// Constructs a new instance of DegreesMinutesSeconds 83 /// </summary> 84 /// <param name="isPositive"> True if the coordinates are positive coordinate, false if they 85 /// are negative coordinates. </param> 86 /// <param name="degrees"> Degrees unit of the coordinate </param> 87 /// <param name="minutes"> Minutes unit of the coordinate </param> 88 /// <param name="seconds"> Seconds unit of the coordinate. This should be a positive value. </param> 89 public DegreesMinutesSeconds( bool isPositive, uint degrees, uint minutes, double seconds) 90 { 91 this .isPositive = isPositive; 92 this .degrees = degrees; 93 this .minutes = minutes; 94 this .seconds = seconds; 95 } 96 97 /// <summary> 98 /// Converts the decimal, minutes, seconds coordinate to 99 /// decimal degrees 100 /// </summary> 101 /// <returns></returns> 102 public double ToDecimalDegrees() 103 { 104 double val = ( double )degrees + (( double )minutes / 60.0 ) + (( double )seconds / 3600.0 ); 105 val = isPositive ? val : val * - 1 ; 106 return val; 107 } 108 109 /// <summary> 110 /// Converts the instance to a string in format: D M' S" 111 /// </summary> 112 /// <returns> string representation of degrees, minutes, seconds </returns> 113 public override string ToString() 114 { 115 return degrees + " d " + minutes + " ' " + seconds + " \" " ; 116 } 117 } 118 }DeviceStateChangedEventArgs.cs //GPS设备的状态变化触发事件
View Code 1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this sample source code is subject to the terms of the Microsoft 6 // license agreement under which you licensed this sample source code. If 7 // you did not accept the terms of the license agreement, you are not 8 // authorized to use this sample source code. For the terms of the license, 9 // please see the license agreement between you and Microsoft or, if applicable, 10 // see the LICENSE.RTF on your install media or the root of your tools installation. 11 // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. 12 // 13 #region Using directives 14 15 using System; 16 17 #endregion 18 19 namespace Microsoft.WindowsMobile.Samples.Location 20 { 21 /// <summary> 22 /// Event args used for DeviceStateChanged event. 23 /// </summary> 24 public class DeviceStateChangedEventArgs: EventArgs 25 { 26 public DeviceStateChangedEventArgs(GpsDeviceState deviceState) 27 { 28 this .deviceState = deviceState; 29 } 30 31 /// <summary> 32 /// Gets the new device state when the GPS reports a new device state. 33 /// </summary> 34 public GpsDeviceState DeviceState 35 { 36 get 37 { 38 return deviceState; 39 } 40 } 41 42 private GpsDeviceState deviceState; 43 } 44 }
GPS.cs //GPS设备的开关及经纬度处理
View Code 1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this sample source code is subject to the terms of the Microsoft 6 // license agreement under which you licensed this sample source code. If 7 // you did not accept the terms of the license agreement, you are not 8 // authorized to use this sample source code. For the terms of the license, 9 // please see the license agreement between you and Microsoft or, if applicable, 10 // see the LICENSE.RTF on your install media or the root of your tools installation. 11 // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. 12 // 13 using System; 14 using System.Runtime.InteropServices; 15 using System.Collections; 16 using System.Text; 17 18 19 namespace Microsoft.WindowsMobile.Samples.Location 20 { 21 public delegate void LocationChangedEventHandler( object sender, LocationChangedEventArgs args); 22 public delegate void DeviceStateChangedEventHandler( object sender, DeviceStateChangedEventArgs args); 23 24 /// <summary> 25 /// Summary description for GPS. 26 /// </summary> 27 public class Gps 28 { 29 // handle to the gps device 30 IntPtr gpsHandle = IntPtr.Zero; 31 32 // handle to the native event that is signalled when the GPS 33 // devices gets a new location 34 IntPtr newLocationHandle = IntPtr.Zero; 35 36 // handle to the native event that is signalled when the GPS 37 // device state changes 38 IntPtr deviceStateChangedHandle = IntPtr.Zero; 39 40 // handle to the native event that we use to stop our event 41 // thread 42 IntPtr stopHandle = IntPtr.Zero; 43 44 // holds our event thread instance 45 System.Threading.Thread gpsEventThread = null ; View Code 1 event LocationChangedEventHandler locationChanged; 2 3 /// <summary> 4 /// Event that is raised when the GPS locaction data changes 5 /// </summary> 6 public event LocationChangedEventHandler LocationChanged 7 { 8 add 9 { 10 locationChanged += value; 11 12 // create our event thread only if the user decides to listen 13 CreateGpsEventThread(); 14 } 15 remove 16 { 17 locationChanged -= value; 18 } 19 } 20 21 22 event DeviceStateChangedEventHandler deviceStateChanged; 23 24 /// <summary> 25 /// Event that is raised when the GPS device state changes 26 /// </summary> 27 public event DeviceStateChangedEventHandler DeviceStateChanged 28 { 29 add 30 { 31 deviceStateChanged += value; 32 33 // create our event thread only if the user decides to listen 34 CreateGpsEventThread(); 35 } 36 remove 37 { 38 deviceStateChanged -= value; 39 } 40 } 41 42 /// <summary> 43 /// True: The GPS device has been opened. False: It has not been opened 44 /// </summary> 45 public bool Opened 46 { 47 get { return gpsHandle != IntPtr.Zero; } 48 } 49 50 public Gps() 51 { 52 } 53 54 ~ Gps() 55 { 56 // make sure that the GPS was closed. 57 Close(); 58 } 59 60 /// <summary> 61 /// Opens the GPS device and prepares to receive data from it. 62 /// </summary> 63 public void Open() 64 { 65 if ( ! Opened) 66 { 67 // create handles for GPS events 68 newLocationHandle = CreateEvent(IntPtr.Zero, 0 , 0 , null ); 69 deviceStateChangedHandle = CreateEvent(IntPtr.Zero, 0 , 0 , null ); 70 stopHandle = CreateEvent(IntPtr.Zero, 0 , 0 , null ); 71 72 gpsHandle = GPSOpenDevice(newLocationHandle, deviceStateChangedHandle, null , 0 ); 73 74 // if events were hooked up before the device was opened, we'll need 75 // to create the gps event thread. 76 if (locationChanged != null || deviceStateChanged != null ) 77 { 78 CreateGpsEventThread(); 79 } 80 } 81 } 82 83 /// <summary> 84 /// Closes the gps device. 85 /// </summary> 86 public void Close() 87 { 88 if (gpsHandle != IntPtr.Zero) 89 { 90 GPSCloseDevice(gpsHandle); 91 gpsHandle = IntPtr.Zero; 92 } 93 94 // Set our native stop event so we can exit our event thread. 95 if (stopHandle != IntPtr.Zero) 96 { 97 EventModify(stopHandle, eventSet); 98 } 99 100 // block until our event thread is finished before 101 // we close our native event handles 102 lock ( this ) 103 { 104 if (newLocationHandle != IntPtr.Zero) 105 { 106 CloseHandle(newLocationHandle); 107 newLocationHandle = IntPtr.Zero; 108 } 109 110 if (deviceStateChangedHandle != IntPtr.Zero) 111 { 112 CloseHandle(deviceStateChangedHandle); 113 deviceStateChangedHandle = IntPtr.Zero; 114 } 115 116 if (stopHandle != IntPtr.Zero) 117 { 118 CloseHandle(stopHandle); 119 stopHandle = IntPtr.Zero; 120 } 121 } 122 } 123 124 /// <summary> 125 /// Get the position reported by the GPS receiver 126 /// </summary> 127 /// <returns> GpsPosition class with all the position details </returns> 128 public GpsPosition GetPosition() 129 { 130 return GetPosition(TimeSpan.Zero); 131 } 132 133 134 /// <summary> 135 /// Get the position reported by the GPS receiver that is no older than 136 /// the maxAge passed in 137 /// </summary> 138 /// <param name="maxAge"> Max age of the gps position data that you want back. 139 /// If there is no data within the required age, null is returned. 140 /// if maxAge == TimeSpan.Zero, then the age of the data is ignored </param> 141 /// <returns> GpsPosition class with all the position details </returns> 142 public GpsPosition GetPosition(TimeSpan maxAge) 143 { 144 GpsPosition gpsPosition = null ; 145 if (Opened) 146 { 147 // allocate the necessary memory on the native side. We have a class (GpsPosition) that 148 // has the same memory layout as its native counterpart 149 IntPtr ptr = Utils.LocalAlloc(Marshal.SizeOf( typeof (GpsPosition))); 150 151 // fill in the required fields 152 gpsPosition = new GpsPosition(); 153 gpsPosition.dwVersion = 1 ; 154 gpsPosition.dwSize = Marshal.SizeOf( typeof (GpsPosition)); 155 156 // Marshal our data to the native pointer we allocated. 157 Marshal.StructureToPtr(gpsPosition, ptr, false ); 158 159 // call native method passing in our native buffer 160 int result = GPSGetPosition(gpsHandle, ptr, 500000 , 0 ); 161 if (result == 0 ) 162 { 163 // native call succeeded, marshal native data to our managed data 164 gpsPosition = (GpsPosition)Marshal.PtrToStructure(ptr, typeof (GpsPosition)); 165 166 if (maxAge != TimeSpan.Zero) 167 { 168 // check to see if the data is recent enough. 169 if ( ! gpsPosition.TimeValid || DateTime.Now - maxAge > gpsPosition.Time) 170 { 171 gpsPosition = null ; 172 } 173 } 174 } 175 176 // free our native memory 177 Utils.LocalFree(ptr); 178 } 179 180 return gpsPosition; 181 } View Code 1 /// <summary> 2 /// Queries the device state. 3 /// </summary> 4 /// <returns> Device state information </returns> 5 public GpsDeviceState GetDeviceState() 6 { 7 GpsDeviceState device = null ; 8 9 // allocate a buffer on the native side. Since the 10 IntPtr pGpsDevice = Utils.LocalAlloc(GpsDeviceState.GpsDeviceStructureSize); 11 12 // GPS_DEVICE structure has arrays of characters, it's easier to just 13 // write directly into memory rather than create a managed structure with 14 // the same layout. 15 Marshal.WriteInt32(pGpsDevice, 1 ); // write out GPS version of 1 16 Marshal.WriteInt32(pGpsDevice, 4 , GpsDeviceState.GpsDeviceStructureSize); // write out dwSize of structure 17 18 int result = GPSGetDeviceState(pGpsDevice); 19 20 if (result == 0 ) 21 { 22 // instantiate the GpsDeviceState class passing in the native pointer 23 device = new GpsDeviceState(pGpsDevice); 24 } 25 26 // free our native memory 27 Utils.LocalFree(pGpsDevice); 28 29 return device; 30 } 31 32 /// <summary> 33 /// Creates our event thread that will receive native events 34 /// </summary> 35 private void CreateGpsEventThread() 36 { 37 // we only want to create the thread if we don't have one created already 38 // and we have opened the gps device 39 if (gpsEventThread == null && gpsHandle != IntPtr.Zero) 40 { 41 // Create and start thread to listen for GPS events 42 gpsEventThread = new System.Threading.Thread( new System.Threading.ThreadStart(WaitForGpsEvents)); 43 gpsEventThread.Start(); 44 } 45 } 46 47 /// <summary> 48 /// Method used to listen for native events from the GPS. 49 /// </summary> 50 private void WaitForGpsEvents() 51 { 52 lock ( this ) 53 { 54 bool listening = true ; 55 // allocate 3 handles worth of memory to pass to WaitForMultipleObjects 56 IntPtr handles = Utils.LocalAlloc( 12 ); 57 58 // write the three handles we are listening for. 59 Marshal.WriteInt32(handles, 0 , stopHandle.ToInt32()); 60 Marshal.WriteInt32(handles, 4 , deviceStateChangedHandle.ToInt32()); 61 Marshal.WriteInt32(handles, 8 , newLocationHandle.ToInt32()); 62 63 while (listening) 64 { 65 int obj = WaitForMultipleObjects( 3 , handles, 0 , - 1 ); 66 if (obj != waitFailed) 67 { 68 switch (obj) 69 { 70 case 0 : 71 // we've been signalled to stop 72 listening = false ; 73 break ; 74 case 1 : 75 // device state has changed 76 if (deviceStateChanged != null ) 77 { 78 deviceStateChanged( this , new DeviceStateChangedEventArgs(GetDeviceState())); 79 } 80 break ; 81 case 2 : 82 // location has changed 83 if (locationChanged != null ) 84 { 85 locationChanged( this , new LocationChangedEventArgs(GetPosition())); 86 } 87 break ; 88 } 89 } 90 } 91 92 // free the memory we allocated for the native handles 93 Utils.LocalFree(handles); 94 95 // clear our gpsEventThread so that we can recreate this thread again 96 // if the events are hooked up again. 97 gpsEventThread = null ; 98 } 99 } 100 101 #region PInvokes to gpsapi.dll 102 [DllImport( " gpsapi.dll " )] 103 static extern IntPtr GPSOpenDevice(IntPtr hNewLocationData, IntPtr hDeviceStateChange, string szDeviceName, int dwFlags); 104 105 [DllImport( " gpsapi.dll " )] 106 static extern int GPSCloseDevice(IntPtr hGPSDevice); 107 108 [DllImport( " gpsapi.dll " )] 109 static extern int GPSGetPosition(IntPtr hGPSDevice, IntPtr pGPSPosition, int dwMaximumAge, int dwFlags); 110 111 [DllImport( " gpsapi.dll " )] 112 static extern int GPSGetDeviceState(IntPtr pGPSDevice); 113 #endregion 114 115 #region PInvokes to coredll.dll 116 [DllImport( " coredll.dll " )] 117 static extern IntPtr CreateEvent(IntPtr lpEventAttributes, int bManualReset, int bInitialState, StringBuilder lpName); 118 119 [DllImport( " coredll.dll " )] 120 static extern int CloseHandle(IntPtr hObject); 121 122 const int waitFailed = - 1 ; 123 [DllImport( " coredll.dll " )] 124 static extern int WaitForMultipleObjects( int nCount, IntPtr lpHandles, int fWaitAll, int dwMilliseconds); 125 126 const int eventSet = 3 ; 127 [DllImport( " coredll.dll " )] 128 static extern int EventModify(IntPtr hHandle, int dwFunc); 129 130 #endregion } }
GpsDeviceState.cs GPS设备的状态管理
View Code 1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this sample source code is subject to the terms of the Microsoft 6 // license agreement under which you licensed this sample source code. If 7 // you did not accept the terms of the license agreement, you are not 8 // authorized to use this sample source code. For the terms of the license, 9 // please see the license agreement between you and Microsoft or, if applicable, 10 // see the LICENSE.RTF on your install media or the root of your tools installation. 11 // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. 12 // 13 #region Using directives 14 15 using System; 16 using System.Runtime.InteropServices; 17 18 #endregion 19 20 public enum GpsServiceState : int 21 { 22 Off = 0 , 23 On = 1 , 24 StartingUp = 2 , 25 ShuttingDown = 3 , 26 Unloading = 4 , 27 Uninitialized = 5 , 28 Unknown = - 1 29 } 30 31 namespace Microsoft.WindowsMobile.Samples.Location 32 { 33 34 [StructLayout(LayoutKind.Sequential)] 35 internal struct FileTime 36 { 37 int dwLowDateTime; 38 int dwHighDateTime; 39 } 40 41 /// <summary> 42 /// GpsDeviceState holds the state of the gps device and the friendly name if the 43 /// gps supports them. 44 /// </summary> 45 [StructLayout(LayoutKind.Sequential)] 46 public class GpsDeviceState 47 { 48 public static int GpsMaxFriendlyName = 64 ; 49 public static int GpsDeviceStructureSize = 216 ; 50 51 int serviceState = 0 ; 52 /// <summary> 53 /// State of the GPS Intermediate Driver service 54 /// </summary> 55 public GpsServiceState ServiceState 56 { 57 get { return (GpsServiceState)serviceState;} 58 } 59 60 int deviceState = 0 ; 61 /// <summary> 62 /// Status of the actual GPS device driver. 63 /// </summary> 64 public GpsServiceState DeviceState 65 { 66 get { return (GpsServiceState)deviceState;} 67 } 68 69 string friendlyName = "" ; 70 /// <summary> 71 /// Friendly name of the real GPS device we are currently using. 72 /// </summary> 73 public string FriendlyName 74 { 75 get { return friendlyName;} 76 } 77 78 /// <summary> 79 /// Constructor of GpsDeviceState. It copies values from the native pointer 80 /// passed in. 81 /// </summary> 82 /// <param name="pGpsDevice"> Native pointer to memory that contains 83 /// the GPS_DEVICE data </param> 84 public GpsDeviceState(IntPtr pGpsDevice) 85 { 86 // make sure our pointer is valid 87 if (pGpsDevice == IntPtr.Zero) 88 { 89 throw new ArgumentException(); 90 } 91 92 // read in the service state which starts at offset 8 93 serviceState = Marshal.ReadInt32(pGpsDevice, 8 ); 94 // read in the device state which starts at offset 12 95 deviceState = Marshal.ReadInt32(pGpsDevice, 12 ); 96 97 // the friendly name starts at offset 88 98 IntPtr pFriendlyName = (IntPtr)(pGpsDevice.ToInt32() + 88 ); 99 // marshal the native string into our gpsFriendlyName 100 friendlyName = Marshal.PtrToStringUni(pFriendlyName); 101 } 102 } 103 }
GpsPosition.cs //处理经纬度坐标的类
View Code #region Using directives using System; using System.Runtime.InteropServices; using System.Collections; #endregion namespace Microsoft.WindowsMobile.Samples.Location{ #region Internal Native Structures [StructLayout(LayoutKind.Sequential)] internal struct SystemTime { internal short year; internal short month; internal short dayOfWeek; internal short day; internal short hour; internal short minute; internal short second; internal short millisecond; } [StructLayout(LayoutKind.Sequential)] internal struct SatelliteArray { int a, b, c, d, e, f, g, h, i, j, k, l; public int Count { get { return 12 ; } } public int this [ int value] { get { if (value == 0 ) return a; else if (value == 1 ) return b; else if (value == 2 ) return c; else if (value == 3 ) return d; else if (value == 4 ) return e; else if (value == 5 ) return f; else if (value == 6 ) return g; else if (value == 7 ) return h; else if (value == 8 ) return i; else if (value == 9 ) return j; else if (value == 10 ) return k; else if (value == 11 ) return l; else throw new ArgumentOutOfRangeException( " value must be 0 - 11 " ); } } } #endregion enum FixQuality : int { Unknown = 0 , Gps, DGps } enum FixType : int { Unknown = 0 , XyD, XyzD } enum FixSelection : int { Unknown = 0 , Auto, Manual } public class Satellite { public Satellite() { } public Satellite( int id, int elevation, int azimuth, int signalStrength) { this .id = id; this .elevation = elevation; this .azimuth = azimuth; this .signalStrength = signalStrength; } int id; /// <summary> /// Id of the satellite /// </summary> public int Id { get { return id; } set { id = value; } } int elevation; /// <summary> /// Elevation of the satellite /// </summary> public int Elevation { get { return elevation; } set { elevation = value; } } int azimuth; /// <summary> /// Azimuth of the satellite /// </summary> public int Azimuth { get { return azimuth; } set { azimuth = value; } } int signalStrength; /// <summary> /// SignalStrenth of the satellite /// </summary> public int SignalStrength { get { return signalStrength; } set { signalStrength = value; } } } [StructLayout(LayoutKind.Sequential)] public class GpsPosition { internal GpsPosition() { } internal static int GPS_VALID_UTC_TIME = 0x00000001 ; internal static int GPS_VALID_LATITUDE = 0x00000002 ; internal static int GPS_VALID_LONGITUDE = 0x00000004 ; internal static int GPS_VALID_SPEED = 0x00000008 ; internal static int GPS_VALID_HEADING = 0x00000010 ; internal static int GPS_VALID_MAGNETIC_VARIATION = 0x00000020 ; internal static int GPS_VALID_ALTITUDE_WRT_SEA_LEVEL = 0x00000040 ; internal static int GPS_VALID_ALTITUDE_WRT_ELLIPSOID = 0x00000080 ; internal static int GPS_VALID_POSITION_DILUTION_OF_PRECISION = 0x00000100 ; internal static int GPS_VALID_HORIZONTAL_DILUTION_OF_PRECISION = 0x00000200 ; internal static int GPS_VALID_VERTICAL_DILUTION_OF_PRECISION = 0x00000400 ; internal static int GPS_VALID_SATELLITE_COUNT = 0x00000800 ; internal static int GPS_VALID_SATELLITES_USED_PRNS = 0x00001000 ; internal static int GPS_VALID_SATELLITES_IN_VIEW = 0x00002000 ; internal static int GPS_VALID_SATELLITES_IN_VIEW_PRNS = 0x00004000 ; internal static int GPS_VALID_SATELLITES_IN_VIEW_ELEVATION = 0x00008000 ; internal static int GPS_VALID_SATELLITES_IN_VIEW_AZIMUTH = 0x00010000 ; internal static int GPS_VALID_SATELLITES_IN_VIEW_SIGNAL_TO_NOISE_RATIO = 0x00020000 ; internal int dwVersion = 1 ; // Current version of GPSID client is using. internal int dwSize = 0 ; // sizeof(_GPS_POSITION) // Not all fields in the structure below are guaranteed to be valid. // Which fields are valid depend on GPS device being used, how stale the API allows // the data to be, and current signal. // Valid fields are specified in dwValidFields, based on GPS_VALID_XXX flags. internal int dwValidFields = 0 ; // Additional information about this location structure (GPS_DATA_FLAGS_XXX) internal int dwFlags = 0 ; // ** Time related internal SystemTime stUTCTime = new SystemTime(); // UTC according to GPS clock. // ** Position + heading related internal double dblLatitude = 0.0 ; // Degrees latitude. North is positive internal double dblLongitude = 0.0 ; // Degrees longitude. East is positive internal float flSpeed = 0.0f ; // Speed in knots internal float flHeading = 0.0f ; // Degrees heading (course made good). True North=0 internal double dblMagneticVariation = 0.0 ; // Magnetic variation. East is positive internal float flAltitudeWRTSeaLevel = 0.0f ; // Altitute with regards to sea level, in meters internal float flAltitudeWRTEllipsoid = 0.0f ; // Altitude with regards to ellipsoid, in meters // ** Quality of this fix // Where did we get fix from? internal FixQuality fixQuality = FixQuality.Unknown; // Is this 2d or 3d fix? internal FixType fixType = FixType.Unknown; // Auto or manual selection between 2d or 3d mode internal FixSelection selectionType = FixSelection.Unknown; // Position Dilution Of Precision internal float flPositionDilutionOfPrecision = 0.0f ; // Horizontal Dilution Of Precision internal float flHorizontalDilutionOfPrecision = 0.0f ; // Vertical Dilution Of Precision internal float flVerticalDilutionOfPrecision = 0.0f ; // ** Satellite information // Number of satellites used in solution internal int dwSatelliteCount = 0 ; // PRN numbers of satellites used in the solution internal SatelliteArray rgdwSatellitesUsedPRNs = new SatelliteArray(); // Number of satellites in view. From 0-GPS_MAX_SATELLITES internal int dwSatellitesInView = 0 ; // PRN numbers of satellites in view internal SatelliteArray rgdwSatellitesInViewPRNs = new SatelliteArray(); // Elevation of each satellite in view internal SatelliteArray rgdwSatellitesInViewElevation = new SatelliteArray(); // Azimuth of each satellite in view internal SatelliteArray rgdwSatellitesInViewAzimuth = new SatelliteArray(); // Signal to noise ratio of each satellite in view internal SatelliteArray rgdwSatellitesInViewSignalToNoiseRatio = new SatelliteArray(); View Code /// <summary> /// UTC according to GPS clock. /// </summary> public DateTime Time { get { DateTime time = new DateTime(stUTCTime.year, stUTCTime.month, stUTCTime.day, stUTCTime.hour, stUTCTime.minute, stUTCTime.second, stUTCTime.millisecond); return time; } } /// <summary> /// True if the Time property is valid, false if invalid /// </summary> public bool TimeValid { get { return (dwValidFields & GPS_VALID_UTC_TIME) != 0 ; } } /// <summary> /// Satellites used in the solution /// </summary> /// <returns> Array of Satellites </returns> public Satellite[] GetSatellitesInSolution() { Satellite[] inViewSatellites = GetSatellitesInView(); ArrayList list = new ArrayList(); for ( int index = 0 ; index < dwSatelliteCount; index ++ ) { Satellite found = null ; for ( int viewIndex = 0 ; viewIndex < inViewSatellites.Length && found == null ; viewIndex ++ ) { if (rgdwSatellitesUsedPRNs[index] == inViewSatellites[viewIndex].Id) { found = inViewSatellites[viewIndex]; list.Add(found); } } } return (Satellite[])list.ToArray( typeof (Satellite)); } /// <summary> /// True if the SatellitesInSolution property is valid, false if invalid /// </summary> public bool SatellitesInSolutionValid { get { return (dwValidFields & GPS_VALID_SATELLITES_USED_PRNS) != 0 ; } } /// <summary> /// Satellites in view /// </summary> /// <returns> Array of Satellites </returns> public Satellite[] GetSatellitesInView() { Satellite[] satellites = null ; if (dwSatellitesInView != 0 ) { satellites = new Satellite[dwSatellitesInView]; for ( int index = 0 ; index < satellites.Length; index ++ ) { satellites[index] = new Satellite(); satellites[index].Azimuth = rgdwSatellitesInViewAzimuth[index]; satellites[index].Elevation = rgdwSatellitesInViewElevation[index]; satellites[index].Id = rgdwSatellitesInViewPRNs[index]; satellites[index].SignalStrength = rgdwSatellitesInViewSignalToNoiseRatio[index]; } } return satellites; } /// <summary> /// True if the SatellitesInView property is valid, false if invalid /// </summary> public bool SatellitesInViewValid { get { return (dwValidFields & GPS_VALID_SATELLITES_IN_VIEW) != 0 ; } } /// <summary> /// Number of satellites used in solution /// </summary> public int SatelliteCount { get { return dwSatelliteCount; } } /// <summary> /// True if the SatelliteCount property is valid, false if invalid /// </summary> public bool SatelliteCountValid { get { return (dwValidFields & GPS_VALID_SATELLITE_COUNT) != 0 ; } } /// <summary> /// Number of satellites in view. /// </summary> public int SatellitesInViewCount { get { return dwSatellitesInView; } } /// <summary> /// True if the SatellitesInViewCount property is valid, false if invalid /// </summary> public bool SatellitesInViewCountValid { get { return (dwValidFields & GPS_VALID_SATELLITES_IN_VIEW) != 0 ; } } /// <summary> /// Speed in knots /// </summary> public float Speed { get { return flSpeed; } } /// <summary> /// True if the Speed property is valid, false if invalid /// </summary> public bool SpeedValid { get { return (dwValidFields & GPS_VALID_SPEED) != 0 ; } } /// <summary> /// Altitude with regards to ellipsoid, in meters /// </summary> public float EllipsoidAltitude { get { return flAltitudeWRTEllipsoid; } } /// <summary> /// True if the EllipsoidAltitude property is valid, false if invalid /// </summary> public bool EllipsoidAltitudeValid { get { return (dwValidFields & GPS_VALID_ALTITUDE_WRT_ELLIPSOID) != 0 ; } } /// <summary> /// Altitute with regards to sea level, in meters /// </summary> public float SeaLevelAltitude { get { return flAltitudeWRTSeaLevel; } } /// <summary> /// True if the SeaLevelAltitude property is valid, false if invalid /// </summary> public bool SeaLevelAltitudeValid { get { return (dwValidFields & GPS_VALID_ALTITUDE_WRT_SEA_LEVEL) != 0 ; } } /// <summary> /// Latitude in decimal degrees. North is positive /// </summary> public double Latitude { get { return dblLatitude; } } /// <summary> /// Latitude in degrees, minutes, seconds. North is positive /// </summary> public DegreesMinutesSeconds LatitudeInDegreesMinutesSeconds { get { return new DegreesMinutesSeconds(dblLatitude); } } /// <summary> /// True if the Latitude property is valid, false if invalid /// </summary> public bool LatitudeValid { get { return (dwValidFields & GPS_VALID_LATITUDE) != 0 ; } } /// <summary> /// Longitude in decimal degrees. East is positive /// </summary> public double Longitude { get { return dblLongitude; } } /// <summary> /// Longitude in degrees, minutes, seconds. East is positive /// </summary> public DegreesMinutesSeconds LongitudeInDegreesMinutesSeconds { get { return new DegreesMinutesSeconds(dblLongitude); } } /// <summary> /// True if the Longitude property is valid, false if invalid /// </summary> public bool LongitudeValid { get { return (dwValidFields & GPS_VALID_LONGITUDE) != 0 ; } } /// <summary> /// Degrees heading (course made good). True North=0 /// </summary> public float Heading { get { return flHeading; } } /// <summary> /// True if the Heading property is valid, false if invalid /// </summary> public bool HeadingValid { get { return (dwValidFields & GPS_VALID_HEADING) != 0 ; } } /// <summary> /// Position Dilution Of Precision /// </summary> public float PositionDilutionOfPrecision { get { return flPositionDilutionOfPrecision; } } /// <summary> /// True if the PositionDilutionOfPrecision property is valid, false if invalid /// </summary> public bool PositionDilutionOfPrecisionValid { get { return (dwValidFields & GPS_VALID_POSITION_DILUTION_OF_PRECISION) != 0 ; } } /// <summary> /// Horizontal Dilution Of Precision /// </summary> public float HorizontalDilutionOfPrecision { get { return flHorizontalDilutionOfPrecision; } } /// <summary> /// True if the HorizontalDilutionOfPrecision property is valid, false if invalid /// </summary> public bool HorizontalDilutionOfPrecisionValid { get { return (dwValidFields & GPS_VALID_HORIZONTAL_DILUTION_OF_PRECISION) != 0 ; } } /// <summary> /// Vertical Dilution Of Precision /// </summary> public float VerticalDilutionOfPrecision { get { return flVerticalDilutionOfPrecision; } } /// <summary> /// True if the VerticalDilutionOfPrecision property is valid, false if invalid /// </summary> public bool VerticalDilutionOfPrecisionValid { get { return (dwValidFields & GPS_VALID_VERTICAL_DILUTION_OF_PRECISION) != 0 ; } } }} View Code /// <summary> /// UTC according to GPS clock. /// </summary> public DateTime Time { get { DateTime time = new DateTime(stUTCTime.year, stUTCTime.month, stUTCTime.day, stUTCTime.hour, stUTCTime.minute, stUTCTime.second, stUTCTime.millisecond); return time; } } /// <summary> /// True if the Time property is valid, false if invalid /// </summary> public bool TimeValid { get { return (dwValidFields & GPS_VALID_UTC_TIME) != 0 ; } } /// <summary> /// Satellites used in the solution /// </summary> /// <returns> Array of Satellites </returns> public Satellite[] GetSatellitesInSolution() { Satellite[] inViewSatellites = GetSatellitesInView(); ArrayList list = new ArrayList(); for ( int index = 0 ; index < dwSatelliteCount; index ++ ) { Satellite found = null ; for ( int viewIndex = 0 ; viewIndex < inViewSatellites.Length && found == null ; viewIndex ++ ) { if (rgdwSatellitesUsedPRNs[index] == inViewSatellites[viewIndex].Id) { found = inViewSatellites[viewIndex]; list.Add(found); } } } return (Satellite[])list.ToArray( typeof (Satellite)); } /// <summary> /// True if the SatellitesInSolution property is valid, false if invalid /// </summary> public bool SatellitesInSolutionValid { get { return (dwValidFields & GPS_VALID_SATELLITES_USED_PRNS) != 0 ; } } /// <summary> /// Satellites in view /// </summary> /// <returns> Array of Satellites </returns> public Satellite[] GetSatellitesInView() { Satellite[] satellites = null ; if (dwSatellitesInView != 0 ) { satellites = new Satellite[dwSatellitesInView]; for ( int index = 0 ; index < satellites.Length; index ++ ) { satellites[index] = new Satellite(); satellites[index].Azimuth = rgdwSatellitesInViewAzimuth[index]; satellites[index].Elevation = rgdwSatellitesInViewElevation[index]; satellites[index].Id = rgdwSatellitesInViewPRNs[index]; satellites[index].SignalStrength = rgdwSatellitesInViewSignalToNoiseRatio[index]; } } return satellites; } /// <summary> /// True if the SatellitesInView property is valid, false if invalid /// </summary> public bool SatellitesInViewValid { get { return (dwValidFields & GPS_VALID_SATELLITES_IN_VIEW) != 0 ; } } /// <summary> /// Number of satellites used in solution /// </summary> public int SatelliteCount { get { return dwSatelliteCount; } } /// <summary> /// True if the SatelliteCount property is valid, false if invalid /// </summary> public bool SatelliteCountValid { get { return (dwValidFields & GPS_VALID_SATELLITE_COUNT) != 0 ; } } /// <summary> /// Number of satellites in view. /// </summary> public int SatellitesInViewCount { get { return dwSatellitesInView; } } /// <summary> /// True if the SatellitesInViewCount property is valid, false if invalid /// </summary> public bool SatellitesInViewCountValid { get { return (dwValidFields & GPS_VALID_SATELLITES_IN_VIEW) != 0 ; } } /// <summary> /// Speed in knots /// </summary> public float Speed { get { return flSpeed; } } /// <summary> /// True if the Speed property is valid, false if invalid /// </summary> public bool SpeedValid { get { return (dwValidFields & GPS_VALID_SPEED) != 0 ; } } /// <summary> /// Altitude with regards to ellipsoid, in meters /// </summary> public float EllipsoidAltitude { get { return flAltitudeWRTEllipsoid; } } /// <summary> /// True if the EllipsoidAltitude property is valid, false if invalid /// </summary> public bool EllipsoidAltitudeValid { get { return (dwValidFields & GPS_VALID_ALTITUDE_WRT_ELLIPSOID) != 0 ; } } /// <summary> /// Altitute with regards to sea level, in meters /// </summary> public float SeaLevelAltitude { get { return flAltitudeWRTSeaLevel; } } /// <summary> /// True if the SeaLevelAltitude property is valid, false if invalid /// </summary> public bool SeaLevelAltitudeValid { get { return (dwValidFields & GPS_VALID_ALTITUDE_WRT_SEA_LEVEL) != 0 ; } } /// <summary> /// Latitude in decimal degrees. North is positive /// </summary> public double Latitude { get { return dblLatitude; } } /// <summary> /// Latitude in degrees, minutes, seconds. North is positive /// </summary> public DegreesMinutesSeconds LatitudeInDegreesMinutesSeconds { get { return new DegreesMinutesSeconds(dblLatitude); } } /// <summary> /// True if the Latitude property is valid, false if invalid /// </summary> public bool LatitudeValid { get { return (dwValidFields & GPS_VALID_LATITUDE) != 0 ; } } /// <summary> /// Longitude in decimal degrees. East is positive /// </summary> public double Longitude { get { return dblLongitude; } } /// <summary> /// Longitude in degrees, minutes, seconds. East is positive /// </summary> public DegreesMinutesSeconds LongitudeInDegreesMinutesSeconds { get { return new DegreesMinutesSeconds(dblLongitude); } } /// <summary> /// True if the Longitude property is valid, false if invalid /// </summary> public bool LongitudeValid { get { return (dwValidFields & GPS_VALID_LONGITUDE) != 0 ; } } /// <summary> /// Degrees heading (course made good). True North=0 /// </summary> public float Heading { get { return flHeading; } } /// <summary> /// True if the Heading property is valid, false if invalid /// </summary> public bool HeadingValid { get { return (dwValidFields & GPS_VALID_HEADING) != 0 ; } } /// <summary> /// Position Dilution Of Precision /// </summary> public float PositionDilutionOfPrecision { get { return flPositionDilutionOfPrecision; } } /// <summary> /// True if the PositionDilutionOfPrecision property is valid, false if invalid /// </summary> public bool PositionDilutionOfPrecisionValid { get { return (dwValidFields & GPS_VALID_POSITION_DILUTION_OF_PRECISION) != 0 ; } } /// <summary> /// Horizontal Dilution Of Precision /// </summary> public float HorizontalDilutionOfPrecision { get { return flHorizontalDilutionOfPrecision; } } /// <summary> /// True if the HorizontalDilutionOfPrecision property is valid, false if invalid /// </summary> public bool HorizontalDilutionOfPrecisionValid { get { return (dwValidFields & GPS_VALID_HORIZONTAL_DILUTION_OF_PRECISION) != 0 ; } } /// <summary> /// Vertical Dilution Of Precision /// </summary> public float VerticalDilutionOfPrecision { get { return flVerticalDilutionOfPrecision; } } /// <summary> /// True if the VerticalDilutionOfPrecision property is valid, false if invalid /// </summary> public bool VerticalDilutionOfPrecisionValid { get { return (dwValidFields & GPS_VALID_VERTICAL_DILUTION_OF_PRECISION) != 0 ; } } }}
LocationChangedEventArgs.cs //GPS定位位置改变触发事件处理类
View Code 1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this sample source code is subject to the terms of the Microsoft 6 // license agreement under which you licensed this sample source code. If 7 // you did not accept the terms of the license agreement, you are not 8 // authorized to use this sample source code. For the terms of the license, 9 // please see the license agreement between you and Microsoft or, if applicable, 10 // see the LICENSE.RTF on your install media or the root of your tools installation. 11 // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. 12 // 13 #region Using directives 14 15 using System; 16 17 #endregion 18 19 namespace Microsoft.WindowsMobile.Samples.Location 20 { 21 /// <summary> 22 /// Event args used for LocationChanged events. 23 /// </summary> 24 public class LocationChangedEventArgs: EventArgs 25 { 26 public LocationChangedEventArgs(GpsPosition position) 27 { 28 this .position = position; 29 } 30 31 /// <summary> 32 /// Gets the new position when the GPS reports a new position. 33 /// </summary> 34 public GpsPosition Position 35 { 36 get 37 { 38 return position; 39 } 40 } 41 42 private GpsPosition position; 43 44 } 45 }
Utils.cs
View Code 1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this sample source code is subject to the terms of the Microsoft 6 // license agreement under which you licensed this sample source code. If 7 // you did not accept the terms of the license agreement, you are not 8 // authorized to use this sample source code. For the terms of the license, 9 // please see the license agreement between you and Microsoft or, if applicable, 10 // see the LICENSE.RTF on your install media or the root of your tools installation. 11 // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. 12 // 13 #region Using directives 14 15 using System; 16 17 #endregion 18 19 namespace Microsoft.WindowsMobile.Samples.Location.Utils 20 { 21 /// <summary> 22 /// Summary description for Utils. 23 /// </summary> 24 public class Utils 25 { 26 public Utils() 27 { 28 } 29 30 public static IntPtr LocalAlloc( int byteCount) 31 { 32 IntPtr ptr = Win32.LocalAlloc(Win32.LMEM_ZEROINIT, byteCount); 33 if (ptr == IntPtr.Zero) 34 { 35 throw new OutOfMemoryException(); 36 } 37 38 return ptr; 39 } 40 41 public static void LocalFree(IntPtr hMem) 42 { 43 IntPtr ptr = Win32.LocalFree(hMem); 44 if (ptr != IntPtr.Zero) 45 { 46 throw new ArgumentException(); 47 } 48 } 49 } 50 51 public class Win32 52 { 53 public const int LMEM_ZEROINIT = 0x40 ; 54 [System.Runtime.InteropServices.DllImport( " coredll.dll " , EntryPoint = " #33 " , SetLastError = true )] 55 public static extern IntPtr LocalAlloc( int flags, int byteCount); 56 57 [System.Runtime.InteropServices.DllImport( " coredll.dll " , EntryPoint = " #36 " , SetLastError = true )] 58 public static extern IntPtr LocalFree(IntPtr hMem); 59 } 60 }希望能给想我一样的初接触Windows Mobile开发的程序员一些帮助。
转载于:https://www.cnblogs.com/angleSJW/archive/2011/07/07/2099808.html
相关资源:VS2008开发WinCE6.0应用(组件) -Part3/5