Как узнать, не лимитное ли подключение включено?

Рейтинг: 4Ответов: 2Опубликовано: 12.05.2023

Как программно узнать, какое подключение к Интернету сейчас - лимитное или нет?

Ну, чтоб в своей программе либо активно использовать Интернет, либо очень ограниченно.

Windows 10.

P.S. В идеале хотелось бы еще и отслеживать момент переключения, типа, хук какой - но это уже не так важно.

Ответы

▲ 3Принят

Это можно установить посредством INetworkConnectionCost::GetCost. И есть соотв. пример, который еще и оповещения об изменениях обрабатывает https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/NetworkCost/cpp/NetCostSample.cpp

▲ 2

Заинтересовало, вот простейшая программка под VC++:

#include <iostream>
#include <windows.h>
#include <netlistmgr.h>

#pragma comment(lib, "ole32.lib")

using namespace std;

bool isLimited()
{

    HRESULT hrCoinit = CoInitialize(NULL);
    if (hrCoinit != S_OK) return true; // Безопаснее считать лимитным

    INetworkCostManager * pCostManager;
    HRESULT hr = CoCreateInstance(CLSID_NetworkListManager, NULL,
                                  CLSCTX_ALL, __uuidof(INetworkCostManager),
                                  (LPVOID*)&pCostManager);
    bool retVal = true;  // Для безопасности по сбоях считаем лимитным
    if (hr == S_OK)
    {
        DWORD cost;
        hr = pCostManager->GetCost(&cost, NULL);
        if (hr == S_OK && (cost&NLM_CONNECTION_COST_UNRESTRICTED))
        {
            retVal = false;
        }
        pCostManager->Release();
    }
    CoUninitialize();
    return retVal;
}

int main(int argc, char * argv[])
{
    cout << isLimited();
}

Флагов типа NLM_CONNECTION_COST_UNRESTRICTED куда больше, но это уже смотрите сами в документации...