Visual Basic Simple
Avviare le applet del pannello di controllo
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Difficoltà: 2 / 5

Alcuni programmi che operano con le impostazioni del sistema possono dover presentare all'utente la possibilità di modificare i dati tramite le applet del pannello di controllo, quei piccoli programmi che regolano il comportamento delle impostazioni del computer in uso.

Vedremo in questo semplice HowTo come richiamare tali applet per permettere all'utente la visualizzazione o la modifica dei dati del sistema. Utilizzeremo una soluzione molto semplice, la stessa che utilizza Windows quando l'utente clicca due volte sull'icona di un file del pannello di controllo; questi files avranno estensione CPL.

Figura 1Il nostro progetto si comporrà di un solo e semplice form su cui saranno presenti due Label descrittive, una ComboBox di nome cboApplets con la proprietà Style impostata su 2 - Dropdown List in modo da non consentire l'immissione di dati all'utente. Oltre questa abbiamo una TextBox di nome txtNumeroPagina ed un CommandButton di nome cmdApriApplet. Il funzionamento è davvero semplice: l'utente dovrà semplicemente scegliere l'applet che desidera aprire tramite la ComboBox, inserire opzionalmente il numero di pagina dell'applet e premere il grande pulsante.

Figura 2Per numero di pagina intendiamo la scheda (TabStrip) dell'applet richiamata. Quasi tutte le applet, infatti contengono molte informazioni, suddivise in categorie tra le varie pagine. Mediante l'utilizzo di questo codice potremo non solo specificare quale applet avviare ma anche la pagina corrispondente da mostrare all'utente.

La prima operazione da effettuare all'avvio del nostro progetto sarà quella di ricercare tutte le applet, ovvero tutti i files con estensione CPL presenti nella cartella System (se usiamo Windows 9x/ME) o System32 (se usiamo Windows NT). L'operazione di elencazione di tutti i files corrispondenti ad un criterio è trattata in un altro HowTo con la piccolissima differenza che invece di utilizzare una ListBox questo caso utilizza una ComboBox. Vediamo il nostro codice:

  1. Option Explicit
  2. Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
  3. Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  4. Private Const CB_DIR = &H145

Alla riga 3 abbiamo dichiarato la funzione API GetSystemDirectory che recupererà il percorso della cartella System o System32 del computer. Abbiamo detto infatti che tutte le applet conosciute dal pannello di controllo risiedono lì dentro.

Alla riga 4 è dichiarata la funzione API SendMessage che utilizzeremo per recuperare con estrema semplicità tutte le applet contenute nella cartella. Il messaggio che invieremo sarà quello definito alla riga successiva, corrispondente alla costante API CB_DIR.

  1. Private Sub Form_Load()
  2.     Const lngFilesTutti = vbReadOnly Or vbHidden Or vbSystem Or vbArchive
  3.     Dim strPercorso As String
  4.     strPercorso = Space$(255)
  5.     strPercorso = Left$(strPercorso, GetSystemDirectory(strPercorso, 255)) & "\*.CPL"
  6.     Call SendMessage(cboApplets.hwnd, CB_DIR, lngFilesTutti, ByVal strPercorso)
  7. End Sub

E così, all'avvio del form viene costruita la stringa che indicherà il percorso della cartella da cui ritrovare i files CPL. Alla riga 8 definiamo una costante di nome lngFilesTutti corrispondente alla combinazione dei vari attributi dei files. Questa sarà utilizzata durante la ricerca dei files. Alla riga 10 viene allocato lo spazio necessario ed alla riga successiva viene ritrovata la cartella System o System32 tramite la funzione API GetSystemDirectory.
A questo percorso verrà aggiunto il filtro tramite caratteri jolly *.CPL.

Completata la costruzione del percorso e del filtro di ricerca richiederemo alla funzione API SendMessage l'autoelencazione di tutti i files CPL specificando innanzitutto l'handle della ComboBox, il messaggio CB_DIR, il tipo di ricerca da effettuare ed il percorso.

  1. Private Sub cmdApriApplet_Click()
  2.     Call Shell("Rundll32.exe shell32.dll,Control_RunDLL " & cboApplets.Text & ",," & CStr(Val(txtNumeroPagina.Text)))
  3. End Sub

L'unico evento da gestire nel nostro progetto riguarda il click sull'unico pulsante cmdApriApplet per richiedere l'apertura dell'applet corrispondente, operazione che effettueremo tramite l'utilizzo dell'utility RUNDLL32. La stringa con cui richiamiamo l'applet proviene dal registro di Windows. Abbiamo infatti detto che lo stesso Windows (più precisamente Explorer) utilizza questa tecnica per richiamare i files CPL.

La stringa si compone del nome dell'utility Rundll32 seguita dalla libreria shell32.dll da cui richiamare la funzione API Control_RunDLL. Tra il nome della libreria e della funzione è richiesta la presenza di una virgola. Tutto quello che seguirà sono i dati da fornire alla funzione API Control_RunDLL e più precisamente il nome, senza necessità del percorso, dell'applet da richiamare; il secondo parametro non è utilizzato mentre il terzo indicherà il numero della pagina da richiamare, specificata nella casella di testo txtNumeroPagina.

Un esempio di stringa può essere: "Rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0" che indica l'apertura dell'applet "Proprietà schermo" alla pagina 1. Tale stringa verrà poi lanciata tramite l'istruzione Shell.

Un trucchetto interessante consiste nel non passare il nome dell'applet alla funzione Control_RunDLL. Verrà allora aperto il pannello di controllo dal quale l'utente potrà scegliere l'applet che desidera caricare.
Sarà possibile provare questo trucchetto lanciando il nostro progetto e, senza scegliere alcuna applet dalla ComboBox, premere il CommandButton.

Il difetto principale di questa soluzione è rappresentato dall'impossibilità di scegliere alcune schede di alcune applet. Questo codice non richiamerà infatti tutte le pagine a disposizione dell'utente ma soltanto una parte di queste.

Fibia FBI
27 Febbraio 2002

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'indice degli HowTo