Windows Mobile6.0 入门学习(一)

刚接触Windows Mobile是同事写的程序,在手机上开启GPRS定位时获取手机的经纬度坐标,由于获取不到卫星,在执行程序的时候报空异常。由此开始接触Windows Moblile,看了看同事的代码,然后再往上搜索资料,MSDN,CSDN,博客园,连百度文库也看了。呵呵。最后,还是在Windows Mobile6.0自带的Samples\PocketPC\CS里面看到例子和微软DLL文件的内部类。下面是GpsSample.cs例子代码,这个例子是获取GPS经纬度的例子,用到Microsoft.WindowsMobile.Samples.Location这个DLL文件,希望给其他初学者带来一些方便。

ExpandedBlockStart.gif 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  主要负责经纬度坐标的分秒变化

ExpandedBlockStart.gif 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  +   " "   +  minutes  +   " "   +  seconds  +   " \" " ;
116          }
117      }
118  }

 DeviceStateChangedEventArgs.cs  //GPS设备的状态变化触发事件

 

ExpandedBlockStart.gif 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设备的开关及经纬度处理

 

ExpandedBlockStart.gif 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 ;
ExpandedBlockStart.gif 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          }
ExpandedBlockStart.gif 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设备的状态管理

 

ExpandedBlockStart.gif 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 //处理经纬度坐标的类

 

ExpandedBlockStart.gif 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();  
ExpandedBlockStart.gif 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 ; }
        }
    }

}
ExpandedBlockStart.gif 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定位位置改变触发事件处理类

 

ExpandedBlockStart.gif 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  

ExpandedBlockStart.gif 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值