Questa è la terza pagina della rubrica dedicata alla programmazione Visual Basic.
Attendere il caricamento completo...
Vai alla prima pagina; Vai alla seconda pagina
Ecco un argomento che ricorre molto ultimamente tra le Vostre lettere, come impostare una combinazione di tasti?
Forse a tutti voi sarà capitato di premere, durante il normale utilizzo di windows la combinazione di tasti Ctrl+Alt+Canc, e non sempre per puro piacere ?!?. Però è a volte utile associare ad una combinazione di tasti un certo evento, per esempio poter aprire una finestra oppure far partire un programma che risiede in stato di quiescenza nella tray bar [espressione formalmente non corretta].
Ecco quindi come creare delle proprie scorciatoie; un suggerimento: non fatevi prendere la mano altrimenti invece di essere utili distrarranno i vostri utenti.
Innanzi tutto occorre dichiarare qualche API, quelli di voi che hanno seguito gli altri suggerimenti certo non rimarranno sorpresi.
Public Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As RegisterHotKeyModifiers, ByVal vk As KeyCodeConstants) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "User32.dll" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As LongAdesso vediamo come utilizzare queste function inglobandale in altre funzioni da noi create:
Prima di tutto due funzioni che richiamano le API sopradescritte:
Public Sub AttaccaCombinazione(SubClassForm As Form)
If OldWndProc <> 0 Then Exit Sub
HandleSubClass = SubClassForm.hWnd
OldWndProc = GetWindowLong(SubClassForm.hWnd, GWL_WNDPROC)
SetWindowLong SubClassForm.hWnd, GWL_WNDPROC, AddressOf Attiva
End Sub
Public Sub StaccaCombinazione()
If OldWndProc = 0 Then Exit Sub
SetWindowLong HandleSubClass, GWL_WNDPROC, OldWndProc
OldWndProc = 0
End Subed ora la funzione che attiva la combinazione prescelta:
Private Function Attiva(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
'la combinazione di tasti prescelta è stata effettuata dall'utente, inserite qui di seguito
'il codice da associare all'evento.
Form2.Show
Else
Attiva = CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam)
End If
End FunctionQuesta ultima è quella che deve essere modificata da voi per associare all'evento di pressione dei tasti prescelti che volete produrre. In questo caso alla pressione dei tasti Ctrl+A [è solo un esempio facilmente modificabile] verrà eseguito: Form2.show. E se la combinazione di tasti non è quella da voi impostata? niente paura il controllo viene restituito a Windows che provvederà a eseguire qualcuno degli eventi assegnati per quella combinazione [ammesso che ve ne siano].
Per attivare quindi la combinazione di tasti è sufficiente integrare in un form un array [2 elementi] di oggetti Command e incollare il seguente codice:
Private Sub cmdtasti_Click(Index As Integer)
Select Case Index
Case 0
'Attiva la HotKey.
'Subclassa il form.
Call AttaccaCombinazione(Me)
Attiva = RegisterHotKey(Me.hWnd, 0, MOD_CONTROL, vbKeyA) = 1
MsgBox "Attenzione la combinazione di tasti è attiva, premenre il tasto Ctrl contemporaneamente al tasto A", vbInformation, "Attenzione"
Case 1
'Disattiva la HotKey.
'La funzione "UnregisterHotKey" restituisce 1 se ha successo.
Attiva = UnregisterHotKey(Me.hWnd, 0) = 0
MsgBox "Attenzione la combinazione di tasti è disattiva", vbInformation, "Attenzione"
'Disattiva il subclassing del form.
Call StaccaCombinazione
End Select
End SubCome vedete 0 attiva la combinazione e 1 la disattiva.
ATTENZIONE!: se avete attivato una combinazione di tasti provvedete a disattivarla prima dell'arresto del programma che l'ha richiesta altrimenti produrrete con buona probabilità un CROLLO DEL SISTEMA.
Buona norma sarebbe quella di disattivare la combinazione di tasti a seguito dell'evento terminate del vostro programma:
Private Sub Form_Terminate()
'La funzione "UnregisterHotKey" restituisce 1 se ha successo.
Attiva = UnregisterHotKey(Me.hWnd, 0) = 0
'Disattiva il subclassing del form.
Call StaccaCombinazione
End SubAdesso non vi rimane altro che scaricare l'esempio, ma attenzione la roccomandazione precedente vale anche in fase di debug di una vostra applicazione. Prima di cliccare su Blocca Esecuzione dell'ambiente di sviluppo VB accertatevi che la combinazione di tasti sia stata precedentemente disabilitata.
Tasti Rapidi 79.8Kb
![]()
Accesso Remoto: enumerare le connessioni ad InternetAffrontiamo adesso un altro problema: l'enumerazione delle connessioni ad Internet presenti nel sistema e l'avvio di una connessione scelta.
Per far questo iniziamo, come al solito con le dichiarazioni API necessarie:
Public Declare Function RasEnumEntriesA Lib "RasApi32.DLL" _
(ByVal reserved As String, ByVal lpszPhonebook As String, _
lprasentryname As Any, lpcb As Long, lpcEntries As Long) _
As Long
Public Type RASENTRYNAME95
dwSize As Long
szEntryname(256) As Byte
End TypeQuesta volte poche per fortuna.
Adesso passiamo alla descrizione del sub necessaria per l'enumerazione delle connessioni.
Public Sub DUN_Services(DUN_Array() As String)
Dim s As Long, ln As Long, conname As String, i As Long
Dim r(255) As RASENTRYNAME95
r(0).dwSize = 264
s = 256 * r(0).dwSize
Call RasEnumEntriesA(vbNullString, vbNullString, r(0), s, ln)
ln = ln - 1
ReDim DUN_Array(ln)
For i = 0 To ln
conname = StrConv(r(i).szEntryname(), vbUnicode)
DUN_Array(i) = Left$(conname, InStr(conname, _
vbNullChar) - 1)
Next i
End SubIn questo modo tutte le connessioni saranno enumerate dentro un vettore. Adesso sarà sufficiente passare l'array ad un combobox. A questo punto occorre specificare le subroutines necessarie all'avvio, all'arresto e alla rilevazione di una connessione ad Internet.
Questa descrizione la ometto da questo articolo, però potete trovare tutto nel progetto qui allegato.
Se avete dei dubbi sul codice non esitate a scrivermi.
|
Accesso Remoto 53,4Kb |
![]()
Esiste il file specificato? esiste il percorso specificato?Ecco due semplici functions pronte all'uso per verificare l'esistenza di un file o di una cartella specificata.
Se il file specificato esiste allora la funzione EsisteilFile restituisce true altrimenti false.
Public Const strVirgolette = """"
Public Const strBarra = "\"
Public Function PulisciStringa(ByVal NomeFile As String)
NomeFile = Trim(NomeFile)
If Mid$(NomeFile, 1, 1) = strVirgolette And Right$(NomeFile, 1) = strVirgolette Then
NomeFile = Mid$(NomeFile, 2, Len(NomeFile) - 2)
End If
PulisciStringa = NomeFile
End Function
Function EsisteilFile(ByVal NomeFile As String) As Boolean
Dim NumeroFile As Integer
On Error Resume Next
NomeFile = PulisciStringa(NomeFile)
If Right$(NomeFile, 1) = strBarra Then
NomeFile = Left$(NomeFile, Len(NomeFile) - 1)
End If
NumeroFile = FreeFile
Open NomeFile For Input As NumeroFile
EsisteilFile = IIf(Err = 0, True, False)
Close NumeroFile
Err = 0
End Function
Function EsisteCartella(ByVal NomeCartella As String) As Boolean
Dim e As Integer
On Error Resume Next
NomeCartella = PulisciStringa(NomeCartella)
If Right$(NomeCartella, 1) = strBarra Then
NomeCartella = Left$(NomeCartella, Len(NomeCartella) - 1)
End If
ChDir ((NomeCartella) & strBarra)
e = Err
Debug.Print Err.Description
'errore di accesso 75, 76
If e <> 0 Then EsisteCartella = False Else EsisteCartella = True
End Function
![]()
Avviare automaticamente una applicazione
Ci sono due modi per eseguire automaticamente una applicazione all'avvio di Windows.
Il primo consiste nel posizionare un collegamento al file eseguibile dentro la voce RUN contenuta nel registro di configurazione di Windows. Il percorso completo di questa voce è:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Per posizionare una chiave che riporti il link all'eseguibile, rimando all'articolo in cui descrivo le procedure di lettura e scrittura del registro.
Se avete necessità di avviare un programma una sola volta, ad esempio durante le installazioni, spesso i vari componenti devono essere registrati al riavvio del pc, allora posizionate questo link come chiave della voce:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
Anche in questo caso rimando alla descrizione della procedura di lettura/scrittura precedentemente citata.
Veniamo all'altro metodo, che io preferisco utilizzare (i motivi li spiego più avanti).
Il metodo molto semplice, che sicuramente conoscete, consiste nel posizionare un link al file eseguibile nella cartella di esecuzione automatica contenuta dentro il percorso Start/Programmi/Esecuzione automatica [Avvio/Programmi/esecuzione automatica, Start/Programmi/startup ...]. Vediamo come realizzare una procedura che inserisca ed elimini (secondo le necessità) questo collegamento.
Procedura di inserimento:
Per inserire inserisco queste voci o in una procedura di installazione, di primo avvio della applicazione, oppure manuale (assegnando all'utilizzatore del programma la scelta se eseguire automaticamente l'applicazione oppure no):
lresult = fCreateShellLink("..\..\Menu Avvio\Programmi\Esecuzione automatica", nomeapp, CartellaAvvio & "\" & eseguibile, "")
If lresult <> 1 Then
lresult = fCreateShellLink("..\..\Start Menu\Programs\Startup", nomeapp, CartellaAvvio & "\" & eseguibile, "")
End If
In rosso sono evidenziate le voci da personalizzare, ad esempio:
nomeapp = App.title
CartellaAvvio = App.Path
eseguibile=app.EXEName
Dove le variabili sono tutte stringhe.
Come vedete invoco una API per l'esattezza la fCreateShellLink la cui dichiarazione è la seguente:
Public Declare Function fCreateShellLink Lib "VB5STKIT.DLL" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArgs As String) As Long
recuperabile comunque dal visualizzatore API.
Rimozione delle voci di collegamento.
Per la rimozione dei collegamenti:
Call rimuovicollegamenti("..\..\Menu Avvio\Programmi\Esecuzione automatica", nomeapp, CartellaAvvio & "\" & eseguibile)
Call rimuovicollegamenti("..\..\Start Menu\Programs\Startup", nomeapp, CartellaAvvio & "\" & eseguibile)
La procedura è:
Public Sub rimuovicollegamenti(Destinationpath, Shortcutname, Sourcepath)
t = OSfRemoveShellLink(Destinationpath, Shortcutname) 'create the shortcut with the data specified
End SubDove in questo caso invoco la funzione API la cui dichiarazione risulta:
Declare Function OSfRemoveShellLink Lib "VB5STKIT.DLL" Alias "fRemoveShellLink" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String) As Long
Veniamo ai motivi per cui preferisco la seconda procedura:
Prima di tutto è bene ricordare di eliminare il collegamento (qualunque dei due modi scegliate) perché un vostro utente, magari troverà comodo veder partire la Vostra applicazione automaticamente, ma sarà sicuramente più scocciato dai messaggi di errore provocati dal tentativo di avviarla una volta disinstallata. Proprio per questo motivo preferisco la seconda. Quanti di voi possono giurare che tutte le applicazioni disinstallate siano state rimosse correttamente. Per i Vostri utenti sarà più facile eliminare manualmente un link dal menu Programmi/Esecuzione automatica, piuttosto che una chiave dal registra di configurazione di Windows.
Anche se scaricando un qualunque source pubblicato in questa sezione, avrete già imparato ad effettuare un link ad un certo URL da un form del Vostro progetto, ho deciso comunque di aggiungere questo piccolo esempio:
Link to the World: è il nome altisonante di questo "programmino".
Inserite un modulo nel vostro progetto (se non ce lo avete già) e copiate questa dichiarazione API:
Public Declare Function ShellExecute Lib "shell32.dll" 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
A questo punto definite una funzione Link nel modo seguente:
Public Function Link(ByVal URL As String) As Long
Link = ShellExecute(0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus)
End FunctionNel form posizionate una label nella quale specificate l'url da raggiungere. associate all'evento click la chiamata alla vostra funzione.
Private Sub Label4_Click()
Call Link("http://leoband.firenze.net")
End SubPerfetto, adesso un po' di abbellimenti:
Innanzi tutto in internet spesso è associato ad un link il colore blue: quindi sotto ForeColor della label indicata scegliete il colore adatto.
Tutti i links che si rispettino, al passaggio del vostro mouse si sottolineano ed allora:
Private Sub Label4_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label4.FontUnderline = True
End Sube naturalmente nell'evento MouseMove del form:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label4.FontUnderline = False
End SubSe invece di una pagina WEB volete puntare ad un indirizzo email, sarà sufficiente chiamare la funzione in questo modo:
Private Sub Label2_Click()
Call Link("mailto:posta@leonardobandini.it")
End SubUn altro accorgimento da prendere è quello di trasformare l'icona del puntatore del vostro mouse nella classica "manino" quindi andate sotto la proprietà MouseIcon della label e specificate l'icona, e successivamente fissate la proprietà MousePointer su Custom.
Se volete più semplicemente incollare nella vostra applicazione tutto questo scaricate l'esempio successivo:
LinkToTheWorld 12,9Kb
![]()
Cercare un percorso in locale o in rete
Vediamo una procedura per invocare una chiamata al cerca percorso (open folder) di windows senza "scomodare" le Common Dialog. I più attenti di voi, si saranno accorti che non uso molto questo componente infatti ho spesso avuti problemi di compatibilità tra le varie versioni del SO. Veniamo quindi come sempre alle dichiarazioni API necessarie.
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Const BIF_RETURNONLYFSDIRS = &H1
Const BIF_DONTGOBELOWDOMAIN = &H2
Const BIF_STATUSTEXT = &H4
Const BIF_RETURNFSANCESTORS = &H8
Const BIF_BROWSEFORCOMPUTER = &H1000
Const BIF_BROWSEFORPRINTER = &H2000
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Adesso una funzione da aggiungere in un modulo insieme alle dichiarazioni precedenti:
Public Function Percorso(ByVal hWndOwner As Long, ByVal sTitle As String) As String
Dim bInf As BROWSEINFO
Dim RetVal As Long
Dim PathID As Long
Dim RetPath As String
Dim Offset As Integer
bInf.hOwner = hWndOwner
bInf.lpszTitle = "Seleziona la cartella della risorsa di rete"
bInf.ulFlags = BIF_RETURNONLYFSDIRS
PathID = SHBrowseForFolder(bInf)
RetPath = Space$(512)
RetVal = SHGetPathFromIDList(ByVal PathID, ByVal RetPath)
If RetVal Then
Offset = InStr(RetPath, Chr$(0))
Percorso = Left$(RetPath, Offset - 1)
End If
End FunctionEcco fatto adesso è sufficiente inserire in un form, che ad esempio si chiama Form1 un controllo TextBox, chiamatelo txtPercorso. Inserite un command (command1). All'evento click associate questa chiamata:
Private Sub Command1_Click()
If txtpercorso <> "" Then
Form2!Combo1.Text = txtpercorso.Text
Unload Me
End If
End SubE come sempre eccovi l'esempio:
Percorso 12,7Kb
![]()
INSERISCI NEI PREFERITI - http://www.visualbasic.subito.cc - INSERISCI NEI PREFERITI
![]()
Vai alla quarta pagina della rubrica dedicata alla programmazione Visual Basic