NDIS 6.20+。netsh wlan show drivers → 「支持的承載網絡: 是」。// 1. 啟動託管網絡
netsh wlan set hostednetwork mode=allow ssid=MyHotspot key=12345678 keyUsage=persistent
netsh wlan start hostednetwork
// 2. 啟用 Internet 連接共享 (ICS)
// 需手動:控制面板 → 網絡共享中心 → 更改適配器設置 → 共享網絡連接
// 或調用 COM 接口 INetSharingManager (需管理員權限)
#include <windows.h>
#include <netsh.h> // 需 Windows SDK
BOOL StartHotspot(LPCWSTR ssid, LPCWSTR pass) {
// 組裝命令
WCHAR cmd[512];
swprintf(cmd, 512, L"netsh wlan set hostednetwork mode=allow ssid=%s key=%s keyUsage=persistent", ssid, pass);
if (system(cmd)) return FALSE; // system 需 #include
return system(L"netsh wlan start hostednetwork") == 0;
}
BOOL StopHotspot() {
return system(L"netsh wlan stop hostednetwork") == 0;
}
// 使用 Native WiFi API (wlanapi.h)
#include <wlanapi.h>
#pragma comment(lib, "wlanapi.lib")
void ScanNetworks() {
HANDLE hClient;
DWORD dwVersion, dwResult = WlanOpenHandle(2, NULL, &dwVersion, &hClient);
PWLAN_INTERFACE_INFO_LIST pIfList;
WlanEnumInterfaces(hClient, NULL, &pIfList);
for (int i = 0; i < pIfList->dwNumberOfItems; ++i) {
WlanScan(hClient, &pIfList->InterfaceInfo[i].InterfaceGuid, NULL, NULL, NULL);
Sleep(1000); // 等待掃描完成
PWLAN_AVAILABLE_NETWORK_LIST pNetList;
WlanGetAvailableNetworkList(hClient, &pIfList->InterfaceInfo[i].InterfaceGuid, 0, NULL, &pNetList);
for (int j = 0; j < pNetList->dwNumberOfItems; ++j) {
WCHAR ssid[256];
memcpy(ssid, pNetList->Network[j].dot11Ssid.ucSSID, pNetList->Network[j].dot11Ssid.uSSIDLength);
ssid[pNetList->Network[j].dot11Ssid.uSSIDLength] = L'\0';
wprintf(L"SSID: %s, Signal: %d%%\n", ssid, pNetList->Network[j].wlanSignalQuality);
}
WlanFreeMemory(pNetList);
}
WlanFreeMemory(pIfList);
WlanCloseHandle(hClient, NULL);
}
| 方案 | 優點 | 缺點 |
|---|---|---|
| netsh 命令行 | 零依賴、幾行代碼 | 需管理員、無事件回調、解析輸出脆弱 |
| Native WiFi API (wlanapi) | 官方 API、完整事件、無需提權(部分操作) | API 複雜、文檔少、Vista+ 支持 |
| 第三方庫 | 封裝友好 | 引入依賴、授權風險 |
**第一步永遠是 `netsh wlan show drivers` 確認硬件支持**。不支持 Hosted Network 的網卡(如部分舊款 Realtek/Intel 7260 早期固件),任何代碼都無效。建議直接調用 `netsh` 命令行,工程量最小、兼容性最好。