Programowe wyłączenie WiFi - Windows 8, 10

0

Piszę aplikację wyłączającą WiFi. Nie może się to odbywać poprzez wyłączenie karty sieciowej za pomocą WMI, ani wywołanie netsh itp. Dla Windows 10 mam działający poniższy kod. Jak zrobić analogicznie dla Windows 8?

using Windows.Devices.Radios;

public async void TurnWifiOff()
{
	await Radio.RequestAccessAsync();
	var radios = await Radio.GetRadiosAsync();

	foreach (var radio in radios)
	{
		if (radio.Kind == RadioKind.WiFi)
		{
			await radio.SetStateAsync(RadioState.Off);
		}
	}
}
0

Czy karta sieciowa Windows 10 się różni od Windows 8 :| Ten kod który wysłałeś w powyższym wątku powinien zadziałać także na Windows 8.
Jeśli nie opisz bardziej swój problem
Nie widzę żadnego problemu :|

1

Tak jak użytkownik Ktoś skomentował. W Windows 8 nie było API do obsługi WiFi, podobnego do tego dostępnego w Windows 10.
Ale w Windows Vista i nowszych z Windows 10 włącznie jest dostępne inne API, mianowicie: "Native Wifi API" zawarte w bibliotece wlanapi.dll. Niestety jest ona napisana chyba w C++ i nie da się jej użyć przez dodanie referencji. Na szczęście, dla amatorów takich jak ja, CodePlex udostępnił rozwiązanie, które importuje wlanapi.dll do C#: https://archive.codeplex.com/?p=managedwifi Wystarczy dodać do projektu dwa pliki: "Interop.cs" oraz "WlanApi.cs" i można użyć poniższego kodu.

using NativeWifi;
using System.Runtime.InteropServices;

{

	WlanClient client = new WlanClient();
	foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
	{
		IntPtr radioStatePtr = new IntPtr(0L);
		try
		{
			Wlan.WlanPhyRadioState radioState = new Wlan.WlanPhyRadioState();
			radioState.dwPhyIndex = 0;
			radioState.dot11HardwareRadioState = Wlan.Dot11RadioState.On;
			radioState.dot11SoftwareRadioState = Wlan.Dot11RadioState.Off; //W tym miejscu ustawiamy, czy ma nastąpić włączenie, czy wyłączenie WiFi

			radioStatePtr = Marshal.AllocHGlobal(Marshal.SizeOf(radioState));
			Marshal.StructureToPtr(radioState, radioStatePtr, false);

			Wlan.ThrowIfError(
				Wlan.WlanSetInterface(
							client.clientHandle,
							wlanIface.InterfaceGuid,
							Wlan.WlanIntfOpcode.RadioState,
							(uint)Marshal.SizeOf(typeof(Wlan.WlanPhyRadioState)),
							radioStatePtr,
							IntPtr.Zero));
		}
		finally
		{
			if (radioStatePtr.ToInt64() != 0)
				Marshal.FreeHGlobal(radioStatePtr);
		}
	}
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.