2013-05-23 6 views
4

Я хочу, чтобы создать приложение WinForms, который может определять местоположение так же, как веб-браузер будет с помощью яваскрипта функции navigator.geolocation.getCurrentPosition(showPosition);геолокации в приложении WinForms

Есть ли способ сделать это в WinForms напрямую?

Я думал, что я мог бы быть в состоянии использовать контроль WebBrowser, чтобы сделать это, но я не считаю, что это поддерживает Geolocation (если кто не знает, в противном случае?)

Видимо браузер Gecko поддерживает gelocation, но это не вариант для меня, потому что у клиента может быть установлена ​​другая версия firefox.

+0

Возможный дубликат: http://stackoverflow.com/questions/5591457/get-ip-address-location-from-windows-application – Anthony

+1

@Anthony - не совсем дубликат, потому что этот вопрос является геолокации поиск от IP только. Веб-браузер может использовать другие датчики для обнаружения местоположения, например, Wi-Fi-сигнал и A-GPS, если он подключен через ключ –

+1

. Хорошая точка, оставив ссылку для ссылки других людей в любом случае – Anthony

ответ

1

Заслуга к ответу по Alex Filipovici данной по этому вопросу: C# desktop application doesn't share my physical location

ниже код преобразуется в VB:

WebServer Класс:

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 

Форма Код:

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 

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

Вы должны использовать Geckofx

Кроме того, необходимо убедиться, что вы точно соответствовать версии geckofx с правильным XulRunner/версии Firefox.

В GeoLocation пока нет классных классов оболочки C# в geckofx, но вы можете получить к нему доступ с помощью xpcom C# interops.

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

спасибо, но я упомянул в своем сообщении, что я не могу использовать это как это для коммерческого продукта, поэтому я не могу диктовать, какая версия xulrunner/firefox будет на любой целевой машине. –

+0

Вы можете связать нужную версию xulrunner/firefox с вашим приложением. Я делаю это с помощью приложения, над которым я работаю, необходимые файлы размером около 20 МБ, которые могут быть сжаты для установщика. – Tom

1

Я не использовал его, но Microsoft имеет Windows.Devices.Geolocation API, хотя для Windows 8.

для Windows 7, они, кажется, есть датчик API, с некоторыми примерами кода here.

+0

К сожалению, API-интерфейс датчика окон 7 работает только при установке датчика, и единственным драйвером Sensor, который я могу найти, является Geosense для Windows. Однако это, похоже, было удалено, и я не могу найти загружаемую версию. –

Смежные вопросы