20

我正在开发一种防盗软件来获取计算机的确切位置。内置 GPS 的笔记本在我的国家非常少见,所以我必须在我的应用程序中使用HTML5 地理定位

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

  • 我需要以某种方式运行隐藏的 Internet Explorer
  • ...或者我需要在我的应用程序中嵌入 webkit 或其他东西,但我不知道如何使用它或如何以编程方式允许此请求。

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

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

4

4 回答 4

8

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

相反,您希望将地理定位功能构建到您自己的应用程序中。位置信息的两个主要来源是您的 IP 地址(然后您将其提供给任何GeoIP 提供商)和可见的蜂窝/Wi-Fi 站(您将其提供给Google 地理定位 API)。

于 2015-03-25T21:03:53.343 回答
4

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

GeoCoordinateWatcher 类提供来自当前位置提供者的基于坐标的位置数据。当前位置提供程序在计算机上的优先级最高,这取决于许多因素,例如来自所有提供程序的数据的年龄和准确性、位置应用程序要求的准确性以及与该位置相关的功耗和性能影响。位置提供者。当前位置提供者可能会随着时间而改变,例如,当 GPS 设备在室内丢失其卫星信号并且 Wi-Fi 三角测量提供者成为计算机上最准确的提供者时。

用法示例:

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

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

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

在此处输入图像描述

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

于 2015-05-20T08:56:11.180 回答
2

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

这是 MSDN 上的链接,了解如何使用它 GeoCoordinate Class

如果使用 XAML,您也可以尝试此方法。 使用 XAML 检测用户位置

于 2015-05-23T19:26:41.280 回答
1

您可以使用PhantomJS将 webkit 浏览器嵌入到您的应用程序中。PhantomJS 是一个无头浏览器,可以通过搜索NuGet或 NuGet 命令行将其添加到您的应用程序中PM> Install-Package PhantomJS。一旦 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);
于 2015-05-18T21:01:02.440 回答