如何在 C# 应用程序中使用 HTML5 地理定位

How can I use HTML5 geolocation in C# application

我正在开发一种防盗软件来获取计算机的准确位置。带有内置 gps 的笔记本在我的国家非常罕见,所以我必须在我的应用程序中使用 HTML5 Geolocation

对于 Internet Explorer 9+,有一个注册表项,您可以添加 urls 以允许 url,而无需用户验证。如果您在 HKCU\Software\Microsoft\Internet Explorer\Geolocation\HostConsent 路径下添加名为 domain.com 的 REG_DWORD 值,浏览器将自动允许地理定位请求。但是我无法 运行 隐藏 Internet Explorer,所以这对我不起作用,因为小偷不应该意识到并看到发生了什么。

我更喜欢第二种方式,因为 Internet Explorer 现在已被 Microsoft 终止,我认为下一个版本会有不同的结构。

如何在我的应用程序中嵌入和使用 Webkit 或 GeckoFX?如何在此应用程序中以编程方式允许地理定位请求?

依靠隐藏的浏览器是一个冒险的解决方案,并且它在未来的某个时刻不可避免地会崩溃。

相反,您想将地理定位功能构建到您自己的应用程序中。位置信息的两个主要来源是您的 IP 地址(然后您将其输入任何 GeoIP providers) and cellular/Wi-Fi stations visible (which you feed into Google geolocation API)。

您可以使用 PhantomJS. PhantomJS is a headless browser and can be added to your application through searching NuGet 或 NuGet 命令行 PM> Install-Package PhantomJS 将 webkit 浏览器嵌入到您的应用程序中。一旦将 PhantomJS 添加到您的项目中,您将需要构建一个文件来控制 phantom,例如:

 public string PhantomJson(string phantomControlFile, params string[] arguments)
        {
            string returnJsonString = String.Empty;

            if (!String.IsNullOrEmpty(URL))
            {
                ProcessStartInfo startInfo = new ProcessStartInfo
                {
                    CreateNoWindow = true,
                    RedirectStandardError = true,
                    RedirectStandardOutput = true,
                    FileName = Path.Combine(PhantomExecutionPath, "phantomjs.exe"),
                    UseShellExecute = false,
                    WorkingDirectory = PhantomExecutionPath,
                    Arguments = @"--proxy-type=none --ignore-ssl-errors=true {1} ""{0}"" {2}".FormatWith(URL, phantomControlFile, 
                        arguments.Any() ? String.Join(" ", arguments) : String.Empty)
                };

                StringBuilder receivedData = new StringBuilder();
                using (Process p = Process.Start(startInfo))
                {
                    p.OutputDataReceived += (o, e) =>
                    {
                        if (e.Data != null && e.Data != "failed")
                        {
                            //returnJsonString = e.Data;
                            receivedData.AppendLine(e.Data);
                        }
                    };
                    p.BeginOutputReadLine();
                    p.WaitForExit();
                }
                returnJsonString = receivedData.ToString();

                if (!String.IsNullOrEmpty(returnJsonString))
                {
                    return returnJsonString;
                }
                else
                {
                    throw new ArgumentNullException("Value returned null. Unable to retrieve data from server");
                }
            }
            else
            {
                throw new ArgumentNullException("Url cannot be null");
            }
        }

然后你会想要建立一个控制文件来告诉phantomjs去哪里;就像是:

var args, myurl, page, phantomExit, renderPage, system;

system = require("system");
args = system.args;
page = null;
myurl = args[1];

phantomExit = function(exitCode) { // this is needed as there are time out issues when it tries to exit.
  if (page) {
    page.close();
  }
  return setTimeout(function() {
    return phantom.exit(exitCode);
  }, 0);
};

renderPage = function(url) {
  page = require("webpage").create();
    return page.open(url, function(status) {
      if (status === 'success') {
         // Process Page and console.log out the values
         return phatomExit(0);
      } else {
         console.log("failed");
         return phantomExit(1);
      }
     });
   };
  renderPage(myurl);

查看 GeoCoordinateWatcher class 中定义的 System.Device 程序集

The GeoCoordinateWatcher class supplies coordinate-based location data from the current location provider. The current location provider is prioritized as the highest on the computer, based on a number of factors, such as the age and accuracy of the data from all providers, the accuracy requested by location applications, and the power consumption and performance impact associated with the location provider. The current location provider might change over time, for instance, when a GPS device loses its satellite signal indoors and a Wi-Fi triangulation provider becomes the most accurate provider on the computer.

用法示例:

static void Main(string[] args)
{
    GeoCoordinateWatcher watcher = new GeoCoordinateWatcher();

    watcher.StatusChanged += (sender, e) =>
    {
        Console.WriteLine("new Status : {0}", e.Status);
    };

    watcher.PositionChanged += (sender, e) =>
    {
        Console.WriteLine("position changed. Location : {0}, Timestamp : {1}",
            e.Position.Location, e.Position.Timestamp);
    };

    if(!watcher.TryStart(false, TimeSpan.FromMilliseconds(5000)))
    {
         throw new Exception("Can't access location"); 
    }

    Console.ReadLine();
}

我认为这个 class 依赖于与 Internet Explorer 使用的机制相同的机制。

当您使用它时,您的系统通知托盘中会有一个图标,告诉您该位置最近被访问过。

您还将在 windows 日志中添加一个条目。

如果您要部署到 Windows 的现代版本,您可以使用 .NET 的原生库 System.Device.Location,它允许您获取设备位置信息。

这里是 MSDN 上的 link 如何使用它 GeoCoordinate Class

如果使用XAML,也可以试试这个方法。 Detect Users Location using XAML