Geolocation in the WinForms application

I want to create a WinForms application that can determine the location in the same way that a web browser will use the javascript function navigator.geolocation.getCurrentPosition(showPosition);

Is there a way to do this directly in WinForms?

I thought I could use the WebBrowser control for this, but I do not believe that it supports Geolocation (unless someone knows otherwise?)

Apparently, the Gecko browser supports voting, but this is not an option for me, because the client may have a different version of firefox installed.

+4
source share
3 answers

The loan is answered by Alex Filipovici on this issue: C # desktop application does not share my physical location

The following is the code converted to VB:

WebServer Class:

 Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Net Imports System.Text Imports System.Threading Public Class WebServer Private ReadOnly _listener As New HttpListener() Private Shared _staticContent As String Public Sub New(ByVal prefixes() As String, ByVal content As String) _staticContent = content For Each s As String In prefixes _listener.Prefixes.Add(s) Next s _listener.Start() End Sub Public Sub New(ByVal content As String, ByVal ParamArray prefixes() As String) Me.New(prefixes, content) End Sub Public Sub Run() ThreadPool.QueueUserWorkItem(Sub(o) Try Do While _listener.IsListening ThreadPool.QueueUserWorkItem(Sub(c) Dim ctx = TryCast(c, HttpListenerContext) Try Dim buf() As Byte = Encoding.UTF8.GetBytes(_staticContent) ctx.Response.ContentLength64 = buf.Length ctx.Response.OutputStream.Write(buf, 0, buf.Length) Catch Finally ctx.Response.OutputStream.Close() End Try End Sub, _listener.GetContext()) Loop Catch End Try End Sub) End Sub Public Sub [Stop]() _listener.Stop() _listener.Close() End Sub End Class 

Form Code:

 Imports System.Reflection Imports System.Net Imports System.Threading Imports System.Text Public Class Form1 Dim _ws As WebServer Dim _webbrowser1 As WebBrowser Public Sub New() InitializeComponent() _webBrowser1 = New WebBrowser() _webBrowser1.Visible = False _webBrowser1.ScriptErrorsSuppressed = True Dim location = System.Reflection.Assembly.GetExecutingAssembly().Location _webBrowser1.Navigate(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) & "\test1.html") AddHandler _webBrowser1.DocumentCompleted, AddressOf webBrowser1_DocumentCompleted End Sub Async Sub webBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) If _ws Is Nothing Then Dim html = _webBrowser1.Document.GetElementsByTagName("html") Dim response = html(0).OuterHtml _ws = New WebServer(response, "http://localhost:9999/") _ws.Run() _webBrowser1.Navigate("http://localhost:9999/") Else Dim latitude As String = "" Dim longitude As String = "" Await Task.Factory.StartNew(Sub() While String.IsNullOrEmpty(latitude) System.Threading.Thread.Sleep(1000) If Me.InvokeRequired Then Me.Invoke(DirectCast(Sub() Dim latitudeEl = _webbrowser1.Document.GetElementById("latitude") Dim longitudeEl = _webbrowser1.Document.GetElementById("longitude") latitude = latitudeEl.GetAttribute("value") longitude = longitudeEl.GetAttribute("value") End Sub, MethodInvoker)) End If End While End Sub) txtLocation.Text = String.Format("{0},{1}", latitude, longitude) End If End Sub End Class 

file test1.html

 <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <meta http-equiv="X-UA-Compatible" content="IE=10" /> <script type="text/javascript"> window.onload = function () { var latitude = document.getElementById("latitude"); var longitude = document.getElementById("longitude"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { } } function showPosition(position) { latitude.value = position.coords.latitude; longitude.value = position.coords.longitude; } getLocation(); } </script> </head> <body> <input type="hidden" id="latitude" /> <input type="hidden" id="longitude" /> </body> </html> 
+1
source

You must use geckofx

You also need to make sure that you exactly match the geckofx version with the correct xulrunner / firefox version.

GeoLocation does not yet have good C # shell classes in geckofx, but you can access it using xpcom C # transitions.

  var instance = Xpcom.CreateInstance<nsIGeolocationProvider>("@mozilla.org/geolocation/provider;1"); 
+1
source

I have not used it, but Microsoft has the Windows.Devices.Geolocation API, although this is for Windows 8.

For Windows 7, they seem to have a Sensor API, with some sample code here .

+1
source

Source: https://habr.com/ru/post/1482407/


All Articles