Buscando información sobre cómo averiguar la velocidad del procesador que hay instalado en un equipo, me topé con los Shell Objects proporcionados para la librería Shell32.dll. Ésta dll se suele usar para acceder a funciones del API, pero no sabía yo que también era una librería ActiveX...
En este primer artículo vamos a ver los métodos proporcionados por el objeto Shell, así como un ejemplo de cómo usarlos.Según la MSDN Library, los objetos Shell representan los objetos en el Shell, (así como te lo cuento).
Este objeto proporciona métodos con los cuales se pueden hacer cosas como: seleccionar un directorio, minimizar todas las ventanas, mostrar el panel de control o cualquiera de sus componentes, reposicionar las ventanas abiertas, mostrar el diálogo de buscar, explorar, ejecutar, etc., etc., etc.Para poder usar dichos objetos en Visual Basic, hay que crear una referencia a la librería Shell32.dll, para ello, en el menú Proyecto/Referencias, selecciona Microsoft Shell Controls And Automation, si dicha referencia no se muestra, tendrás que usar el botón de examinar para buscar la librería, que suele estar en el directorio System o System32.
Algunos de los métodos usan como parámetro una cadena con un directorio, aunque también se le puede indicar un valor incluido en la enumeración ShellSpecialFoldersConstants, para indicarle que a lo que queremos acceder es a un directorio especial, tal como el Escritorio, Impresoras, etc.
En el código de ejemplo te muestro dicha enumeración para que te sea fácil usarla.Además de ver los métodos del objeto Shell, vamos a ver también el método GetSystemInformation accesible mediante la propiedad Application del susodicho objeto Shell.
Precisamente la única función que no funciona del método GetSystemInformation es precisamente lo que me llevó a buscar la información: saber la velocidad del procesador... en fin...Aquí tienes el código de ejemplo, en los cuales he dejado "la definición" de cada uno de los métodos en el idioma original de la MSDN Library... confío que no tendrás problemas para "entenderlos". A ver cuando se dignan la gente de Microsoft a darnos la información en nuestro propio idioma... que somos muchos los que nos comunicamos en la lengua de Cervantes...
Lista de los objetos del Shell explicados en esta página:
Objeto Explicación Application
GetSystemInformation
Varias funciones...
Ver el código de ejemplo
BrowseForFolder Seleccionar directorios (carpetas) CascadeWindows Muestra las ventanas en cascada TileHorzontally Anida las ventanas horizontalmente TileVertically Idem, pero verticalmente MinimizeAll Minimiza todas las ventanas UndoMinimizeAll Deshace minimizar todas las ventanas ControlPanelItem Ejecuta un elemento del panel de control EjectPC Desacopla un ordenador que está acoplado Explore Explora una carpeta FileRun Muestra el diálogo de ejecutar FindComputer Muestra el diálogo de buscar un equipo FindFiles Muestra el diálogo de buscar ficheros (archivos) Help Muestra la ayuda de Windows Namespace Devuelve una carpeta, (la creada con esta función) Open Abre una carpeta RefreshMenu Actualiza el menú de Inicio SetTime Muestra el diálogo de cambiar la fecha/hora ShutDownWindows Muestra el diálogo de apagar el equipo Suspend "Suspende" el equipo TryProperties Muestra el diálogo de configurar la barra de tareas Windows Crea y devuelve un objeto ShellWindows
'------------------------------------------------------------------------------ ' Ejemplo de cómo usar Shell Objects (07/Sep/01) ' ' Hay que añadir una referencia a: Microsoft Shell Controls And Automation ' Si dicha referencia no se muestra, ' tendrás que usar el botón de examinar para buscar la librería, ' que estará en el directorio System o System32. ' ' ©Guillermo 'guille' Som, 2001 '------------------------------------------------------------------------------ Option Explicit ' ' Objeto para manejar los Shell Objects Private oShell As Shell32.Shell Private Enum ShellSpecialFolderConstants ssfDESKTOP = &H0 ssfPROGRAMS = &H2 ssfCONTROLS = &H3 ssfPRINTERS = &H4 ssfPERSONAL = &H5 ssfFAVORITES = &H6 ssfSTARTUP = &H7 ssfRECENT = &H8 ssfSENDTO = &H9 ssfBITBUCKET = &HA ssfSTARTMENU = &HB ssfDESKTOPDIRECTORY = &H10 ssfDRIVES = &H11 ssfNETWORK = &H12 ssfNETHOOD = &H13 ssfFONTS = &H14 ssfTEMPLATES = &H15 ssfCOMMONSTARTMENU = &H16 ssfCOMMONPROGRAMS = &H17 ssfCOMMONSTARTUP = &H18 ssfCOMMONDESKTOPDIR = &H19 ssfAPPDATA = &H1A ssfPRINTHOOD = &H1B ssfLOCALAPPDATA = &H1C ssfALTSTARTUP = &H1D ssfCOMMONALTSTARTUP = &H1E ssfCOMMONFAVORITES = &H1F ssfINTERNETCACHE = &H20 ssfCOOKIES = &H21 ssfHISTORY = &H22 ssfCOMMONAPPDATA = &H23 ssfWINDOWS = &H24 ssfSYSTEM = &H25 ssfPROGRAMFILES = &H26 ssfMYPICTURES = &H27 ssfPROFILE = &H28 End Enum Private Sub cmdSalir_Click() Unload Me End Sub Private Sub Form_Load() Dim s As String ' ' Crear el objeto Shell Set oShell = New Shell32.Shell ' ' Mostrar el copyright y adecuar el año a la fecha actual lblInfo.Caption = " ©Guillermo 'guille' Som, 2001" & IIf(Year(Now) > 2001, "-" & CStr(Year(Now)), "") ' Guardamos el copyright, por si lo necesitamos posteriormente lblInfo.Tag = lblInfo.Caption ' ' Asignamos los menús AsignarMenuShellObjects ' s = s & "Valores de GetSystemInformation:" s = s & vbCrLf & "--------------------------------" s = s & vbCrLf & "DirectoryServiceAvailable: " & oShell.Application.GetSystemInformation("DirectoryServiceAvailable") s = s & vbCrLf & "DoubleClickTime: " & oShell.Application.GetSystemInformation("DoubleClickTime") s = s & vbCrLf & "ProcessorLevel: " & oShell.Application.GetSystemInformation("ProcessorLevel") ' Esta falla... 's = s & vbCrLf & "Velocidad del procesador: " & oShell.Application.GetSystemInformation("ProcessorSpeed") s = s & vbCrLf & "ProcessorArchitecture: " & oShell.Application.GetSystemInformation("ProcessorArchitecture") s = s & vbCrLf & "PhysicalMemoryInstalled: " & oShell.Application.GetSystemInformation("PhysicalMemoryInstalled") ' Text1 = s ' End Sub Private Sub Form_Resize() If WindowState <> vbMinimized Then lblInfo.Left = 60 lblInfo.Width = ScaleWidth - 120 End If End Sub Private Sub mnuShell_Click(Index As Integer) lblInfo.Caption = mnuShell(Index).Tag lblInfo.Refresh EjecutarShellObject Trim$(mnuShell(Index).Caption) End Sub Private Sub mnuShell2_Click(Index As Integer) lblInfo.Caption = mnuShell2(Index).Tag lblInfo.Refresh EjecutarShellObject Trim$(mnuShell2(Index).Caption) End Sub Private Sub AsignarMenuShellObjects() ' Asignar (y crear) los submenús de Shell Objects Dim i As Long ' ' Asignar al Caption lo que muestra el menú y ' al Tag el texto a mostrar en la etiqueta de información ' ' El índice 0 ya estará creado i = 0 With mnuShell(0) .Caption = "BrowseForFolder" .Tag = "Creates a dialog box that allows the user to select a folder and then returns the selected folder's Folder object." End With ' ' Ir creando el resto de los elementos ' usamos detección de errores por si ya estuviesen creados en tiempo de diseño On Error Resume Next ' i = i + 1 Load mnuShell(i) With mnuShell(i) .Caption = "MinimizeAll" .Tag = "Minimizes all of the windows on the desktop." End With i = i + 1 Load mnuShell(i) With mnuShell(i) .Caption = "CascadeWindows" .Tag = "Cascadess all of the windows on the desktop." End With i = i + 1 Load mnuShell(i) With mnuShell(i) .Caption = "TileHorizontally" .Tag = "Tiles all of the windows on the desktop horizontally." End With i = i + 1 Load mnuShell(i) With mnuShell(i) .Caption = "TileVertically" .Tag = "Tiles all of the windows on the desktop vertically." End With i = i + 1 Load mnuShell(i) With mnuShell(i) .Caption = "UndoMinimizeALL" .Tag = "Restores all of the windows on the desktop to the same state they were in before the last MinimizeAll command." End With ' i = 0 With mnuShell2(i) .Caption = "ControlPanelItem" .Tag = "Runs a Control Panel application." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "EjectPC" .Tag = "Ejects the computer from its docking station." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "Explore" .Tag = "Explores a folder." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "FileRun" .Tag = "Displays the Run dialog to the user." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "FindComputer" .Tag = "Displays the Find: Computer dialog box." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "FindFiles" .Tag = "Displays the Find: All Files dialog box." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "Help" .Tag = "Displays Microsoft® Windows® Help." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "NameSpace" .Tag = "Creates and returns a Folder object for the specified folder." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "Open" .Tag = "Open Opens a folder." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "RefreshMenu" .Tag = "Refreshes the contents of the Start Menu." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "SetTime" .Tag = "Displays the Date/Time Properties dialog box." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "ShutdownWindows" .Tag = "Displays the Shut Down Windows dialog box." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "Suspend" .Tag = "Suspends the computer." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "TrayProperties" .Tag = "Displays the Taskbar Properties dialog box." End With i = i + 1 Load mnuShell2(i) With mnuShell2(i) .Caption = "Windows" .Tag = "Creates and returns a ShellWindows object." End With ' Err = 0 End Sub Private Sub EjecutarShellObject(ByVal sMethod As String) Dim tFolder As Shell32.Folder Dim s As String ' On Error Resume Next ' s = Text1 ' Select Case sMethod Case "BrowseForFolder" ' Examinar Archivos de Programas... Set tFolder = oShell.BrowseForFolder(0, "Seleccionar carpeta", 0) ', "C:\Program Files" If Not tFolder Is Nothing Then s = s & vbCrLf & vbCrLf & "Título: " & tFolder.Title & " Título del padre: " & tFolder.ParentFolder.Title End If Case "CascadeWindows" oShell.CascadeWindows Case "ControlPanelItem" oShell.ControlPanelItem "" '"INETCPL.cpl" Case "EjectPC" oShell.EjectPC Case "Explore" oShell.Explore ssfDRIVES 'oShell.Explore "C:\" Case "FileRun" oShell.FileRun Case "FindComputer" oShell.FindComputer Case "FindFiles" oShell.FindFiles Case "Help" oShell.Help Case "MinimizeAll" oShell.MinimizeAll Case "NameSpace" oShell.NameSpace ssfPROGRAMS 'oShell.NameSpace "C:\" Case "Open" oShell.Open ssfSTARTUP Case "RefreshMenu" oShell.RefreshMenu Case "SetTime" oShell.SetTime Case "ShutdownWindows" oShell.ShutdownWindows Case "Suspend" oShell.Suspend Case "TileHorizontally" oShell.TileHorizontally Case "TileVertically" oShell.TileVertically Case "TrayProperties" oShell.TrayProperties Case "UndoMinimizeALL" oShell.UndoMinimizeALL Case "Windows" oShell.Windows End Select ' Text1 = s ' Err = 0 End SubPara bajarte el código de ejemplo, pulsa en este link. (ShellObjects.zip 3.98 KB)
Nos vemos.
Guillermo