Toolbox Visual Basic

Mauro VB Homepage - Toolbox Presentiamo in questa sezione, per i programmatori in Visual Basic, versioni 5 o 6, strumenti idonei ad ottimizzare le loro applicazioni in termini di efficacia e funzionalità: si tratta di esempi di codici e di routines accompagnati da indicazioni sul loro funzionamento e sul loro utilizzo all'interno di un programma.

Torna a Toolbox

Il materiale messo a disposizione è totalmente gratuito e di libero utilizzo. Se questo codice viene redistribuito altrove si dovrà però citarne l'autore e la fonte.

Espandi tutto | Chiudi tutto

Sezione Utility

RunDll32

A cosa serve e come funziona questo codice
Questo codice spiega il modo per utilizzare, tramite Visual Basic, l'utility di sistema RUNDLL32.exe. Questo importante file, che si trova nella cartella di Windows, si occupa della gestione di molte funzioni del sistema operativo quali, ad esempio, l'apertura di alcune finestre di dialogo (connessioni alla rete, stampanti, schermo), la chiusura di Windows, l'accesso alle applet ("piccoli programmi") del Pannello di Controllo, ecc.
Utilizzando, quindi, le potenzialità di questa utility, saremo in grado di dare all'utilizzatore del nostro programma, la possibilità di modificare e/o personalizzare, tramite le applet del "Pannello di Controllo", le impostazioni necessarie al corretto funzionamento della nostra applicazione.
Il funzionamento del codice, tra l'altro molto semplice, sfrutta la stessa tecnica utilizzata da Windows (Explorer) per richiamare i files CPL (le applet del pannello di controllo, appunto). La stringa, infatti, è composta dal nome dell'utility Rundll32 seguita dalla libreria shell32.dll e, a seguire, i dati da passare alla funzione API Control_RunDLL, ovvero il nome, senza necessità di specificare il percorso, dell'applet da richiamare e, opzionalmente, se si vuole specificare anche il numero di pagina, un secondo parametro non utilizzato ed un terzo che indicherà il numero della pagina da richiamare (vedi esempi e note più sotto).

Quando e perchè usare questo codice
Questo codice, che si "limita" a descrivere come utilizzare RunDll32.exe relativamente per richiamare alcune applet del "Pannello di Controllo", può essere usato, all'interno della nostra applicazione, per consentire all'utente la visualizzazione e/o la modifica dei dati di sistema.

Avvertenze e suggerimenti
L'elenco delle applet e gli esempi più sotto riportati sono compatibili con tutte le versioni di Windows (Win95,Win98,ME, NT, 2000 e XP).
apre il "Pannello di Controllo"
Call Shell("rundll32 shell32,Control_RunDLL")

apre il pannello "Accesso Facilitato"
Call Shell("rundll32 shell32,Control_RunDLL access.cpl")

apre il pannello "Installazione Applicazioni"
Call Shell("rundll32 shell32,Control_RunDLL appwiz.cpl")

apre il pannello "Proprietà dello schermo"
Call Shell("rundll32 shell32,Control_RunDLL desk.cpl")

apre il pannello "Proprietà Internet" (dipende dalla versione di I.E.)
Call Shell("rundll32 shell32,Control_RunDLL inetcpl.cpl")

apre il pannello "Impostazioni Internazionali"
Call Shell("rundll32 shell32,Control_RunDLL intl.cpl")

apre il pannello "Proprietà del mouse"
Call Shell("rundll32 shell32,Control_RunDLL main.cpl")

apre il pannello "Proprietà della tastiera"
Call Shell("rundll32 shell32,Control_RunDLL main.cpl @1")

apre il pannello "Proprietà Suoni e Multimedia"
Call Shell("rundll32 shell32,Control_RunDLL mmsys.cpl")

apre il pannello "Proprietà del Modem"
Call Shell("rundll32 shell32,Control_RunDLL modem.cpl")

apre il pannello "Proprietà del Sistema"
Call Shell("rundll32 shell32,Control_RunDLL sysdm.cpl")

apre il pannello "Proprietà Data e Ora"
Call Shell("rundll32 shell32,Control_RunDLL TimeDate.cpl")
Nota. Alcune applet del pannello di controllo contengono più pagine (schede) selezionabili attraverso un tab control. Volendo, possiamo specificare quale pagina aprire modificando il codice proposto più sopra, in questo modo:
Call Shell("rundll32 shell32,Control_RunDLL nome_applet.cpl,,n")
dove 'nome_applet' è il nome dell'applet che intendiamo visualizzare e 'n' rappresenta il numero del pannello da aprire, esempio:
Call Shell("rundll32 shell32,Control_RunDLL desk.cpl,,1")
viene aperta, in Windows XP, la finestra "Proprietà schermo" alla pagina "Screen Saver".

Esempio di utilizzo
Nell'esempio che segue immaginiamo di voler far modificare all'utilizzatore le impostazioni dello schermo per adattarle alla nostra applicazione. Ecco come richiamare l'applet preposta a questa funzione:
Private Sub VisualizzaProprietàDelloSchermo()

  Call Shell("rundll32 shell32,Control_RunDLL desk.cpl")

End Sub
Con questa sub verrà visualizzata la finestra "Proprietà dello Schermo" con attiva la pagina iniziale (che, nel caso di Windows XP, è la pagina "Temi") se, invece, vogliamo che la finestra venga aperta in una determinata pagina, esempio la pagina delle impostazioni, dovremo usare il seguente codice:

Private Sub VisualizzaProprietàDelloSchermo()

  Call Shell("rundll32 shell32,Control_RunDLL desk.cpl,,4") (*)

End Sub
(*) I numeri delle pagine da aprire possono variare in funzione della versione di Windows in uso.

Sleep

A cosa serve e come funziona questo codice
Questa funzione serve per impostare una breve pausa o un tempo di attesa all'interno di una nostra routine.
La funzione API (Application Programming Interface) Sleep utilizzata deve essere richiamata passando come argomento dwMilliseconds (long) il tempo di attesa espresso in millisecondi (la funzione non prevede nessun valore di ritorno).

Quando e perchè usare questo codice
Questa funzione può essere utilizzata, anche in sostituzione del controllo "Timer", ogni qualvolta ci sia la necessità di impostare un tempo di attesa, soprattutto se molto breve, durante l'esecuzione del nostro codice. L'utilizzo di questa funzione, al contrario dell'utilizzo del Timer o della funzione Delay, consente l'impostazione di tempi "brevi" estremamente precisi.

Avvertenze e suggerimenti
L'utilizzo di questa funzione dovrebbe essere riservato solo per impostare pause molto brevi (inferiori al secondo) in quanto, la nostra applicazione verrà bloccata per tutto il tempo della pausa, impedendo anche eventuali aggiornamenti grafici e qualunque altra elaborazione di codice. Se si ha la necessità di impostare tempi di attesa "lunghi" conviene utilizzare la funzione Delay oppure un controllo Timer.
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Esempio di utilizzo
Nell'esempio che segue ipotizziamo di voler visualizzare, in un controllo label, un messaggio animato nel quale venga visualizzata, con una certa gradualità, la parola "Ciao". Ecco come utilizzare la funzione Sleep.
 Private Sub AnimazioneDiBenvenuto()

  With Label1

   .Caption = "C"
   .Refresh 'forza l'aggiornamento della Label
   Sleep 150 'imposta una pausa di 150 millisecondi

   .Caption = Label1.Caption & "i"
   .Refresh
   Sleep 150 'imposta una pausa di 150 millisecondi

   .Caption = Label1.Caption & "a"
   .Refresh
   Sleep 150 'imposta una pausa di 150 millisecondi

   .Caption = Label1.Caption & "o"
   .Refresh
  End With

 End Sub

Funzione GetKeyState

A cosa serve e come funziona questo codice
Questo codice serve per verificare se il tasto "blocca maiuscole" è premuto oppure no.
La funzione API (Application Programming Interface) GetKeyState utilizzata deve essere richiamata passando come argomento nVirtKey , il codice del tasto da verificare che, nel nostro caso, è: vbKeyCapital.

Quando e perchè usare questo codice
Questa funzione può essere usata in tutti quei casi in cui interessa sapere se il nostro utilizzatore ha il tasto blocca maiuscole premuto oppure no.

Avvertenze e suggerimenti
Sostituendo la costante vbKeyCapital con vbKeyNumlock è possibile eseguire la stessa verifica, di cui sopra, riferita però al tasto Blocco Numerico (del tastierino numerico)
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long
Esempio di utilizzo
Nell'esempio che segue si ipotizza di voler verificare se il pulsante Blocca Maiuscole è premuto.
Ecco come richiamare e utilizzare la funzione GetKeyState:
If (GetKeyState(vbKeyCapital)) Then
  'il tasto blocca maiuscole è attivo
  'qui l'eventuale codice da elaborare di conseguenza
Else
  'il tasto blocca maiuscole NON è attivo
  'qui l'eventuale codice da elaborare di conseguenza
End If
Nota: sostituendo (GetKeyState(vbKeyCapital)) con (GetKeyState(vbKeyNumlock)) viene eseguita la stessa verifica per la posizione del tastierino numerico.

Delay

A cosa serve e come funziona questo codice
Questo codice serve per impostare una breve pausa o tempo di attesa. La subroutine deve essere richiamata passando obbligatoriamente come argomento Second (long) il tempo (in secondi) della pausa desiderata e come argomento, opzionale, Refresh (booleano), True o False rispettivamente per consentire o NON consentire, durante la pausa, l'esecuzione e l'elaborazione di altri eventi.

Quando e perchè usare questo codice
Questa subroutine può essere utilizzata, anche in sostituzione del controllo "Timer", ogni qualvolta ci sia la necessità di impostare un tempo di attesa o una determinata temporizzazione, durante l'esecuzione del nostro codice (visualizzazione di messaggi, di form "splash" ecc.).

Avvertenze e suggerimenti
Se invochiamo la routine con l'argomento "Refresh" False l'aggiornamento della nostra applicazione verrà bloccato per tutto il tempo della pausa, impedendo anche eventuali aggiornamenti grafici e qualunque altra elaborazione di codice.
Rispetto alle routine che utilizzano la funzione "Timer", quella proposta assicura un funzionamento corretto anche nei periodi a "cavallo" della mezzanotte.
Sub Delay(ByVal Second As Long, Optional ByVal Refresh As Boolean = True)

 Dim Start As Date

 'memorizza la data e l’ora correnti
 Start = Now

 'inizia il loop
 Do

 'se Refresh = True, trasferisce il controllo al sistema operativo
 'in modo da consentire l'elaborazione di eventuali eventi
 If Refresh Then DoEvents

 'ripete l'istruzione finchè non è trascorso il numero di secondi richiesti
 Loop Until DateDiff("s", Start, Now) >= Second

End Sub
Esempio di utilizzo
Nell'esempio che segue ipotizziamo di voler visualizzare, temporaneamente, un messaggio contenuto in un normalissimo controllo "Label".
Ecco come utilizzare la routine di temporizzazione:
Private Sub MostraMessaggio()

 lblMessaggio.Visible = True 'visualizza il controllo Label
 Delay 10 'imposta un tempo di attesa di dieci secondi
 lblMessaggio.Visible = False 'nasconde il controllo Label

End Sub

Funzione PrinterExist

A cosa serve e come funziona questo codice
Questo codice serve per verificare se nel sistema in cui è presente la nostra applicazione, è installata una stampante. La funzione, che utilizza la proprietà DeviceName dell'oggetto Printer per recuperare il nome della stampante installata, restituisce True , nel caso venga rilevata la presenza di almeno una stampante, False, in caso contrario.

Quando e perchè usare questo codice
Questa funzione deve essere usata quando, all'interno del nostro codice, prevediamo una procedura di stampa. La verifica della presenza di una stampante, infatti, ci consente di abilitare o disabilitare tale procedura al fine di evitare errori.

Avvertenze e suggerimenti
Anche se può sembrare anacronistico, non è assolutamente certo che in tutti i sistemi sia sempre installata una stampante, quindi, è buona norma eseguire sempre una verifica preliminare.
Attenzione: questa funzione verifica che nel sistema sia installata almeno una stampante ma NON ne verifica anche la disponibilità!
Private Function PrinterExist() As Boolean
 'in caso di errore continua l'elaborazione del codice
 On Error Resume Next

 'variabile che riceve il nome della stampante
 Dim sPrinter As String

 'legge il nome della periferica (stampante)
 sPrinter = Printer.DeviceName

 'Nel caso non ci siano stampanti installate nel sistema in uso,
 'verrà generato un errore (errore gestito dalla funzione stessa).

 If Err.Number Then 'nessuna stampante installata
  'inserire qui un eventuale messaggio di errore o di avviso
  PrinterExist = False
 Else 'è stata rilevata una stampante installata
  PrinterExist = True
End If

End Function
Esempio di utilizzo
Nell'esempio che segue ipotizziamo di voler abilitare un ipotetico pulsante di stampa solo se nel sistema rileviamo la presenza di una stampante.
Ecco come richiamare la funzione PrinterExist:
cmdPrint.Enabled = PrinterExist

Funzione SendEmail

A cosa serve e come funziona questo codice
Questa funzione serve per predisporre l'invio di un messaggio di posta elettronica.
La funzione, che utilizza l'API (Application Programming Interface) ShellExecute , deve essere richiamata passando obbligatoriamente come argomento sTo (string) l'indirizzo al quale si desidera inviare la mail e come argomenti (tutti opzionali) sCc, sCcn, sSubject, sBody (String), rispettivamente: l'indirizzo e-mail al quale si desidera inviare la mail in copia, l'indirizzo e-mail al quale si desidera inviare la mail in copia carbone (nascosta), l'oggetto della mail e, infine, il testo della mail.

Quando e perchè usare questo codice
Questa funzione può essere usata, ad esempio, quando vogliamo che, attraverso un link al nostro (o a qualunque altro) indirizzo di posta elettronica, venga predisposto automaticamente un messaggio con le opportune intestazioni e, all'occorrenza, parzialmente compilato.

Avvertenze e suggerimenti
Utilizzando questa funzione in associazione ad un link di posta elettronica presente in un vostro programma, potrete inserire automaticamente tutte le informazioni utili per identificare il programma stesso e dare, quindi, una risposta appropriata (vedi esempio).
'Dichiarazione della funzione API (sostituire Private con Public in funzione delle necessità)
Private Declare Function ShellExecute Lib "SHELL32" Alias "ShellExecuteA" _
   (ByVal hwnd As Long, _
   ByVal lpOperation As String, _
   ByVal lpFile As String, _
   ByVal lpParameters As String, _
   ByVal lpDirectory As String, _
   ByVal nShowCmd As Long) As Long


Private Function SendEmail(sTo As String, _
   Optional sCc As String, _
   Optional sCcn As String, _
   Optional sSubject As String, _
   Optional sBody As String)

 'Stringa dei parametri
 Dim sCommand As String

 'visualizza la finestra del programma di posta elettronica attivato, alle dimensioni normali
 Const SW_SHOWNORMAL = 1


 sCommand = "mailto:" & sTo 'indirizzo del destinatario (obbligatorio)
 sCommand = sCommand & "?cc=" & sCc 'indirizzo in copia (opzionale)
 sCommand = sCommand & "&bcc=" & sCcn 'indirizzo in copia nascosta (opzionale)
 sCommand = sCommand & "&subject=" & sSubject 'oggetto (opzionale)
 sCommand = sCommand & "&body=" & sBody 'testo della mail (opzionale)

 'la funzione ShellExecute usa l'interprete dei comandi per lanciare (o aprire) un file o un programma.
 'in questo caso, ShellExecute, viene utilizzata per lanciare automaticamente il client di posta predefinito
 ShellExecute Me.hwnd, "open", sCommand, vbNullString, vbNullString, SW_SHOWNORMAL

End Function
Esempio di utilizzo
Ecco come utilizzare e richiamare la funzione SendMail:
ipotizziamo che la Sub InviaEmail sia associata ad un controllo Label dove abbiamo inserito il nostro indirizzo di posta
Private Sub lblInviaEmail_Click()

  Dim sNomeProgramma As String
  'leggo il nome del programma
  sNomeProgramma = App.EXEName

  'costruisco una stringa con il nome del programma e la versione
  sNomeProgramma = sNomeProgramma & " Versione " & App.Major & "." & App.Minor

  'richiamo la funzione utilizzando solo i campi sTo (indirizzo del destinatario)
  'sSubject (soggetto della mail) e sBody (testo del corpo della mail)
  SendEmail "MioIndirizzo@MioProvider.it", , , sNomeProgramma, "Richiesta di informazioni"

End Sub