尝试检测Captive Portal何时在互联网连接上使用,即在咖啡店连接的笔记本电脑。
尝试使用网络列表管理器COM对象实现这一点:
NETWORKLIST.NetworkListManager _networkListManager = new NetworkListManager();
foreach (INetworkConnection net in _networkListManager.GetNetworkConnections())
{
if (net.GetConnectivity().HasFlag(NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_INTERNET) == true)
{
// Check if we are connected by a captive web portal
// using NLM_INTERNET_CONNECTIVITY_WEBHIJACK
}
}
根据此处的文档:http://msdn.microsoft.com/en-us/library/windows/desktop/aa370750(v=vs.85).aspx
"这些连接标志可以通过使用INetwork或INetworkConnection接口的IPropertyBag接口查询NA_InternetConnectivityV4或NA_Internet ConnectivityV6属性来检索"
我似乎不存在NA_InternetConnectivityV4枚举(实现不完整),或者我不知道如何使用它们。
有人真的使用过这个吗?或者有人对检测何时使用圈养门户有想法吗?
这不是C#,但我发现那些API在C++上工作
pNetworkListManager->GetNetworks(NLM_ENUM_NETWORK_CONNECTED,&pEnum)INetwork*pINetwork;
//Should actually loop through the possible networks.
HRESULT hr = pEnum->Next(1, &pINetwork, nullptr);
IPropertyBag *pNetworkPropertyBag;
HRESULT hrQueryInterface = pINetwork->QueryInterface(IID_IPropertyBag, (LPVOID*)&pNetworkPropertyBag);
if (SUCCEEDED(hrQueryInterface 1) && pNetworkPropertyBag != nullptr)
{
NLM_CONNECTIVITY networkConnectivity;
VARIANT variantConnectivity;
if (SUCCEEDED(pINetwork->GetConnectivity(&networkConnectivity)))
{
if ((networkConnectivity &
NLM_CONNECTIVITY_IPV4_INTERNET) == NLM_CONNECTIVITY_IPV4_INTERNET)
{
VariantInit(&variantConnectivity);
if (SUCCEEDED(pNetworkPropertyBag->Read(NA_InternetConnectivityV4, &variantConnectivity, nullptr)) && (V_UINT(&variantConnectivity) & NLM_INTERNET_CONNECTIVITY_WEBHIJACK) == NLM_INTERNET_CONNECTIVITY_WEBHIJACK)
{
//Captive Portal detected
}
VariantClear(&variantConnectivity);
}
}
查看此项以了解详细信息:http://www.codeproject.com/Articles/1088221/Captive-Portal-Detection-with-Windows-APIs
关闭此项,调查显示NA_InternetConnectivityV4枚举不存在,MSDN文档不正确。