FAQ Visual Basic

FAQ Visual Basic Consultez toutes les FAQ
Nombre d'auteurs : 50, nombre de questions : 300, dernière mise à jour : 15 juin 2021
Sommaire→Système- Comment déterminer l'identifiant et la langue du système d'exploitation ?
- Comment savoir si mon clavier est en majuscule ou pas?
- Comment Activer/Désactiver le Caps Lock du clavier
- Comment déterminer les variables d'environnement du système (Windows 2000 et +) ?
- Comment exécuter des commandes Dos ?
- Comment exécuter un programme ?
- Comment fermer un programme ouvert avec la fonction Shell ?
- Comment lister les processus actifs sans utiliser l'API Windows (Win2000 et >) ?
- Comment "tuer" un processus en mémoire (Win2000 et >)?
- Comment verrouiller la station de travail ?
- Comment arrêter ou bien redémarrer le système ?
- Comment réduire la fenêtre d'une application ?
- Comment lister et modifier les services de Windows 2000 /XP ?
- Comment obtenir le numéro de série unique du processeur machine (Windows 2000 et >) ?
- Comment tuer un processus en connaissant le nom de sa fenêtre ?
- Comment lire / écrire dans un fichier .ini ?
- Comment lister toutes les sections d'un fichier .ini ?
- Comment lister toutes les clés et valeurs d'une section d'un fichier .ini ?
- Comment ouvrir un fichier HTML, Word ou autre en utilisant l'exécutable associé ?
- Comment connaître la résolution de l'écran ?
- Comment changer la résolution de l'écran ?
- Comment détecter le changement de la résolution de l'écran ?
- Comment énumérer les polices disponibles ?
- Comment faire une pause pendant un temps défini ?
- Comment récupérer les paramètres régionaux, comme le séparateur décimal ou celui des milliers ?
- Comment récupérer le chemin UNICODE d'un lecteur ?
- Comment récupérer les chemins complets des répertoires Windows, System, et Windows\Temp ?
- Comment obtenir les chemins complets des répertoires spéciaux ?
- Comment connaître la version de Windows sur laquelle mon application est exécutée ?
- Comment savoir si mon application VB6 et exécutée sous Windows VISTA ?
- Comment créer un raccourci sur le Bureau ?
- Comment récuperer le numéro de série d'un volume physique ?
- Comment mettre mon programme à droite dans la barre des tâches (le systray) ?
- Comment lancer un exécutable et reprendre la main quand il a fini ?
- Comment obtenir le nom de l'utilisateur ?
- Comment Vérifier si l'utilisateur courant est Administrateur ?
- Comment obtenir ou modifier le contenu du Presse-papiers ?
- Comment permettre à l'utilisateur de sélectionner une imprimante ?
- Comment obtenir la quantité de mémoire du système ?
- Comment éjecter le lecteur de cd-rom ?
- Comment afficher/masquer la barre des tâches ?
- Comment lancer un élément du panneau de configuration ?
- Comment vider la corbeille ?
- Comment activer/désactiver l'économiseur d'écran ?
- Comment afficher l'écran de veille où éteindre le moniteur
- Comment désactiver le gestionnaire des tâches ou la séquence de touches Ctrl-Alt-Suppr ?
- Comment récupérer la taille et la position de la barre des tâches ?
- Comment masquer le bouton démarrer avec VB ?
- Comment récupérer l'exécutable associé à un fichier ?
5.1. Fichiers
(38)
5.2. Réseaux
(18)
La liste complète des identifiants de langage est disponible à l'adresse suivante : MSDN : Language Identifiers and Locales
Placez ce code dans la section déclaration de votre form ou dans un module :
Private Declare Function GetSystemDefaultLangID Lib "kernel32" () As Long
Private Declare Function VerLanguageName Lib "kernel32" Alias "VerLanguageNameA" _
(ByVal wLang As Long, ByVal szLang As String, ByVal nSize As Long) As Long
Private Enum pLang
LangID = 1
LangName = 2
End Enum
Private Function GetSystemLanguage(param As pLang) As String
Dim ID As String
Dim Buffer As String
ID = "&H" & Right(Hex(GetSystemDefaultLangID()), 3)
Select Case param
Case 1
GetSystemLanguage = ID & " / " & CStr(Val(ID))
Case 2
Buffer = String(255, 0)
VerLanguageName CLng(ID), Buffer, Len(Buffer)
Buffer = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
GetSystemLanguage = Buffer
End Select
End FunctionExemple :
MsgBox "L'ID langue est : " & GetSystemLanguage(LangID)
MsgBox "Votre système est en : " & GetSystemLanguage(LangName)Public Declare Function GetKeyState Lib "user32" (ByVal iVirtualKey As Integer) As Long
Public Function Is_Majuscule() As Boolean
Is_Majuscule = (&H1 And GetKeyState(vbKeyCapital)) <> 0
End FunctionLa fonction Is_Majuscule renvoie true si le clavier est en majuscule, false sinon.
Private Type KeyboardBytes
kbByte(0 To 255) As Byte
End Type
Enum apiOnOff
apiOn = 1
apiOff = 0
End Enum
Dim kbArray As KeyboardBytes
Private Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
Private Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
Private Sub ChangerCapsLock(v As apiOnOff)
GetKeyboardState kbArray
kbArray.kbByte(&H14) = v
SetKeyboardState kbArray
End SubUtiliser sous la forme pour désactiver :
ChangerCapsLock apiOffou, pour activer :
ChangerCapsLock apiOn
A partir de Windows 2000, vous pouvez retrouver facilement les variables d'environnement du système à l'aide de l'astuce suivante :
(retourne dans la fenêtre d'exécution, toutes les variables d'environnement avec leur nom et leur valeur)
Dim i As Integer
For i = 1 To 255
If Environ(i) <> "" Then Debug.Print Environ(i)
NextDans un projet, vous pouvez utiliser, par exemple, le nom de la variable d'environnement dans votre code pour en extraire sa valeur :
MsgBox Environ("USERNAME")'le paramètre /c indique que la console Dos doit se fermer sitôt l'exécution de la commande terminée.
Shell "command.com /c dir *.* > c:\liste.txt"Utilisez la fonction Shell. Vous pouvez indiquer dans le deuxième paramètre comment la fenêtre du programme doit s'afficher (si elle doit rester invisible, ou s'afficher normalement, ou en prenant tout l'écran, etc...).
Dim ret As Long
ret = Shell("notepad.exe", vbNormalFocus)Lien : Comment ouvrir un fichier HTML, Word ou autre en utilisant l'exécutable associé ?
Vous trouverez une méthode possible dans le code source ci-dessous. La procédure KillApp() ferme le programme dont l'identifiant est passé en paramètre. Vous pouvez utiliser la valeur renvoyée par la fonction Shell().
La seule ligne contenue dans la procédure KillApp() a pour effet d'énumérer toutes les fenêtres ouvertes, et d'appeler pour chacune d'entre-elles la fonction CloseWindow().
La fonction CloseWindow() regarde si la fenêtre en cours appartient au processus que l'on doit fermer, et si elle contient un menu Système (menu qui apparaît quand on clique sur l'icône de la fenêtre). Si c'est le cas, elle ferme la fenêtre.
Insérez ce code dans un module standard:
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, _
lpdwprocessid As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Const WM_CLOSE = &H10
Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000
Private Function CloseWindow(ByVal hwnd As Long, ByVal hInstance As Long) As Long
Dim idproc As Long
idproc = 0
'reçoit dans idproc l'id du processus lié à cette fenêtre
GetWindowThreadProcessId hwnd, idproc
If (idproc = hInstance) And ((GetWindowLong(hwnd, GWL_STYLE) And WS_SYSMENU) = WS_SYSMENU) Then
PostMessage hwnd, WM_CLOSE, 0, 0
End If
'obligatoire pour qu'EnumWindows continue l'énumération
CloseWindow = True
End Function
Public Sub KillApp(hInstance As Long)
EnumWindows AddressOf CloseWindow, hInstance
End SubCertains programmes n'acceptent pas d'être ouverts plusieurs fois en même temps. Pour cela, ils commencent par chercher si une instance du programme est déjà en mémoire. Si c'est le cas, ils terminent l'instance qui vient d'être créée, et si une nouvelle fenêtre doit être ouverte, c'est l'ancienne instance qui le fait.
Avec ce code source vous ne pourrez donc pas, par exemple, fermer une fenêtre de l'explorateur Windows ouverte par Shell(), car le processus dont l'id vous est renvoyé est automatiquement fermé, et la nouvelle fenêtre est ouverte par l'instance qui était déjà en mémoire.
Lien : Comment tuer un processus en connaissant le nom de sa fenêtre ?
Il est possible de lister les processus actifs sur une machine en utilisant les fonctions de l'API Windows
Mais il existe une astuce beaucoup plus simple à l'aide d'un petit script WMI, utilisant la classe Win32_process (testé sur Windows 2000, XP)
Private Sub Command1_Click()
Dim svc As Object
Dim sQuery As String
Dim oproc
On Error GoTo Command1_Click_Error
Set svc = GetObject("winmgmts:root\cimv2")
sQuery = "select * from win32_process"
For Each oproc In svc.execquery(sQuery)
Debug.Print oproc.Name & " = " & oproc.ExecutablePath
Next
Set svc = Nothing
Exit Sub
Command1_Click_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
Err.Clear
End Sub
Retrouvez toutes les informations sur la classe Win32_process (propriétés et méthodes) sur le site de Microsoft MSDN : Win32_Process WMI class
Attention, certaines propriétés ne sont pas implémentées. Lire attentivement les descriptions et explications fournies sur le site !
Lien : Comment "tuer" un processus en mémoire (Win2000 et >)?
Lien : Microsoft MSDN : WMI Scripting Primer: Part 1
En complément de la question précédente, il est possible d'arrêter un processus par le code, en le détruisant directement dans la liste des processus actifs de Windows
Public Function KillProcess(ByVal ProcessName As String) As Boolean
Dim svc As Object
Dim sQuery As String
Dim oproc
Set svc = GetObject("winmgmts:root\cimv2")
sQuery = "select * from win32_process where name='" & ProcessName & "'"
For Each oproc In svc.execquery(sQuery)
oproc.Terminate
Next
Set svc = Nothing
End FunctionExemple pour Acrobat Reader :
KillProcess "AcroRd32.exe"Lien : Comment lister les processus actifs sans utiliser l'API Windows (Win2000 et >) ?
Lien : Microsoft MSDN : WMI Scripting Primer: Part 1
Il faut utiliser l'API Windows et plus particulièrement la fonction LockStation
Dans un module :
Private Declare Function LockWorkStation Lib "user32.dll" () As Long
Public Sub Verrouiller()
LockWorkStation
End SubIl suffit alors d'appeler la méthode Verrouiller là où vous en avez besoin.
Pour cela, il faut utiliser l'API ExitWindowsEx.
Dans un module placer les déclarations suivantes :
Public Const EWX_LOGOFF = 0
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long)
La constante LOGOFF ferme la session, SHUTDOWN arrête la machine, REBOOT redémarre. La constante FORCE peut être utiliser en addition d'une des 3 autres afin de forcer l'arrêt des applications sans demande de confirmation de sortie.
Exemple pour arrêter l'ordinateur :
ExitWindowsEx(EWX_SHUTDOWN, 0)La même chose en forçant l'arrêt des applications :
ExitWindowsEx(EWX_SHUTDOWN OR EWX_FORCE, 0)
Pour réduire une fenêtre d'une application , il faut passer par des API
ces déclarations sont à mettre au début du module :
' Déclarations
Const WM_SYSCOMMAND As Long = &H112
Const SC_MINIMIZE As Long = &HF020&
Const SC_MAXIMIZE As Long = &HF030&
Const SC_RESTORE As Long = &HF120&
Private Declare Function PostMessage Lib "User32.dll" Alias "PostMessageA" ( _
ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow1 Lib "User32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As Long, ByVal lpWindowName As String) As Long
Il faut utiliser la fonction suivante pour fermer la fenêtre, celle-ci fonctionne
avec le titre de la fenêtre à réduire :
Function AppMinimize(AppTitle As String) As Boolean
Dim hwnd As Long
hwnd = FindWindow1(0, AppTitle & vbNullChar)
If hwnd <> 0 Then
PostMessage hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0
AppMinimize = True
Else
AppMinimize = False ' Fenêtre pas trouvée
End If
End Function
Pour comprendre le fonctionnement vous pouvez faire un essai avec le Bloc-notes, ouvrez Bloc-notes, la fenêtre s'appelle : "Sans titre - Bloc-Notes".
mettez ce code sur un événement de votre choix :
Sub quicktest()
Dim AppTitle As String, tmr As Long
AppTitle = "Sans titre - Bloc-Notes"
AppActivate AppTitle
tmr = Timer
While ((Timer - tmr) < 2)
Wend
AppMinimize AppTitle
End Sub
Ouvrez votre Application en pleine fenêtre et la fenêtre Bloc-notes
en niveau inférieur, sur appel du code ci-dessus la fenêtre Bloc-notes se réduira après timer écoulé.
Dans le même esprit que les questions précédentes, il est possible, par un script WMI, de lister et d'intervenir sur les services Windows, à l'aide des propriétés et méthodes de la classe Win32_Service :
Exemple pour lister tous les services actifs et leur état (activé ou stoppé) :
Dim svc As Object
Dim sQuery As String
Dim oserv
On Error GoTo Command1_Click_Error
Set svc = GetObject("winmgmts:root\cimv2")
sQuery = "select * from win32_service"
For Each oserv In svc.execquery(sQuery)
Debug.Print oserv.Name & " : " & oserv.PathName & " : " & oserv.State
Next
Set svc = Nothing
Exit Sub
Command1_Click_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
Err.ClearRetrouvez toutes les informations sur la classe Win32_Service (propriétés et méthodes) sur le site de Microsoft MSDN : Win32_Service WMI class
Lien : Comment lister les processus actifs sans utiliser l'API Windows (Win2000 et >) ?
Lien : Microsoft MSDN : WMI Scripting Primer: Part 1
Toujours à l'aide d'un script WMI utilisant la classe Win32_processor :
Private Sub Command1_Click()
Dim svc As Object
Dim oproc
On Error GoTo Command1_Click_Error
Set svc = GetObject("winmgmts:root\cimv2")
For Each oproc In svc.execquery("select * from Win32_Processor ")
Debug.Print oproc.Name & " = " & oproc.ProcessorId
Next
Set svc = Nothing
Exit Sub
Command1_Click_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
Err.Clear
End SubRetrouvez toutes les informations sur la classe Win32_processor (propriétés et méthodes) sur le site de Microsoft MSDN : Win32_Processor WMI class
Le code suivant est assez similaire à celui de la question précédente, la différence résidant dans le fait que vous ne connaissez pas l'identifiant du processus mais juste le titre de la fenêtre.
Ce code doit être placé dans un module standard. Le principe utilisé est celui d'une énumération à l'aide d'un callback classique : la fonction EnumWindows énumère toutes les fenêtres ouvertes et appelle la fonction EnumCallback pour chacune d'entre elles. Celle-ci ferme la fenêtre si son titre contient l'expression recherchée.
Declare Function EnumWindows Lib "user32" (ByVal wndenmprc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Public Const WM_CLOSE = &H10
Private AppCible As String
Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long
Dim buf As String * 256
Dim Titre As String
Dim Longueur As Long
'Récupère le titre de la fenêtre
Longueur = GetWindowText(app_hWnd, buf, Len(buf))
Titre = Left$(buf, Longueur)
'Vérifie si le titre de la fenêtre correspond au nom recherché
If InStr(Titre, AppCible) <> 0 Then
'Ferme la fenêtre
SendMessage app_hWnd, WM_CLOSE, 0, 0
End If
'Poursuit l'énumération
EnumCallback = 1
End Function
Public Sub KillApp(App_Cherchee As String)
AppCible = App_Cherchee
'Demande à Windows d'énumérer les fenêtres ouvertes
EnumWindows AddressOf EnumCallback, 0
End SubUn appel du type KillApp "Excel" fermera Microsoft Excel. Attention d'éviter l'utilisation de termes trop simples pouvant se trouver dans le titre d'une fenêtre d'une autre application.
Lien : Comment fermer un programme ouvert avec la fonction Shell ?
Les fichiers .ini sont des fichiers texte utilisés pour enregistrer les options d'un programme. Ils sont composés de sections, qui contiennent des clés auxquelles on peut donner une valeur. Par exemple :
[Affichage]
State=Maximized
Left=50
Top=80
[Sauvegarde]
Confirm=True
Auto=FalsePour pouvoir respectivement lire et écrire dans un fichier .ini, voici les déclarations que vous devez ajouter dans votre module :
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, _
ByVal lpFileName As String) As LongVoici ci-dessous la fonction qui écrira une valeur pour la clé et dans la section indiquée. Notez que vous n'avez pas besoin de créer le fichier s'il n'existe pas, car la fonction WritePrivateProfileString le fait pour vous.
Private Function EcritDansFichierIni(Section As String, Cle As String, _
Valeur As String, Fichier As String) As Long
EcritDansFichierIni = WritePrivateProfileString(Section, Cle, Valeur, Fichier)
End FunctionEt voyons maintenant la fonction qui nous retournera la valeur d'une clé dans une section donnée. ValeurParDefaut contient la valeur qui devra nous être retournée si le fichier n'existe pas, ou si aucune valeur n'a été spécifiée pour la clé demandée :
Private Function LitDansFichierIni(Section As String, Cle As String, Fichier As String, _
Optional ValeurParDefaut As String = "") As String
Dim strReturn As String
strReturn = String(255, 0)
GetPrivateProfileString Section, Cle, ValeurParDefaut, strReturn, Len(strReturn), Fichier
LitDansFichierIni = Left(strReturn, InStr(strReturn, Chr(0)) - 1)
End FunctionLe code nécessaire pour écrire la section [Affichage] du fichier donné en exemple sera :
EcritDansFichierIni "Affichage", "State", "Maximized", "c:\config.ini"
EcritDansFichierIni "Affichage", "Left", "50", "c:\config.ini"
EcritDansFichierIni "Affichage", "Top", "80", "c:\config.ini"Et nous pourrons lire la valeur donnée à la clef "Left" avec :
LeftParam = LitDansFichierIni("Affichage", "Left", "c:\config.ini", 100)Lien : Comment lister toutes les sections d'un fichier .ini ?
Lien : Comment lister toutes les clés et valeurs d'une section d'un fichier .ini ?
Déclaration :
Private Declare Function GetPrivateProfileSectionNames Lib "kernel32.dll" Alias "GetPrivateProfileSectionNamesA" _
(ByVal lpszReturnBuffer As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Paramètre lpszReturnBuffer : adresse d'un tampon qui va recevoir la ou les sections du fichier .ini.
Chaque nom de section est terminé par un caractère null (Chr(0)=vbNullChar), le dernier est suivi d'un second caractère null.
Private Function ListeSectionIni(ByVal Path As String, Section() As String)
Dim strReturn As String
strReturn = String(8192, 0)
GetPrivateProfileSectionNames strReturn, Len(strReturn), Path
Section = Split(Left(strReturn, InStr(1, strReturn, vbNullChar & vbNullChar) - 1), vbNullChar)
End Function
Private Sub Command1_Click()
Dim Section() As String
ListeSectionIni "C:\test.ini", Section '-- Paramètre Section passé ByRef
For Index = LBound(Section) To UBound(Section)
Debug.Print Section(Index)
Next
End SubLien : Comment lire / écrire dans un fichier .ini ?
Lien : Comment lister toutes les clés et valeurs d'une section d'un fichier .ini ?
Déclaration :
Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" _
(ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Paramètre lpReturnedString : adresse d'un tampon qui va recevoir la ou les clés et valeurs de la section du fichier .ini.
Chaque clé est terminée par un caractère null (Chr(0)=vbNullChar), la dernière est suivi d'un second caractère null.
Public Function ListeSectionKey(ByVal Path As String, ByVal Section As String, Key() As String)
Dim strReturn As String
strReturn = String(8192, 0)
GetPrivateProfileSection Section, strReturn, 8192, Path
Key = Split(Left(strReturn, InStr(1, strReturn, vbNullChar & vbNullChar) - 1), vbNullChar)
End Function
Private Sub Command1_Click()
Dim Key() As String
ListeSectionKey "C:\test.ini", "SectionName1", Key '-- le paramètre Key est passé byRef
For Index = LBound(Key) To UBound(Key)
Debug.Print Key(Index)
Next
End SubLien : Comment lister toutes les sections d'un fichier .ini ?
Lien : Comment lire / écrire dans un fichier .ini ?
Placez cette déclaration dans le module d'une form :
Private 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 LongLa ligne suivante affiche le site Developpez.com dans le navigateur par défaut, en fournissant le répertoire de votre application comme répertoire par défaut :
ShellExecute Me.hwnd, "open", "http://www.developpez.com", "", App.Path, 1Dim x As Long, y As Long
x = Screen.Width / Screen.TwipsPerPixelX 'résolution horizontale
y = Screen.Height / Screen.TwipsPerPixelY 'verticaleCopiez ce code source dans un module. Vous pourrez alors changer la résolution par un simple appel à la procédure ResolutionEcran(). Pour passer par exemple à une résolution de 800 x 600 :
ResolutionEcran 800, 600Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" _
(ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" _
(lpDevMode As Any, ByVal dwflags As Long) As Long
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Const DM_WIDTH = &H80000
Private Const DM_HEIGHT = &H100000
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Public Sub ResolutionEcran(sgWidth As Long, sgHeight As Long)
Dim blTMP As Boolean, lgTMP As Long, dmEcran As DEVMODE, res As Long
lgTMP = 0
Do
blTMP = EnumDisplaySettings(0, lgTMP, dmEcran)
lgTMP = lgTMP + 1
Loop While blTMP <> 0
dmEcran.dmFields = DM_WIDTH Or DM_HEIGHT
dmEcran.dmPelsWidth = sgWidth
dmEcran.dmPelsHeight = sgHeight
lgTMP = ChangeDisplaySettings(dmEcran, 0)
End SubSous Windows, toutes les fenêtres des applications reçoivent le message WM_DISPLAYCHANGE quand la résolution a changé. Le principe consiste donc à intercepter ce message grâce au sousclassement.
Copiez ce code source dans le module de la form.
Private Sub Form_Load()
'Remplace la procédure de fenêtre par défaut par notre propre procédure
oldWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Remet la procédure de fenêtre par défaut
SetWindowLong hwnd, GWL_WNDPROC, oldWndProc
End SubEt celui-ci dans un module standard.
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public oldWndProc As Long
Private 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
Private Const WM_DISPLAYCHANGE = &H7E
Public Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If msg = WM_DISPLAYCHANGE Then
'la résolution a changé
End If
'Appelle la procédure de fenêtre par défaut pour que Windows puisse traiter l'évènement
WindowProc = CallWindowProc(oldWndProc, hwnd, msg, wParam, lParam)
End FunctionAttention, la procédure Form_Unload doit obligatoirement être exécutée. Si vous déboguez et cliquez sur Stop, l'éditeur VB plantera. Si vous fermez votre programme avec l'instruction End, la procédure Form_Unload ne sera pas exécutée et votre programme plantera.
Les polices disponibles à l'écran et à l'impression sont respectivement dans la collection Fonts de l'objet Screen et dans la collection Fonts de l'objet Printer. Le code source ci-dessous montre comment remplir une combo box avec les polices disponibles à l'écran.
Dim i As Long
For i = 0 To Screen.FontCount - 1
Combo1.AddItem Screen.Fonts(i)
NextPlacez cette ligne dans la partie Déclarations d'un module :
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Vous pourrez ainsi faire une pause de 2 secondes avec l'appel suivant :
Sleep 2000Les paramètres régionaux s'obtiennent grâce à la fonction GetLocaleInfo() de l'API Windows. Les paramètres de cette fonction sont :
locale : identifiant représentant le type d'information locale demandé (système ou utilisateur)
LCType : valeur indiquant quel paramètre doit être retrouvé. Ce doit être une des constantes LCTYPE
lpLCData : buffer recevant la valeur du paramètre demandé
cchData : longueur du buffer
Voici les déclarations des deux fonctions dont vous aurez besoin, ainsi que quelques-unes des constantes LCTYPE disponibles :
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal locale As Long, _
ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
Private Const LOCALE_IDATE = &H21 'format de date courte : 0 = M-J-A, 1 = J-M-A, 2 = A-M-J
Private Const LOCALE_ILDATE = &H22 'format de date longue
Private Const LOCALE_SCOUNTRY = &H6 'pays en toutes lettres
Private Const LOCALE_SNATIVELANGNAME = &H4 'langue, en toutes lettres
Private Const LOCALE_STHOUSAND = &HF 'séparateur des milliers
Private Const LOCALE_SDECIMAL = &HE 'séparateur décimalLa fonction ci-dessous renvoie la valeur du paramètre régional dont la constante LCTYPE est passée en paramètre :
Private Function ParametreRegional(parametre As Long) As String
Dim lngResultat As Long
Dim buffer As String
Dim pos As Integer
Dim locale As Long
'récupère l'identifiant de l'information locale de type utilisateur
locale = GetUserDefaultLCID()
'renvoie le nombre de caractères nécessaire pour recevoir la valeur du paramètre demandé
lngResultat = GetLocaleInfo(locale, parametre, buffer, 0)
buffer = String(lngResultat, 0)
GetLocaleInfo locale, parametre, buffer, lngResultat
pos = InStr(buffer, Chr(0))
If pos > 0 Then ParametreRegional = Left(buffer, pos - 1)
End FunctionPrivate Const RESOURCETYPE_ANY = &H0
Private Const RESOURCE_CONNECTED = &H1
Private Type NETRESOURCE
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
lpLocalName As Long
lpRemoteName As Long
lpComment As Long
lpProvider As Long
End Type
Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long, _
ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, _
lpBuffer As Any, lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Function LetterToUNC(DriveLetter As String) As String
Dim hEnum As Long
Dim NetInfo(1023) As NETRESOURCE
Dim entries As Long
Dim nStatus As Long
Dim LocalName As String
Dim UNCName As String
Dim i As Long
Dim r As Long
' Begin the enumeration
nStatus = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0&, ByVal 0&, hEnum)
LetterToUNC = DriveLetter
'Check for success from open enum
If ((nStatus = 0) And (hEnum <> 0)) Then
' Set number of entries
entries = 1024
' Enumerate the resource
nStatus = WNetEnumResource(hEnum, entries, NetInfo(0), CLng(Len(NetInfo(0))) * 1024)
' Check for success
If nStatus = 0 Then
For i = 0 To entries - 1
' Get the local name
LocalName = ""
If NetInfo(i).lpLocalName <> 0 Then
LocalName = Space(lstrlen(NetInfo(i).lpLocalName) + 1)
r = lstrcpy(LocalName, NetInfo(i).lpLocalName)
End If
' Strip null character from end
If Len(LocalName) <> 0 Then
LocalName = Left(LocalName, (Len(LocalName) - 1))
End If
If UCase$(LocalName) = UCase$(DriveLetter) Then
' Get the remote name
UNCName = ""
If NetInfo(i).lpRemoteName <> 0 Then
UNCName = Space(lstrlen(NetInfo(i).lpRemoteName) + 1)
r = lstrcpy(UNCName, NetInfo(i).lpRemoteName)
End If
' Strip null character from end
If Len(UNCName) <> 0 Then
UNCName = Left(UNCName, (Len(UNCName) - 1))
End If
' Return the UNC path to drive
'added the [] to seperate on printout only
LetterToUNC = UNCName
' Exit the loop
Exit For
End If
Next i
End If
End If
' End enumeration
nStatus = WNetCloseEnum(hEnum)
End FunctionAppelez la fonction directement comme ceci :
LetterToUNC("E:")et elle renvoie :
\\hp-ux004\oracle
Voici deux solutions possibles. Tout d'abord, les fonctions de l'API Windows :
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As LongCes 3 fonctions de l'API Win32 renvoient respectivement les chemins complets des répertoires Windows, System, et Windows\Temp. Elles s'utilisent toutes les 3 de la même manière :
Function GetWindowsDir() As String
Dim buffer As String * 256
Dim Length As Long
Length = GetWindowsDirectory(buffer, Len(buffer))
GetWindowsDir = Left(buffer, Length)
End Function
Function GetSystemDir() As String
Dim buffer As String * 256
Dim Length As Long
Length = GetSystemDirectory(buffer, Len(buffer))
GetSystemDir = Left(buffer, Length)
End Function
Function GetTempDir() As String
Dim buffer As String * 256
Dim Length As Long
Length = GetTempPath(Len(buffer), buffer)
GetTempDir = Left(buffer, Length)
End FunctionUne autre manière de procéder est de faire appel au FileSystemObject :
Dim fso As FileSystemObject
Set fso = New FileSystemObject
MsgBox fso.GetSpecialFolder(0) 'répertoire windows
MsgBox fso.GetSpecialFolder(1) 'répertoire system
MsgBox fso.GetSpecialFolder(2) 'répertoire temp
Set fso = Nothing
End SubPour récupérer les chemins complets des répertoires du Bureau, de Mes Documents, ou du menu Démarrer, vous pouvez utiliser la fonction SHGetSpecialFolderPath de l'Api Windows :
Private Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" _
(ByVal hwndOwner As Long, ByVal lpszPath As String, _
ByVal nFolder As Long, ByVal fCreate As Long) As LongDescription des paramètres :
hwndOwner : handle de la fenêtre à utiliser si une boîte de dialogue doit être affichée
lpszPath : chaîne de caractères recevant le chemin complet du répertoire demandé
nFolder : nombre indiquant le répertoire demandé
fCreate : si la valeur passée à ce paramètre n'est pas nulle, le répertoire est créé, s'il n'existe pas déjà
Sous Windows NT 4.0 et Windows 95, cette fonction n'est disponible que si Internet Explorer 4.0 ou supérieur est installé. Voyons comment l'utiliser :
Public Function GetSpecialFolderPath(dossier As Long, hwnd As Long)
Dim buffer As String
buffer = Space(256)
SHGetSpecialFolderPath hwnd, buffer, dossier, 0
GetSpecialFolderPath = Left(buffer, InStr(buffer, Chr(0)) - 1)
End FunctionPour tester cette fonction, placez par exemple ces 3 lignes dans une procédure du module d'une form :
MsgBox GetSpecialFolderPath(0, Me.hwnd) 'répertoire du Bureau
MsgBox GetSpecialFolderPath(5, Me.hwnd) 'répertoire Mes Documents
MsgBox GetSpecialFolderPath(11, Me.hwnd) 'répertoire du menu DémarrerLes réfractaires aux Api Windows préfèreront utiliser le Windows Script Host Object Model en ajoutant wshom.ocx aux références du projet. Les chemins complets des répertoires spéciaux sont dans la collection SpecialFolders de l'objet WshShell.
Dim Wsh As WshShell
Set Wsh = New WshShell
MsgBox Wsh.SpecialFolders.Item("Desktop") 'répertoire du Bureau
MsgBox Wsh.SpecialFolders.Item("MyDocuments") 'répertoire Mes Documents
MsgBox Wsh.SpecialFolders.Item("StartMenu") 'répertoire du menu Démarrer
Set WshShell = nothing
End SubNota : Avec les anciennes versions de Wshom.ocx, la classe WshShell s'appelle IWshShell_Class.
ou encore :
Set WshShell = CreateObject("Wscript.Shell")
MsgBox WshShell.SpecialFolders("Desktop")
MsgBox WshShell.SpecialFolders("MyDocuments")
MsgBox WshShell.SpecialFolders("StartMenu")
Set WshShell = nothingLa fonction VersionWindows() de ce code source retourne la version de Windows et place dans le paramètre sp le service pack qui serait éventuellement installé.
Private Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Public Function VersionWindows(ByRef sp As String) As String
Dim os As OSVERSIONINFO
os.dwOSVersionInfoSize = Len(os)
GetVersionExA os
sp = ""
With os
Select Case .dwPlatformId
Case VER_PLATFORM_WIN32_WINDOWS
Select Case .dwMinorVersion
Case 0
VersionWindows = "95"
Case 10
VersionWindows = "98"
Case 90
VersionWindows = "Me"
End Select
Case VER_PLATFORM_WIN32_NT
Select Case .dwMajorVersion
Case 3
VersionWindows = "NT 3.51"
Case 4
VersionWindows = "NT 4.0"
Case 5
If .dwMinorVersion = 0 Then
VersionWindows = "2000"
Else
VersionWindows = "XP"
End If
End Select
End Select
If InStr(.szCSDVersion, Chr(0)) > 0 Then
sp = Left(.szCSDVersion, InStr(.szCSDVersion, Chr(0)) - 1)
End If
End With
End FunctionLien : Comment savoir si mon application VB6 et exécutée sous Windows VISTA ?
En utilisant la méthode décrite ici :
Comment connaître la version de Windows sur laquelle mon application est exécutée ?
Grâce à la fonction GetVersionExA, la variable de type OSVERSIONINFO, retourne pour sa propriété : dwMajorVersion = 6 lorsque le systéme d'exploitation et Vista où Windows Serveur 2008.
Pour obtenir plus d'informations il faut passer par la fonction "étendue" de GetVersion, et le type de donnée OSVERSIONINFOEX, dont la propriété wProductType prends la valeur 1 pour les systémes d'exploitation de type station de travail (Vista, XP , 2000)
Private Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFOEX) As Integer
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32_NT = 2
'wProductType
Private Const VER_NT_WORKSTATION = 1 'Windows Vista, Windows XP Professional, Windows XP Home Edition, or Windows 2000 Professional
Private Const VER_NT_DOMAIN_CONTROLLER = 2 'Controleur de domaine sous Windows Serveur 2008,2003 ou 2000
Private Const VER_NT_SERVER = 3 'Windows Serveur 2008 , 2003 or 2000
Private Type OSVERSIONINFOEX
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
wServicePackMajor As Integer
wServicePackMinor As Integer
wSuiteMask As Integer
wProductType As Byte
wReserved As Byte
End Type
Public Function VersionWindows(ByRef sp As String) As String
Dim os As OSVERSIONINFOEX
os.dwOSVersionInfoSize = Len(os)
GetVersionExA os
sp = ""
With os
Select Case .dwPlatformId
Case VER_PLATFORM_WIN32_WINDOWS
Select Case .dwMinorVersion
Case 0
VersionWindows = "95"
Case 10
VersionWindows = "98"
Case 90
VersionWindows = "Me"
End Select
Case VER_PLATFORM_WIN32_NT
Select Case .dwMajorVersion
Case 3
VersionWindows = "NT 3.51"
Case 4
VersionWindows = "NT 4.0"
Case 5
If .dwMinorVersion = 0 Then
VersionWindows = "2000"
Else
VersionWindows = "XP"
End If
Case 6
If .wProductType = VER_NT_WORKSTATION Then
VersionWindows = "Vista"
Else
VersionWindows = "Windows Server 2008"
End If
End Select
End Select
If InStr(.szCSDVersion, Chr(0)) > 0 Then
sp = Left(.szCSDVersion, InStr(.szCSDVersion, Chr(0)) - 1)
End If
End With
End FunctionLien : OSVERSIONINFOEX Structure
Ajoutez la référence Windows Script Host Object Model (wshom.ocx) à votre projet.
Dim Wsh As New WshShell
DesktopPath = Wsh.SpecialFolders("Desktop")
Set Shortcut = Wsh.CreateShortcut(DesktopPath & "\Test.lnk")
With Shortcut
.TargetPath = App.EXEName
.Description = "Mon Programme"
.WindowStyle = 4
.Save
End WithAvec les anciennes versions de Wshom.ocx, la classe WshShell s'appelle IWshShell_Class.
Première possibilité, l'api GetVolumeInformation, dont voici la déclaration :
Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" _
(ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, _
ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongCette fonction, qui permet d'obtenir diverses informations à propos d'un lecteur, s'utilise très simplement. Ces quelques lignes affichent le numéro de série du lecteur C :
Dim numero As Long
GetVolumeInformation "c:\", "", 0, numero, 0, 0, "", 0
MsgBox numeroMais vous pouvez obtenir cette même information avec le FileSystemObject :
Dim fso As FileSystemObject
Set fso = New FileSystemObject
MsgBox fso.Drives("c").SerialNumber
Set fso = NothingVous trouverez un exemple pas à pas avec le code source dans le Howto de MSDN.
Copiez ce code dans un module standard :
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
(ByVal lpApplicationName As Long, ByVal lpCommandLine As String, _
ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
'Type pour gérer les lancements de processus
Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
'Info sur un processus
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const STILL_ACTIVE = &H103&
Public Sub AttendreFinProcess(proc As PROCESS_INFORMATION, Optional timeout As Long = 60)
Dim Ret As Long
Dim tms As Single
Dim exitcode As Long
'Attendre la fin de la commande
tms = Timer
Ret = GetExitCodeProcess(proc.hProcess, exitcode)
Do While Ret <> 0 And exitcode = STILL_ACTIVE
Ret = GetExitCodeProcess(proc.hProcess, exitcode)
DoEvents
Sleep 100
If Timer - tms > timeout Then
Err.Raise STILL_ACTIVE, "AttendreFinProcess", "Timeout sur l'attente de la fin d'un process"
End If
Loop
If Ret = 0 Then
Err.Raise Err.LastDllError, "AttendreFinProcess", "Erreur systeme N° " & Err.LastDllError
End If
End Sub
Public Sub LancerProcess(sExe As String, proc As PROCESS_INFORMATION)
Dim start As STARTUPINFO
Dim Ret As Long
'StartupInfo pour le processus qui lancera la commande
start.cb = Len(start)
'Lancement de la commande
Ret& = CreateProcess(0&, sExe, 0&, 0&, 0&, NORMAL_PRIORITY_CLASS, 0&, 0, start, proc)
If Ret = 0 Then
Err.Raise Err.LastDllError, "LancerProcess", "Erreur systeme N° " & Err.LastDllError
End If
End SubCréez une form et placez-y un bouton nommé Command1. Puis copiez ce code dans le module de la form :
Private Sub Command1_Click()
Dim proc As PROCESS_INFORMATION
On Error GoTo errortag
proc.hProcess = -1
proc.hThread = -1
Debug.Print "Debut du processus"
Call LancerProcess("notepad", proc)
Call AttendreFinProcess(proc)
Debug.Print "fin du processus"
Call CloseHandle(proc.hProcess)
Call CloseHandle(proc.hThread)
Exit Sub
errortag:
If proc.hProcess <> -1 Then CloseHandle proc.hProcess
If proc.hThread <> -1 Then CloseHandle proc.hThread
MsgBox Err.Number & " - " & Err.Description
End SubLa fonction AttendreFinProcess() attend la fin d'un processus tant que le temps indiqué par le paramètre timeout n'est pas écoulé.
Exécutez le projet et cliquez sur le bouton de commande. Le Notepad se lance. Lorsque vous le fermez, la console de débuggage affiche "fin du processus".
Copiez cette déclaration au début d'un module standard :
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpbuffer As String, nSize As Long) As LongCopiez ensuite cette fonction dans votre module : (pour Win 98)
Private Function NomUtilisateur() As String
Dim sUserName As String
Dim iSize As Long
'Un premier appel pour avoir le nombre de caractères nécéssaire pour sUserName
GetUserName sUserName, iSize
'On met sUserName à la bonne taille
sUserName = Space(iSize)
'Appel final
GetUserName sUserName, iSize
NomUtilisateur = sUserName
End FunctionPS : On aurait aussi pu déclarer sUsername avec une taille assez grande (dim sUserName as string*32). Un seul appel de GetUserName aurait alors suffit
Pour Windows 2000 et supérieur :
Dim NomUtilisateur As String
NomUtilisateur = Environ("USERNAME")Lien : Comment déterminer les variables d'environnement du système (Windows 2000 et +) ?
Utilisez la fonction IsNTAdmin de l'API advpack.dll
Private Declare Function IsNTAdmin Lib "advpack.dll" (ByVal dwReserved As Long, ByRef lpdwReserved As Long) As Long
Public Sub VerifieSiAdmin()
If CBool(IsNTAdmin(ByVal 0&, ByVal 0&)) = True Then
MsgBox "Vous êtes Administrateur de ce poste"
Else
MsgBox "Vous n'êtes pas Administrateur de ce poste"
End If
End SubVous pouvez accéder au presse-papiers via l'objet Clipboard.
Les imprimantes installées sont contenues dans la collection Printers. L'imprimante sélectionnée pour l'impression est représentée par l'objet Printer.
Nous allons voir deux méthodes différentes permettant à l'utilisateur de sélectionner une imprimante.
La première est très simple et s'appuie sur le Common Dialog Control. Cochez-le dans les composants du projet et placez-en un sur une form. Il suffit de cette instruction pour afficher la boîte de dialogue standard de propriétés d'impression :
CommonDialog1.ShowPrinterLa boîte de dialogue une fois validée, les propriétés de l'objet Printer sont automatiquement modifiées afin de correspondre aux paramètres saisis par l'utilisateur.
La deuxième méthode n'utilise aucun composant. Son principe consiste à affecter à l'objet Printer le nom d'une des imprimantes installées. Copiez ce code source dans un module standard.
Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" _
(ByVal lpAppName As String, ByVal lpKeyName As String, _
ByVal lpDefault As String, ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
'Renvoie l'imprimante par défaut
Public Function ImprimanteParDefaut() As String
Dim def As String, di As Long
def = String(128, 0)
di = GetProfileString("WINDOWS", "DEVICE", "", def, 127)
If di Then ImprimanteParDefaut = Left$(def, di - 1)
End Function
'Sélectionne une imprimante
Public Function SelectionneImprimante(ByVal UneImprimante As String) As Boolean
Dim impr As Printer, ok As Boolean
'Il faut chercher dans la boucle l'imprimante correspondante
'et l'affecter à Printer
For Each impr In Printers
If impr.DeviceName = UneImprimante Then
Set Printer = impr
ok = True
Exit For
End If
Next
SelectionneImprimante = ok
End FunctionLa fonction SelectionneImprimante sélectionne l'imprimante dont le nom est passé en paramètre. Maintenant placez un bouton de commande et une ComboBox sur une form et placez le code ci-dessous dans le module de la form.
Private Sub Form_Load()
Dim ImpParDefaut As String, IdxImpParDefaut As Integer
Dim impr As Printer, i As Long, pos As Integer
'Récupère le nom de l'imprimante par défaut
ImpParDefaut = ImprimanteParDefaut()
'Enlève les informations qui suivent le nom de l'imprimante
pos = InStr(1, ImpParDefaut, ",", vbTextCompare)
If pos > 0 Then ImpParDefaut = Left(ImpParDefaut, pos - 1)
'Ajoute dans la combo box les imprimantes
IdxImpParDefaut = 0
i = 0
For Each impr In Printers
Combo1.AddItem impr.DeviceName
'Regarde si c'est celle par défaut et si oui retient son index
If impr.DeviceName = ImpParDefaut Then IdxImpParDefaut = i
i = i + 1
Next
'Sélectionne dans la combo l'imprimante par défaut
If Combo1.ListCount > 0 Then Combo1.ListIndex = IdxImpParDefaut
End Sub
Private Sub Command1_Click()
MsgBox "Avant : " & Printer.DeviceName
SelectionneImprimante Combo1.Text
MsgBox "Après : " & Printer.DeviceName
End SubLa ComboBox contient la liste des imprimantes installées. Au chargement de la form, l'imprimante par défaut est sélectionnée dans la combo.
Pour obtenir tous les paramètres relatifs à la mémoire, placez ce code dans un module standard :
Public Type MEMORYSTATUS
dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long
End Type
Public Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)Voici comment utiliser la fonction GlobalMemoryStatus :
Dim MS As MEMORYSTATUS
Dim chaine As String
MS.dwLength = Len(MS)
GlobalMemoryStatus MS
chaine = "Pourcentage RAM utilisé: " & Format$(MS.dwMemoryLoad, "###,###,###,###") & " %" & vbCrLf
'on divise toutes les valeurs par 1024 pour les convertir en Kilots-octets
chaine = chaine & "Taille de la mémoire physique totale: " & _
Format$(MS.dwTotalPhys / 1024, "###,###,###,###") & " Ko" & vbCrLf
chaine = chaine & "Mémoire physique disponible: " & _
Format$(MS.dwAvailPhys / 1024, "###,###,###,###") & " Ko" & vbCrLf
chaine = chaine & "Mémoire virtuelle totale: " & _
Format$(MS.dwTotalVirtual / 1024, "###,###,###,###") & " Ko" & vbCrLf
chaine = chaine & "Mémoire virtuelle disponible: " & _
Format$(MS.dwAvailVirtual / 1024, "###,###,###,###") & " Ko" & vbCrLfPrivate Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As Any, _
ByVal wReturnLength As Integer, ByVal hCallback As Integer) As Long
Public Sub Ejecte()
mciSendString "Set CDAudio Door Open Wait", 0&, 0, 0
End SubAjouter ces déclarations dans un module :
Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const SWP_HIDEWINDOW As Long = &H80
Private Const SWP_SHOWWINDOW As Long = &H40
Public Sub masquer()
Dim hwnd As Long
hwnd = FindWindow("Shell_traywnd", "")
SetWindowPos hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW
End Sub
Public Sub afficher()
Dim hwnd As Long
hwnd = FindWindow("Shell_traywnd", "")
SetWindowPos hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW
End SubListe non exhaustive des éléments du panneau de configuration :
- Administrateur de sources de données ODBC : Odbccp32.cpl
- Ajout/Suppression de Programmes : Appwiz.cpl
- Assistant Ajout de nouveau matériel : hdwwiz.cpl
- Comptes d'utilisateurs : nusrmgr.cpl
- Connexions Réseau : Ncpa.cpl
- Contrôleurs de jeu : joy.cpl
- Options D'accessibilité : Access.cpl
- Options d'alimentation : Ups.cpl/powercfg.cpl
- Options de modem et Téléphonie : Modem.cpl/Telephon.cpl
- Options Régionales et Linguistiques : Intl.cpl
- Propriétés d'affichage : Desk.cpl
- Propriétés de Date et Heure : Timedate.cpl
- Propriétés de la sourie : Main.cpl
- Propriétés Internet : Inetcpl.cpl
- Propriétés Son et Périphériques audio : Mmsys.cpl
- Propriétés système : Sysdm.cpl
Dim NomEl As String
NomEl = "Appwiz.cpl"
Shell "rundll32.exe shell32.dll,Control_RunDLL " & NomElPrivate Declare Function SHEmptyRecycleBin Lib "shell32.dll" Alias "SHEmptyRecycleBinA" ( _
ByVal hwnd As Long, _
ByVal pszRootPath As String, _
ByVal dwFlags As Long) As Long
'Annuuler la boite de dialogue de confirmation
Private Const SHERB_NOCONFIRMATION = &H1
'Annuler la boire de dialogue de progression de suppression
Private Const SHERB_NOPROGRESSUI = &H2
'Annuler le son à la fin de la suppression
Private Const SHERB_NOSOUND = &H4Pour appeler l'API :
SHEmptyRecycleBin 0, vbNullString, SHERB_NOCONFIRMATIONDéclarer les constantes comme suit :
Private Const SPI_SETSCREENSAVEACTIVE As Long = 17
Private Const VRAI As Long = 1
Private Const FAUX As Long = 0
Private Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" ( _
ByVal uAction As Long, _
ByVal uParam As Long, _
ByRef lpvParam As Any, _
ByVal fuWinIni As Long) As LongPour activer l'économiseur :
SystemParametersInfo spi_screensaveactive, VRAI, 0, 0Pour désactiver l'économiseur :
SystemParametersInfo spi_screensaveactive, FAUX, 0, 0
En utilisant l'API SendMessage.
Pour afficher l'écran de veille
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_SYSCOMMAND = &H112&
Const SC_SCREENSAVE = &HF140&
Private Sub CdEcranVeille_Click()
Dim lRes As Long
lRes = SendMessage(Form1.hWnd, WM_SYSCOMMAND, _
SC_SCREENSAVE, 0&)
End Sub
Pour éteindre l'écran :
'Pour les besoin de l'éxemple on utilise la fonction Sleep de l'API Kernel32
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_SYSCOMMAND = &H112&
Const SC_MONITORPOWER = &HF170&
Private Sub cdScreenPowerOff_Click()
Dim lRes As Long
Sleep (5000) 'Une pause de 5s
' Pour éteindre l'écran
lRes = SendMessage(Form1.hWnd, WM_SYSCOMMAND, _
SC_MONITORPOWER, 2&)
Sleep (5000) 'Une pause de 5s
' Pour afficher à nouveau l'écran.
lRes = SendMessage(Form1.hWnd, WM_SYSCOMMAND, _
SC_MONITORPOWER, -1&)
Debug.Print "Fin " & Now
End Sub
Pour Windows 2000 et supérieur :
Cette astuce permet de désactiver ou d'activer le gestionnaire des tâches à partir du code de votre programme et donc, d'inhiber la séquence de touches Ctrl-Alt-Suppr.
Lorsque le gestionnaire est désactivé, le système renvoie un message d'avertissement (A utiliser avec précaution) :
Désactiver :
Set WshShell = CreateObject("WScript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr", "1"
Set WshShell = NothingActiver :
Set WshShell = CreateObject("WScript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr", ""
Set WshShell = NothingDans un module :
'déclaration du type Rect
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Type TaskBarInformation
Left As Long 'Position par rapport au bord gauche de l'écran
Top As Long 'Position par rapport au haut de l'écran
Width As Long 'Largeur
Height As Long 'Hauteur
Position As Long 'Position : 1 ->En Haut
' 2 ->Droite
' 3 ->Bas
' 4 ->Gauche
End Type
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Public Function GetTaskBarInformation() As TaskBarInformation
Dim rctTemp As RECT
Dim tskTemp As TaskBarInformation
Dim intI As Integer, intJ As Integer
Dim hwnd As Long
With Screen
intI = .Width \ (.TwipsPerPixelX * 2)
intJ = .Height \ (.TwipsPerPixelY * 2)
End With
'Récupère le handle de la barre des taches
hwnd = FindWindow("Shell_traywnd", "")
'Récupère le rectangle de la barre des taches
GetWindowRect hwnd, rctTemp
'Calcule les dimensions
With tskTemp
.Left = rctTemp.Left
.Top = rctTemp.Top
.Width = rctTemp.Right - rctTemp.Left
.Height = rctTemp.Bottom - rctTemp.Top
If .Top > intJ Then
.Position = 3
ElseIf .Left > intI Then
.Position = 2
ElseIf .Top < intJ Then
.Position = 1
Else
.Position = 4
End If
End With
GetTaskBarInformation = tskTemp
End FunctionExemple d'utilisation :
Dim TskTest As TaskBarInformation
TskTest = GetTaskBarInformation
With TskTest
MsgBox "La position gauche est : " & .Left & vbCrLf & _
"La position haute est : " & .Top & vbCrLf & _
"La largeur est de : " & .Width & vbCrLf & _
"La hauteur est de : " & .Height & vbCrLf & _
"La position est : " & .Position
End WithNB : Les dimensions sont données en pixels
ce code vous permet de cacher et afficher le bouton démarrer, il suffit de placer 2 boutons sur ta form et ce code :
Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" (ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Sub StartButton(blnValue As Boolean)
Dim lngHandle As Long
Dim lngStartButton As Long
lngHandle = FindWindow("Shell_TrayWnd", "")
lngStartButton = FindWindowEx(lngHandle, 0, "Button", vbNullString)
If blnValue Then
ShowWindow lngStartButton, 5
Else
ShowWindow lngStartButton, 0
End If
End Sub
Private Sub Command1_Click()
StartButton (True)
End Sub
Private Sub Command2_Click()
StartButton (False)
End SubSi vous recherchez quel exécutable est associé à votre fichier, alors suivez le code ci-dessous :
Private Declare Function FindExecutableA Lib "shell32.dll" _
(ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
Public Const MAX_PATH = 256
Public Function FindExecutable(S As String) As String
'trouve quel executable ouvre le fichier cible
Dim i As Integer
Dim S2 As String
S2 = String(MAX_PATH, 32) & Chr$(0)
i = FindExecutableA(S & Chr$(0), vbNullString, S2)
If i > 32 Then
FindExecutable = Left$(S2, InStr(S2, Chr$(0)) - 1)
Else
FindExecutable = ""
End If
End Function


