问题描述
我想创建一个WinForms应用程序,该应用程序可以像使用JavaScript函数 navigator.geolocation.getCurrentPosition(showPosition);
I want to create a WinForms app that can detect location just like a web browser would using the javascript function navigator.geolocation.getCurrentPosition(showPosition);
在WinForms中可以直接使用某种方法吗?
Is there some way to do this in WinForms directly?
我以为我可以使用WebBrowser控件来做到这一点,但我不认为这可以支持Geolocation(除非有人知道吗?)
I thought that I might be able to use the WebBrowser control to do this but I don't believe this supports Geolocation (unless someone knows otherwise?)
显然,Gecko浏览器确实支持地理定位,但是这对我来说不是一个选择,因为客户端可能安装了不同的firefox版本.
Apparently the Gecko browser does support gelocation but this is not an option for me because client may have a different firefox version installed.
推荐答案
Alex Filipovici 在此问题上给出: C#桌面应用程序没有不分享我的地理位置
下面是将代码转换为VB的代码:
below is the code converted to VB:
WebServer类:
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
表单代码:
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文件
test1.html file
<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>
这篇关于WinForms应用程序中的地理位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!