先日のアイコン表示方法の変更に加えて、プログラム起動時の無線LANの状態確認と「有効なAPのみ表示する」オプションを追加しています。
あと、レジストリに設定を保存するときに不要なキーを作っていた問題を(こっそり)修正しました。
動作には影響ありませんが HKCU\Software\tauchi.net\WifiSwitcher以下の余分なキーは必要ありません。
コードのコピペばかりしていると変な失敗をしてしまいますね。
g_hImageList = ImageList_Create(32, 32, ILC_COLOR24 |ILC_MASK, 5, 0); ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_0))); ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_1))); ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_2))); ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_3))); ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_4)));
iCx = GetSystemMetrics(SM_CXSMICON); iCy = GetSystemMetrics(SM_CYSMICON); g_hImageList = ImageList_Create(iCx, iCy, ILC_COLOR24 |ILC_MASK, 5, 0);
ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_0), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR)); ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_1), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR)); ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_2), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR)); ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_3), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR)); ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_4), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR));
INT iSupportedRatesCount = 0;
for (INT i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
if (0 == ndisBssid.SupportedRates[i]) {
break;
}
iSupportedRatesCount ++;
}
switch (iSupportedRatesCount) {
case 4:
// 11b
break;
case 8:
// 11aは 8種類(だった...と思う)
break;
case 12:
// 11g
break;
default:
// その他?
break;
}
DWORD dwBytesReturned = 0,
dwError;
UCHAR ucQueryBuffer[1024]; // サイズは適当...
PNDISUIO_QUERY_OID pNdisQueryOid;
PNDISUIO_SET_OID pNdisSetOid;
PNDIS_802_11_BSSID_LIST_EX pNdisBssidList;
PNDIS_WLAN_BSSID_EX pNdisBssid;
// BSSIDの一覧を更新
ZeroMemory(ucQueryBuffer, 1024);
pNdisSetOid = (PNDISUIO_SET_OID)&ucQueryBuffer[0];
pNdisSetOid->Oid = OID_802_11_BSSID_LIST_SCAN;
pNdisSetOid->ptcDeviceName = WLAN_DEVICE_NAME;
if (!DeviceIoControl(
g_hNdis ,
IOCTL_NDISUIO_SET_OID_VALUE ,
(LPVOID)&ucQueryBuffer[0] ,
sizeof(ucQueryBuffer) ,
(LPVOID)&ucQueryBuffer[0] ,
sizeof(ucQueryBuffer) ,
&dwBytesReturned ,
NULL
)) {
dwError = GetLastError();
}
// 一応 待ってみる
Sleep(6000);
// BSSIDの一覧を取得
ZeroMemory(ucQueryBuffer, 1024);
pNdisQueryOid = (PNDISUIO_QUERY_OID)&ucQueryBuffer[0];
pNdisQueryOid->Oid = OID_802_11_BSSID_LIST;
pNdisQueryOid->ptcDeviceName = WLAN_DEVICE_NAME;
if (DeviceIoControl(
g_hNdis ,
IOCTL_NDISUIO_QUERY_OID_VALUE ,
(LPVOID)&ucQueryBuffer[0] ,
sizeof(ucQueryBuffer) ,
(LPVOID)&ucQueryBuffer[0] ,
sizeof(ucQueryBuffer) ,
&dwBytesReturned ,
NULL
)) {
pNdisBssidList = (PNDIS_802_11_BSSID_LIST_EX)pNdisQueryOid->Data;
pNdisBssid = &(pNdisBssidList->Bssid[0]);
for (int i = 0; i < pNdisBssidList->NumberOfItems; i++) {
if (pNdisBssid->Length) {
// 有効なデータ
}
// 次のBSSID
pNdisBssid = (PNDIS_WLAN_BSSID_EX)(((PBYTE)pNdisBssid) + pNdisBssid->Length );
}
} else {
dwError = GetLastError();
}