WindowsでWifi APIを使用します。 利用可能なワイヤレスネットワークの一覧表示

彼のプログラムの1つに取り組む過程で、彼は利用可能なワイヤレスネットワークのリストを取得する必要に直面しました。 情報を検索する過程で、Windows XP SP2から、この問題の解決に役立つWifi APIが登場したことが判明しました。
この記事では、利用可能なワイヤレスネットワークのリストを表示する簡単なプログラムを作成する方法について説明します。

この例は、Windows XP SP2以降で動作します。SP2の場合のみ、 ワイヤレスLAN APIパッケージをダウンロードしてインストールする必要があります 。 Windows XP SP3以降(Windows Vista、Windows 7)を使用している場合、何もダウンロードする必要はありません。マシン上で動作するためにすべてがそこにあります。

開始するには、Wlanapiヘッダーファイルをプロジェクトに含め、ライブラリを追加する必要があります

#include <Wlanapi.h>
#pragma comment(lib, "Wlanapi.lib" )

すべては、 WlanOpenHandleを呼び出してクライアントセッションを作成することから始まります。

DWORD WINAPI WlanOpenHandle(
__in DWORD dwClientVersion,
__reserved PVOID pReserved,
__out PDWORD pdwNegotiatedVersion,
__out PHANDLE phClientHandle
);

オペレーティングシステムのバージョンを確認し、Windows XPの場合はバージョン1( dwClientVersion )、Windows Vista以降の場合は2として転送するか、常に2を転送することができます。WindowsXPでも、 。

クライアントが作成され、そのハンドルが受信されました。次に、使用するインターフェイスを選択する必要があります。 WlanEnumInterfacesを呼び出して、使用可能なインターフェイスのリストを取得します

DWORD WINAPI WlanEnumInterfaces(
__in HANDLE hClientHandle,
__reserved PVOID pReserved,
__out PWLAN_INTERFACE_INFO_LIST *ppInterfaceList
);

ここで、 hClientHandleWlanOpenHandleを呼び出した結果として受け取ったハンドルであり、 ppInterfaceListは利用可能なインターフェイスのリストへのポインターです。
WLAN_INTERFACE_INFO_LIST構造体のメンバーであるdwNumberOfItemsは、使用可能なインターフェースの数を教えてくれます。

これで、 WlanGetAvailableNetworkListを呼び出して、使用可能なネットワークのリストを取得できます。

DWORD WINAPI WlanGetAvailableNetworkList(
__in HANDLE hClientHandle,
__in const GUID *pInterfaceGuid,
__in DWORD dwFlags,
__reserved PVOID pReserved,
__out PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList
);

ここで、 pInterfaceGuidはインターフェイスのGUIDへのポインターであり、 WlanEnumInterfacesを呼び出した後に既に持っているWLAN_INTERFACE_INFO構造体から取得できます。

dwFlagsパラメーターは、 WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILESおよびWLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILESの値を取ることができます。

ppAvailableNetworkListの最終目標は、 WLAN_AVAILABLE_NETWORK_LIST構造体へのポインターです。WLAN_AVAILABLE_NETWORK_LIST構造体には、 WLAN_AVAILABLE_NETWORK構造体の配列が含まれ、見つかった各ネットワークのパラメーターが記述されます。

必要なものを取得したら、すべてのポインターを解放し、すべてのハンドルを閉じる必要があります。 WlanFreeMemoryを呼び出すことにより、インターフェイスのリストとネットワークのリストへのポインターを解放します。

VOID WINAPI WlanFreeMemory(
__in PVOID pMemory
);

WlanCloseHandleを使用しクライアントセッションを閉じる

DWORD WINAPI WlanCloseHandle(
__in HANDLE hClientHandle,
__reserved PVOID pReserved
);

記事からわかるように、さらに簡単にするために複雑なものはありませんが、次のメソッドを持つラッパークラスを作成しました。

//
BOOL OpenClient();
//
BOOL CloseClient();
// ?
BOOL IsClientOpen();

//
BOOL GetAvialableNetworks(GUID interfaceGuid, vector<WLAN_AVAILABLE_NETWORK> &networks);
//
BOOL GetInterfacesList(vector<WLAN_INTERFACE_INFO> &interfaces);

使用例:

CWiFiManager wifiManager;

if (wifiManager.OpenClient())
{
vector<WLAN_INTERFACE_INFO> interfaces;
vector<WLAN_AVAILABLE_NETWORK> networks;

if (wifiManager.GetInterfacesList(interfaces))
{
if (wifiManager.GetAvialableNetworks(interfaces[0].InterfaceGuid, networks))
{
for (size_t i = 0; i < networks.size(); ++i)
{
// -
}
}
}
}

このリンクのソースを使用して例をダウンロードできます

Source: https://habr.com/ru/post/J76888/


All Articles