我正在开发一款防盗软件来获取计算机的准确位置。内置 GPS 的笔记本电脑在我的国家非常罕见,因此我必须在我的应用程序中使用 HTML5 Geolocation。
对于 Internet Explorer 9+,有一个注册表项,您可以添加 URL 以允许 URL 无需用户验证。如果您在
REG_DWORD
路径下添加名为 domain.com 的 HKCU\Software\Microsoft\Internet Explorer\Geolocation\HostConsent
值,浏览器将自动允许地理定位请求。但是,我无法隐藏运行 Internet Explorer,因此这对我不起作用,因为小偷不应该意识到并看到发生了什么。
我更喜欢第二种方式,因为 Internet Explorer 现在已被 Microsoft 终止,我认为下一个版本将具有不同的结构。
如何将 Webkit 或 GeckoFX 嵌入并使用到我的应用程序中?如何在此应用程序中以编程方式允许地理定位请求?
依赖隐藏的浏览器是一个有风险的解决方案,它在未来的某个时候不可避免地会崩溃。
相反,您希望将地理定位功能构建到您自己的应用程序中。位置信息的两个主要来源是您的 IP 地址(然后将其输入到任何 GeoIP 提供商)和可见的蜂窝/Wi-Fi 站(您将其输入到 Google 地理定位 API)。
程序集中定义的
System.Device
类
GeoCooperativeWatcher 类提供来自当前位置提供程序的基于坐标的位置数据。当前位置提供程序在计算机上的优先级最高,基于多种因素,例如来自所有提供程序的数据的年龄和准确性、位置应用程序要求的准确性以及与该位置相关的功耗和性能影响。位置提供商。当前位置提供程序可能会随着时间的推移而发生变化,例如,当 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 日志中添加一个条目。
如果您要部署到现代版本的 Windows,您可以使用 .NET 原生的库
System.Device.Location
,它允许您获取设备位置信息。
这里是 MSDN 上的链接,了解如何使用它 地理坐标类
如果使用XAML,也可以尝试这个方法。 使用 XAML 检测用户位置
您可以使用 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);