Cómo extraer un icono de programa Windows--ejecutar o no

Seleccione idioma Seleccione idioma
Id. de artículo: 142815 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

El programa de ejemplo incluido a continuación muestra cómo extraer un icono desde un programa de Microsoft Windows, si actualmente se está ejecutando o no. Hay dos técnicas diferentes dependiendo de si el programa se ejecuta en Microsoft Windows versión 3.0 o 3.1. La función API ExtractIcon, introducida en Windows versión 3.1, simplifica el proceso de extraer el icono. En Windows 3.0, se requiere un enfoque diferente. Ambos métodos se muestran a continuación.

Más información

El programa de ejemplo que se muestra a continuación muestra el icono de una aplicación en un cuadro de imagen. El ejemplo muestra el tratamiento de la propiedad hDC del control de cuadro de imagen, específicamente la relación entre el método Refresh, la propiedad Image y la propiedad AutoRedraw. El código en el evento Command3_Click muestra cómo transferir la imagen capturada icono a la propiedad Picture de un cuadro de imagen (Picture2).

Ejemplo paso a paso

  1. Inicie Visual Basic o en el menú Archivo, haga clic en nuevo proyecto (ALT, F, N) si Visual Basic ya se está ejecutando. Se creará Form1 de manera predeterminada.
  2. Cree los siguientes controles con el valor predeterminado valores de propiedad:

    • Picture1
    • Picture2
    • Command1
    • Comando2
    • Command3
  3. Agregue el código siguiente a la sección de declaraciones general de Form1 teniendo cuidado de escribir cada instrucción Declare en una sola línea:
       ' API declarations used in Windows version 3.0 method.
       Private Declare Function GetActiveWindow Lib "User" () As Integer
       Private Declare Function PostMessage Lib "User" _
          (ByVal hWnd As Integer, ByVal wMsg As Integer, _
           ByVal wParam As Integer, ByVal lParam As Any) As Integer
       Private Declare Function FindWindow Lib "User" _
          (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Integer
       Private Declare Function LoadLibrary Lib "Kernel" _
          (ByVal lpLibFileName As String) As Integer
       Private Declare Function GetWindowWord Lib "User" _
          (ByVal hWnd As Integer, ByVal nIndex As Integer) As Integer
       Private Declare Function LoadIcon Lib "User" _
          (ByVal hInstance As Integer, ByVal lpIconName As Any) As Integer
    
       ' API declarations used in Windows version 3.1 method.
       Private Declare Function GetModuleHandle Lib "Kernel" _
          (ByVal lpModuleName  As String) As Integer
       Private Declare Function GetClassWord Lib "User" _
          (ByVal hWnd As Integer, ByVal nIndex As Integer) As Integer
       Private Declare Function ExtractIcon Lib "SHELL" _
          (ByVal hInst As Integer, ByVal lpszexename As String, _
           ByVal hIcon As Integer) As Integer
    
       ' API declaration used by both Windows version 3.0 and 3.1 methods.
       Private Declare Function DrawIcon Lib "User" (ByVal hDC As Integer, _
          ByVal x As Integer, ByVal Y As Integer, ByVal hIcon As Integer) _
          As Integer
    
       ' Window field offsets for GetClassWord() and GetWindowWord().
       Const GWW_HINSTANCE = (-6)
       Const GCW_HMODULE = (-16)
       ' Constants for SendMessage and PostMessage.
       Const WM_CLOSE = &H10
       ' If using Visual Basic version 1.0, remove the single quotation mark
       ' from the following line of code:
       ' Const NULL = 0&
    
    						
  4. Coloque el código siguiente en el evento Form_Load de Form1:
       Private Sub Form_Load ()
          Command1.Caption = " 3.0 method "
          Command2.Caption = " 3.1 method "
          Command3.Caption = " Transfer "
          Form1.Caption = " Example of Extracting an Icon"
          Form1.Width = Screen.Width * 2 / 3
    
          Form1.Height = Screen.Height / 2
    
          ' Center the form on the screen.
          Form1.Move (Screen.Width - Form1.Width) / 2, _
             (Screen.Height - Form1.Height) / 2
          ' Size and position the controls dynamically at run time.
          Picture1.Move 0, 0, Form1.Width / 2, _
          Form1.Height - Command1.Height * 4
          Picture2.Move Form1.Width / 2, 0, Form1.Width, _
             Form1.Height - Command2.Height * 4
          Command1.Move (Form1.Width / 2 - Command1.Width) / 2, _
             Form1.Height - Command1.Height * 4
          Command2.Move (Form1.Width / 2 - Command1.Width) / 2, _
             Form1.Height - Command1.Height * 3
          Command3.Move (Form1.Width * 3 / 2 - Command2.Width) / 2, _
             Form1.Height - Command2.Height * 4
       End Sub
    
    						
  5. Coloque el código siguiente en el evento Command1_Click. Configurar el código para que coincida con su situación quitar uno de los tres métodos el apóstrofo de comentario y agregando apóstrofos de comentario a los otros dos--eficazmente habilitar uno de los métodos y deshabilitar los otros dos.
       Private Sub Command1_Click ()
       Dim hInstance As Integer, handle As Integer, hIcon As Integer
       Picture1.Picture = LoadPicture("") ' clear any previous image.
    
          ' Three alternative ways to obtain the handle of the top-level window
          ' of the program whose icon you want to extract:
    
          ' Method 1: If the program is currently running and you do not know
          '           the class name.
          ' AppActivate ("Program Manager") ' Set focus to application.
          ' handle = GetActiveWindow()      ' Get handle to window.
          ' Command1.SetFocus               ' Return focus to button.
    
          ' Method 2: If program is running and you know the class name.
          ' Handle = FindWindow("Progman", "Program Manager")
    
          ' Method 3: If program is not running, use path and filename.
          ' Not_Running_Way "sysedit.exe" ' Call sub at general level.
          ' Exit Sub                      ' Bypass remaining code in this Sub.
    
          ' Now you have the handle -- use it to obtain the instance handle.
          hInstance = GetWindowWord(handle, GWW_HINSTANCE)
          Picture2.Print "3.O method "
          Picture2.Print "handle="; Hex$(handle)
          Picture2.Print "hInstance= "; Hex$(hInstance)  ' Sanity check.
    
          ' Iterate through icon resource identifier values
          '  until you obtain a valid handle to an icon.
          Do
             hIcon = LoadIcon(hInstance, n&)
             n& = n& + 1
          Loop Until hIcon <> 0
          Picture2.Print "hIcon= "; Hex$(hIcon)
          Picture1.AutoRedraw = -1 ' Make hDC point to persistent bitmap.
          r = DrawIcon(Picture1.hDC, 19, 19, hIcon) 'Draw the icon.
          Picture1.Refresh         ' Refresh from persistent bitmap to Picture.
       End Sub
    
    						
  6. Coloque el código siguiente en el evento Comando2_Click. Tenga en cuenta que se proporcionan los dos primeros métodos marcado como comentario para la información y el contraste para el método preferido, el método 3.
       Private Sub Command2_Click ()
          Dim myhInst As Integer, hIcon As Integer
          Picture1.Picture = LoadPicture("") ' Clear the previous image.
    
          ' Listed below are three alternative methods that can be used to
          ' obtain the hInst of your program's module handle.
    
          ' Method 1: Use only with .EXE version of your program.
             ' myhInst = GetModuleHandle("Project1.exe")
    
          ' Method 2: Use only with your program running in the environment.
             ' myhInst = GetModuleHandle("VB.EXE")
    
          ' Method 3: The slick way that works in either case.
               myhInst = GetClassWord(hWnd, GCW_HMODULE)
    
          ' The path and filename of program to extract icon from.
          lpzxExeName$ = "moricons.dll"  ' Can also use an .EXE file here.
    
          ' Get handle to icon.
          hIcon = ExtractIcon(myhInst, lpzxExeName$, 0)
          Picture2.Print "3.1 method "
          Picture2.Print "myhInst= "; Hex$(myhInst) ' Sanity check.
          Picture2.Print "hIcon= "; Hex$(hIcon)     ' Sanity check.
    
          Picture1.AutoRedraw = -1  ' Make the picture's hDC point to the
                                    ' persistent bitmap.
          r% = DrawIcon(Picture1.hDC, 19, 19, hIcon)
          Picture1.Refresh  ' Cause Windows to paint from the persistent bitmap
    
                            ' to show the icon.
       End Sub
    
    						
  7. Coloque el código siguiente en la sección del formulario general Declarations:
       Private Sub Not_Running_Way (appname As String)
          Dim hInstance As Integer, handle As Integer, hIcon As Integer
          Dim hWndShelledWindow As Integer
          Picture1.Picture = LoadPicture("") ' Clear any previous image.
          hInstance = Shell(appname, 2)
          Picture2.Print "3.0 method-application not running"
          Picture2.Print "hInstance= "; Hex$(hInstance)  ' Check return.
          r = DoEvents()  ' Allow time for shell to complete.
    
          ' The following technique is from another article that explains
          ' how to determine when a shelled process has terminated. It is
          ' used here to obtain the correct handle to the window of the
          ' application whose icon is being extracted. The handle is needed
          ' to close the application after the extraction is complete.
          TimeOutPeriod = 5
          fTimeOut = 0      ' Set to false.
          s! = Timer
          Do
             r = DoEvents()
             hWndShelledWindow = GetActiveWindow()
             ' Set timeout flag if time has expired.
             If Timer - s! > TimeOutPeriod Then fTimeOut = True
          Loop While hWndShelledWindow = Form1.hWnd And Not fTimeOut
          ' If a timeout occurred, display a timeout message and terminate.
          If fTimeOut Then
             MsgBox "Timeout waiting for shelled application", 16
             Exit Sub
          End If
    
          ' Iterate through icon resource identifier values
          ' until you obtain a valid handle to an icon.
          Do
             hIcon = LoadIcon(hInstance, n&amp;)
             n& = n& + 1
          Loop Until hIcon <> 0
    
          Picture2.Print "HICON= "; Hex$(hIcon)
          Picture1.AutoRedraw = -1 ' Make hDC point to persistent bitmap.
          r = DrawIcon(Picture1.hDC, 19, 19, hIcon)
          Picture2.Print "return from DrawIcon="; r
          Picture1.Refresh         ' Refresh from persistent bitmap to picture.
    
          ' Now post a message to the window to close the application.
          r = PostMessage(hWndShelledWindow, WM_CLOSE, NULL, NULL)
          Picture2.Print "return from PostMessage="; r
       End Sub
    
    						
  8. Coloque el código siguiente en el evento Command3_Click:
       Private Sub Command3_Click ()
          ' This code transfers the extracted icon's image to Picture2's
          ' Picture property and demonstrates that DrawIcon assigns the image
          ' to the hDC of Picture1, which points to the persistent bitmap
          ' (Image property), not to the Picture property.
          Picture2.Picture = LoadPicture("")  ' Clear old icon.
          Picture2.currenty = 0               ' Reset coordinates for printing
                                              '  return values.
          Picture2.currentx = 0
          Picture2.Picture = Picture1.image   ' Transfer persistent bitmap
                                              '  image to the Picture property.
       End Sub
    
    						
  9. Presione F ALT, V para guardar el proyecto. A continuación, presione F5 para ejecutar el programa. Haga clic en "3.0 método" para ejecutar el código que funciona en Windows versión 3.0. Haga clic en "3.1 método" para ejecutar el código que funciona en Windows versión 3.1. Haga clic en Command3 copiará el icono en Picture1 Picture2 para que se puede tener acceso el icono como Picture2.Picture.

    Ambos métodos extraen el primer icono del archivo. Esto puede modificarse para encontrar los iconos de los segundo o sucesivos por:

    • Almacenar el valor de n & en el bucle Do desde la primera extracción y conectar como punto de partida de la siguiente búsqueda de Windows versión 3.0.

      -o bien -
    • Establecer el parámetro tercero de la función ExtractIcon en un número de índice específico de Windows versión 3.1.
    Puede realizar esta funcionalidad en un bucle para buscar y examinar cada icono del archivo.

    El método de la versión 3.0 de Windows puede tardar un poco más para recorrer en iteración y buscar el número de identificador de recurso de icono.

Referencias

"Microsoft Windows Software Development Kit volumen 2"
"El volumen de biblioteca de referencia del programador de Microsoft Press 2"

Propiedades

Id. de artículo: 142815 - Última revisión: miércoles, 8 de enero de 2003 - Versión: 1.1
La información de este artículo se refiere a:
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
Palabras clave: 
kbmt kbcode KB142815 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 142815
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com