Come prendere la forza del segnale wi-fi in visual basic 2008?

lunedì 22 agosto 2011 - 13.36

FrancyDTD8 Profilo | Newbie

Sto sviluppando un virtual OS, e sono già riuscito con un semplice codice a far aggiornare una picturebox e a far cambiare immagine quando internet non è più disponibile. Ma ora mi chiedo, come posso, con un altra picturebox fare lo stesso, con il wi-fi? cioè: fare una picturebox che cambia immagine quando la forza del segnale cambia?

u235 Profilo | Junior Member

ciao, per prendere il segnale guarda qui :

http://pinvoke.net/default.aspx/wlanapi/WlanQueryInterface.html

per cambiare l'immagine ti basta creare dei range per potenza del segnale con relativa immagine diversa, se il valore rientra in detto range ne mostri la relativa immagine.

FrancyDTD8 Profilo | Newbie

Sì, ma non so come utilizzare
<DllImport("Wlanapi", EntryPoint := "WlanQueryInterface")> _
Public Shared Function WlanQueryInterface(<[In]> ByVal hClientHandle As IntPtr, _
<[In]> ByRef pInterfaceGuid As Guid, ByVal OpCode As WLAN_INTF_OPCODE, _
ByVal pReserved As IntPtr, <Out> ByRef pdwDataSize As UInteger, _
ByRef ppData As IntPtr, ByVal pWlanOpcodeValueType As IntPtr) As UInteger
End Function

già, sono una frana...

u235 Profilo | Junior Member

Ciao, spesso usare le API non significa chiamare solo un metodo, in quanto a volte è necessario fornire (ed eventualmente ricavarsi) dei tipi realativi ad altre chiamate, altri metodi che ti "predispongono" e ti fanno ottenere quello che è necessario da passare come parametro ad altri metodi. ad esempio, in questo caso, prima di arrivare ad "ottenere" i parametri che ti servono per lavorare con WlanQueryInterface, devi passare per altri metodi, come : ottenere l'handle (WlanOpenHandle), enumerare le interfaccie (WlanEnumInterfaces ottieni un IntPtr che ti servirà a creare la struttura WLAN_INTERFACE_INFO_LIST contenente le lista delle informazioni), dovrai creare i vari tipi che ti servono per operare in questo senso, liberare memoria ecc.
Il link che ti ho postato voleva essere un aiuto, li potrai trovare la maggior parte dei tipi che ti servono già compresi di "trucchetti" (marshaling ecc.) che si renderanno necessari per operare con le API, credinmi, è inutile reinventare la ruota, sfrutta l'esperienza di chi ha già implementato alcune soluzioni e le ha messe a disposizione li o in altri siti...

comunque visto che ormai ci sono, se vuoi ti do una mano :

questo è il codice che ti permette di ottenere diverse informazioni sul wifi (quello che tu volevi ottenere con WlanQueryInterface... :) che come vedrai verra chiamato, ma...)

(WiFi.vb)
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


si usa con Wifi.GetInfo() ottenendo una lista di "WiFiInfo"

poi abbiamo un tipo che eredita da picturebox (DynamicPictureBox.vb) che ti servirà per mostrare le immagini del segnale

[CODE] Imports System.ComponentModel Partial Public Class DynamicPictureBox Inherits PictureBox Public m_images As ImageList Public Property Images() As ImageList Get Return Me.m_images End Get Set(value As ImageList) Me.m_images = value End Set End Property Private m_signal As Integer = 0 Public Property Signal() As Integer Get Return Me.m_signal End Get Set(value As Integer) Me.SetSignal(value) End Set End Property Public Property MaxSignal() As Integer Get Return m_MaxSignal End Get Set(value As Integer) m_MaxSignal = value End Set End Property Private m_MaxSignal As Integer Public Sub New() InitializeComponent() End Sub Private Sub SetSignal(Signal As Integer) Try Dim index As Integer = MaxSignal / Me.Images.Images.Count index = Signal \ index If index > 0 Then index -= 1 End If Me.Image = Me.Images.Images(index) Me.m_signal = Signal Catch End Try End Sub End Class [/CODE]

infine, dovrai aggiungere nella tua form :
1 o più DynamicPictureBox (in base a quante interfacce hai e vuoi monitorare) impostare per ognuna la proprietà MaxSignal a 100, per ognuna una ImageList contenente le immagini che vorrai mostrare in base alla potenza del segnale, dalla meno potente alla più potente in ordine crescente nella posizione della lista, infatti la "DynamicPictureBox" divide la poterza massima del segnale per il numero di immagini presenti nella proprietà Images, quindi in base al segnale impostato nella proprieà Signal, determina l'immagine da mostrare.
1 timer che ti permette di fare il refresh delle informazioni e aggiornare la DynamicPictureBox
1 meccanismo per aggiornare le DynamicPictureBox (sotto un esempio con Timer1_Tick)

esempio (Form1.vb):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


spero ti sia utile.

ciao.

FrancyDTD8 Profilo | Newbie

Ok proverò...

FrancyDTD8 Profilo | Newbie

però aspetta, cosa intendi con dynamicpicturebox.vb ??

u235 Profilo | Junior Member

è la classe che ho postato (quella non formattata correttamente del post), si tratta si una classe che eredita da pictureBox.

comunque vedi tu... hai diverse opzioni :

link postato, ti studi le API e realizzi tutto tu.
classe postata, copi e incolli tutto...
classe postata, la studi e la riproduci a modo tuo.

FrancyDTD8 Profilo | Newbie

Hai dimenticato la quarta opzione... Lasciar Perdere

u235 Profilo | Junior Member

comunque se dovessi cambiare idea e posso aiutarti in qualche modo... sai dove trovarmi!

ciao.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5