Cómo usar los objetos del Shell

o cómo implementar desde Visual Basic la mayoría de las tareas del Shell de Windows mediante automatización

Publicado: 07/Sep/2001
Actualizado: 18/Nov/2001
Lista de los objetos disponibles en el objeto Shell (18/Nov/2001)


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 Sub

Para bajarte el código de ejemplo, pulsa en este link. (ShellObjects.zip 3.98 KB)

Nos vemos.
Guillermo


ir al índice