0% encontró este documento útil (0 votos)
220 vistas

API Windows - Visual Basic

Este documento explica el API de Windows, que proporciona funciones para programar aplicaciones para sistemas operativos Windows. El API Win32 surgió para permitir la programación en 32 bits en Windows 95. El documento describe cómo las aplicaciones usan funciones y mensajes del API a través de llamadas a funciones, y cómo la mayoría de estas funciones están contenidas en bibliotecas dinámicas (DLL). También explica cómo declarar funciones DLL y da algunos ejemplos de funciones API comunes.

Cargado por

Salyo Drajat
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
220 vistas

API Windows - Visual Basic

Este documento explica el API de Windows, que proporciona funciones para programar aplicaciones para sistemas operativos Windows. El API Win32 surgió para permitir la programación en 32 bits en Windows 95. El documento describe cómo las aplicaciones usan funciones y mensajes del API a través de llamadas a funciones, y cómo la mayoría de estas funciones están contenidas en bibliotecas dinámicas (DLL). También explica cómo declarar funciones DLL y da algunos ejemplos de funciones API comunes.

Cargado por

Salyo Drajat
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 30

API Windows en Visual Basic Facilitador: Donati Portorreal

API de Windows 1

Indice

¿Que es el API de Win32?


Llamadas a las Funciones API
Librerias Dinamicas
Declarando una Funcion DLL
Algunas Funciones API
Ejemplo:GetDeviceCaps
Ejemplo: GetWindowsDirectory
Ejemplo: Rotar un Texto
Algunas APIs Interesantes...

¿Qué es el API Win32 ?

Win32 es un conjunto de funciones, tipos y mensajes pre-definidos para poder programar sobre
los sistemas operativos de 32 bits de Microsoft. El API Win32, surge para cubrir la necesidad
de crear un sistema operativo
de 32 bits como es Windows 95, frente al API de 16 bits existente de Windows 3.1. Surge el
problema de que Win32, no es compatible con el API de 16 bits, lo que implica que si queremos
portar un código de Windows 3.1
a Windows 95, deberemos reescribir el código. Aunque hemos dicho que el API Win32 no es
compatible con el
API de 16 bits, hay una versión que es Win32s que sirve para la versión 3.1 de Windows.
Algunas de las limita- ciones entre ambos API son:

 No soportan nombres de ficheros largos, sólo el conocido formato 8.3 de DOS.


 No tiene API de comunicaciones.
 No soportan las capacidades Plug & Play.

Llamadas a las Funciones del API de Windows

        Un programador de aplicaciones Windows además de conocer el entorno de trabajo de


Windows debe
conocer también su entorno de programación, conocido generalmente como interfaz de
programación de aplicaciones de Windows ( Windows Application Programming Interface,
abreviadamente Windows API ).
La característica primaria de la API de Windows son las funciones y los mensajes
internos/externos de
Windows.

        Las funciones Windows son el corazón de las aplicaciones Windows. Hay más de 600
funciones de
Windows dispuestas para ser llamadas por cualquier lenguaje, como C o Visual Basic.

        A través de estos mecanismos, podemos realizar gran cantidad de funciones que hasta el
momento no
teníamos ni idea que se podían realizar. La utilización de ésta serie de librerías que contienen
las funciones
de la API pueden solucionar gran cantidad de problemas en la programación, aunque también

Centro de Tecnología Universal (CENTU) 1


API Windows en Visual Basic Facilitador: Donati Portorreal

no debemos desestimar el gran poder destructivo de las mismas. La depuración de un


programa es muy diferente si éste
tiene incorporadas llamadas a APIs, ya que el resultado de las mismas en algunos casos puede
llegar a ser incomprensible. Cuando se trabaja con éstas funciones siempre es recomendable
tener a mano una buena
guía o bien tener a mano alguien que sepa, para no encontrarnos con posibles problemas.

        Las dos principales ventajas que obtenemos con la utilización de APIs es la gran
funcionalidad que
podemos darle a nuestra aplicación, y en segundo lugar la gran velocidad de proceso, ya que a
menudo es
mucho más rápido realizar una función a través de la API adecuada que por medio del lenguaje
en si mismo.

        Los mensajes son utilizados por Windows para permitir que dos o más aplicaciones se
comuniquen entre
sí y con el propio sistema Windows. Se dice que las aplicaciones Windows son conducidas por
mensajes o
sucesos.

        Conocer todas las APIs de Windows es imposible, ya que tiene gran similitud con
aprenderse la guía de teléfonos.

        Lo que debemos hacer es realizar un razonamiento contrario, nosotros tenemos una
necesidad a la
hora de programar, y debemos pensar que eso tiene una solución con una API.. En la mayoría
de los casos
es así.

Librerías Dinámicas.

       Casi todas las APIs de Windows se unen formando librerías de enlace dinámico.

       Una librería dinámica ( Dynamic Link Libraries, abreviadamente DLLs ) permite que las
aplicaciones
Windows compartan código y recursos. Una DLL es actualmente un fichero ejecutable que
contiene funciones
de Windows que pueden ser utilizadas por todas las aplicaciones.

        Si bien en DOS estamos acostumbrados a utilizar librerías de enlace estático, es decir, a
la hora de
compilar incluyen junto con nuestro código, y de esta manera cuando se ejecuta nuestra
aplicación, todas las librerías se cargan en memoria esperando a ser invocadas. Sin embargo,
cuando trabajamos con DDLs, el
enlace con la aplicación es dinámico en tiempo de ejecución.

        Una DDL no se incluye dentro de nuestro código, sino que en el momento que realizamos
la llamada a
la función, la DLL se carga en memoria, se utiliza la API, y a continuación se descarga.

        La gran ventaja que posee este método es que no es necesario tener gran cantidad de
código cargado
en memoria a la hora de ejecutar nuestra aplicación. En contra, es necesario que cuando
llevemos nuestro ejecutable a otra instalación, tengamos que llevar las DLLs necesarias.

Centro de Tecnología Universal (CENTU) 2


API Windows en Visual Basic Facilitador: Donati Portorreal

        También tenemos que pensar que si utilizamos las DLLS que nos proporciona Windows,
en cualquier
máquina con este sistema operativo vamos a encontrar esas mismas DLLs, con lo cual no es
necesario que
nos las llevemos.

        La utilización de librerías dinámicas tiene ventajas. Una ventaja es que como están
separadas del
programa se pueden actualizar sin tener que modificar los programas que las utilizan. Otra
ventaja es el
ahorro de memoria principal y de disco ya que como es Windows quien administra la utilización
de las DLLs,
no existe duplicidad de código cuando varias aplicaciones las utilizan.

        También, como todo (jeje) tiene inconvenientes. Uno de ellos es el tiempo que Windows
tiene que emplear
en leer las funciones que el programa necesita utilizar de una DLL.

        Otra desventaja es que cada programa ejecutable necesita que estén presentes las DLLs
que utiliza.
        Cuando se utilizan librerías estáticas, las funciones que el programa necesita se incluyen
en el mismo,
por lo que ni se pierde tiempo en leerlas ni la librería tiene que estar presente.

        La mayoría de éstas librerías suelen estar localizadas en el directorio SYSTEM de


Windows.

        Dentro de Windows tenemos gran cantidad de DLLs, agrupando las APIs en funciones
respecto a un
mismo tema. Además en cada nueva versión de Windows, posiblemente tengamos más DLLs
para utilizar.

        Para acceder a las funciones de las librerías dinámicas, lo primero que debemos hacer es
declararlas.

Declaración de una Función DLL.

        Para declarar una función de una librería dinámica, tiene que escribir una sentencia
declare en el módulo global de la aplicación, o en la sección de declaraciones de la forma o del
módulo correspondiente. Por ejemplo:

Declare Function lopen Lib "kernel" Alias "_lopen" (Byval lpPathname as string, Byval
iReadWrite As Integer) as Integer

        La cláusula Lib indica al lenguaje de programación la librería donde puede encontrar la
función de la API
de Windows declarada. Las DLLs del entorno operativo están en "Kernel", "GDI", "User", o en
una de las
DLLs correspondientes a un driver de dispositivo tal como "Sound". Para otras DLLs, el nombre
incluye el
camino completo. Por ejemplo: "c:\windows\system\lzexpand.dll"

        La cláusula alias indica que la función tiene otro nombre en la librería dinámica ( DLL ).
Esto es útil
cuando el nombre de la función coincide con alguna palabra clave, con alguna variable o

Centro de Tecnología Universal (CENTU) 3


API Windows en Visual Basic Facilitador: Donati Portorreal

constante global, o
el nombre de la función DLL, tiene caracteres no reconocidos por el lenguaje de programación.

        La sentencia declare debe contener asimismo una lista de los parámetros que se pasarán
a la función.
La mayor parte del trabajo consiste en determinar cuáles serán esos parámetros. Algo muy
utilizado dentro
de los parámetros son lo que podemos traducir como manejadores ( handles ). Esto es un valor
entero único definido por el entorno operativo y utilizado para referirse a objetos tales como
formularios, controles, etc. Un handle es un número de identificación. HWnd es un handle para
referirse a una ventana, hDC es un handle para referirse al contexto de dispositivo de un objeto
( Device Context ). Cuando una función de una DLL espera
recibir como argumento un handle, se debe declarar como ByVal Integer.

        Declare Function IsIconic Lib "User" (ByVal hWnd As Integer) As Integer

        If IsIconic (Form1.hWnd) Then ....

        El entorno operativo asigna un handle a cada formulario de una aplicación para
posteriormente identificarles.
        La propiedad hWnd de un formulario o de un control no gráfico permite acceder a este
handle.

        Por contexto de dispositivo se entiende un conjunto de atributos (color de fondo, tipo de
letra, espaciado
entre caracteres, posición actual de la pluma, paleta de colores, etc.) que determinan la
localización y la
apariencia de un objeto. Una aplicación puede modificar estas propiedades a través del hDC
del objeto.

        Afortunadamente, Microsoft ha pensado en el programador y proporciona una herramienta


dentro de
algunos lenguajes de programación de entorno visual como es el API viewer, en Visual Basic
versión 4.0.

        Con ésta herramienta podemos cargar unos archivos TXT que nos proporcionan las
sentencias declare de
gran cantidad de funciones API. Si no poseemos ningún tipo de ayuda respecto a una API
específica, es muy posible
que todos nuestros intentos en utilizarla sean inútiles.

        Para declarar una función de una librería dinámica, se tiene que escribir en la sección de
declaraciones de
un formulario o de un módulo de la aplicación en construcción.

        Una función declarada en un formulario es privada para este formulario, y declarada en un
módulo es
pública, y por lo tanto puede ser llamada desde cualquier parte de la aplicación.

        Si la función no retorna un valor, se declarará como un procedimiento o sub, aunque esta
opción no se
utiliza casi nunca, pues la mayoría de las APIs retornan un valor, aunque sea una verificación
de su realización.

        Los argumentos que se pasan a una función pueden ser pasados por valor o por
referencia. UN parámetro
por valor quiere decir que lo que estamos metiendo dentro de la función es el contenido de la
variable, mientras

Centro de Tecnología Universal (CENTU) 4


API Windows en Visual Basic Facilitador: Donati Portorreal

que por referencia se introduce la dirección de memoria donde reside la variable que contiene
el valor que queremos
pasar.

        Habitualmente, dentro de nuestro programa trabajamos con variables que se pasan por
valor, es decir, no
nos interesa la posición de memoria de la variable, sino su contenido. Al trabajar con APIs la
cosa cambia. La mayoría
de estas funciones están desarrolladas en C, y en este lenguaje se utiliza asiduamente los
punteros (direcciones de memoria )

        Por defecto, los lenguajes actuales de entorno visual pasa los argumentos por referencia (
utilizando direcciones de
32 bits ).

        Para pasar un argumento por valor, se debe de escribir la palabra clave ByVal delante de
la declaración del argumento.

        Algunas funciones aceptan más de un tipo de datos para un mismo argumento, y esto se
indica declarando
el argumento como Any.
 

Declare Function Catch Lib "Kernel" (lpCatchBuf As Any) As Integer

Esta función puede ser llamada con un argumento tipo cadena, de tipo largo, etc.

Algunas Funciones de la API.

        Algunas de las funciones del API, se pueden agrupar en:

        - Funciones de direccionamiento de memoria a 32 bits.


                        Recupera el API para aplicaciones que utilizan 32 bits.

        - Funciones de ejecución de aplicaciones.


                        Tiene la función de cargar y ejecutar aplicaciones.
                         ej:   Winhelp
                                Loadmodule

        - Funciones bitmap.


                        Crea y maneja los bitmaps.
                        Createbitmap, crea un bitmap.
                        Getpixel, recupera el color RGB del pixel especificado.

        - Funciones callback o rellamada.


                        Recupera información sobre algo que se está ejecutando, con la
posibilidad de hacer algún cambio.
                        Abortproc, procesa los trabajos de impresora cancelados.
                        EnumFontFamProc, recupera información sobre las fuentes (tipo de
letra) disponibles.

        - Funciones de cuadro de diálogo común.


                        Funciones que actúan sobre una caja de diálogo común, cambiando
su color, texto, etc.
                        Choosecolor, crea una caja de diálogo seleccionando el color.

Centro de Tecnología Universal (CENTU) 5


API Windows en Visual Basic Facilitador: Donati Portorreal

        - Funciones de comunicación.


                        Funciones que gestionan los dispositivos de comunicaciones.
                        Opencomm, abre un dispositivo de comunicaciones.

        - Funciones de cursor.


                        Gestionan todo lo relacionado con el cursor.
                        Createcursor, crea un cursor con dimensiones especificadas.

        - Funciones DDE (Data Dinamic Exchange ).


                        Gestiona el intercambio de datos dinámico.
                        DdeAccessData, proporciona un acceso a un objeto con memoria global.
                        DdeGetdata, copia los datos de un objeto de memoria global a un buffer.

        - Funciones de error.


                        Funciones que gestionan los errores de los dispositivos.
                        Debugoutput, envía mensajes al terminal erróneo.

        - Funciones de movimiento y visualización.


                        Isiconic, determina si una ventana está minimizada.

        - Funciones para las propiedades.


                        Informa y modifica el estado de las propiedades.
                       Getprop, devuelve una lista de propiedades de una ventana.

         - Funciones pen.


                        Son las funciones correspondientes al lápiz.

        - Funciones de paleta de colores.

        - Funciones de dibujo y pintura.

      - Grupo de funciones OLE.


                     Funciones que se basan en el manejo de objetos.
                    Olenumobjects, enumera los objetos en un documento.

        - Funciones Toolhelp.


                    Normalmente devuelven información sobre los objetos que hay en memoria.

        - Funciones Drag & Drop


                    Funciones de arratrar y soltar.
                   Tiene información sobre la posición de arrastre de algún elemento, si se puede
arrastrar, etc.

     - Funciones de controladores instalables.


                    Hacen una gestión de los controladores instalables.

       - Funciones de decodificación LEMPEL-ZIV.


                    Hacen una gestión de los ficheros comprimidos.

       - Funciones para la impresión.


                    Devuelve tamaños de letra, página, etc. y activa o desactiva algunas funciones,
configura colores, etc.
                    a la hora de imprimir.

        - Funciones SHELL (entorno).


                    Son las funciones que controlan el entorno.

Centro de Tecnología Universal (CENTU) 6


API Windows en Visual Basic Facilitador: Donati Portorreal

                    FindExecutable: recupera el nombre del ejecutable asociado a un


fichero especificado.

        - Funciones "Stress"


                    Controla espacio libre y manejadores de ficheros (handles).
                    AllocDiskSpace: crea un fichero del espacio consumido en una partición del disco
(instalar software).

        - Funciones TrueType


                    Funciones que controlan los fuentes o tipos de letra a utilizar.
                    GetRasterizarCaps: recupera el estado del tipo de letra en un sistema. Cuando se
hace un cambio de
                    tipo de letra , reestablece el que hay por defecto.

        - Funciones de versión.


                    Función que controla la versión de los ficheros.
                    GetfileVersionInfo: devuelve información sobre un fichero especificado.

        - Funciones GDI.


                    Controla todo lo que se refiere a los gráficos, ya sea tipos de letra, manejo de
trabajo a la hora de una
                    impresión, prepara la impresora para aceptar datos, etc.
                    StartPage: Prepara un controlador de impresora para aceptar datos.
                    StarDoc: Inicializará un trabajo de impresión.
                    GetRasterizerCaps: recupera el estado del tipo de letra de un sistema.

        - Funciones KERNEL.


                   Lleva a cabo una E/S a ficheros, control de errores,etc.
                    hread: Lee datos de un fichero.
                    hwrite: escribe datos en un fichero.
                    Debugoutput: envía mensajes a un terminal erróneo.

        - Funciones de usuario.


                   Son funciones en las que el usuario realiza alguna acción, como activar o
desactivar flechas de scroll-
                    bar (texto horizontal-vetical), recupera información de mensajes de hardware, etc.
                    GetDriverInfo: recupera datos de un dispositivo instalable.
                    CopyIcon: copia un icono.
                    OpenDriver: abre un dispositivo instalable.

    Una de las primeras funciones que vamos a comentar es bastante utilizada.

        En muchas ocasiones hemos querido saber qué resolución tiene la pantalla de la pc en el
momento que se ejecuta nuestro software. Con ésta información podemos dar un aspecto
bastante más profesional a nuestra aplicación si ajustamos el tamaño de nuestros formularios a
la resolución de la pantalla. También a través de
la misma API sabemos la cantidad de puntos que nos da la impresora, con lo que podemos
ajustar nuestros informes independientemente de la impresora seleccionada. Esta función la
tenemos dentro de la librería GDI,
y se denomina GetDeviceCaps. Dependiendo del valor del índice introducido, así nos da la
información sobre la cantidad de puntos horizontales de la pantalla, cantidad de puntos
verticales de la pantalla, puntos por pulgada horizontalmente en la impresora y puntos por
pulgada verticalmente en la impresora.

Declare Function GetDeviceCaps Lib "GDI" ( ByVal HDC As Integer, Byval nIndex As Integer)
As Integer

Centro de Tecnología Universal (CENTU) 7


API Windows en Visual Basic Facilitador: Donati Portorreal

Global Const HorRes = 8 ' resolución horizontal en pixels


Global Const VerRes = 10 ' resolución vertical en pixels
Global Const PPPX = 88 ' pixels por pulgada en X
Global Const PPPY = 90 ' pixels por pulgada en Y

Private Sub Command1_click()


    p1 = GetDeviceCaps ( HDC, HorRes )
    p2 = GetDeviceCaps ( HDC, VerRes )
    i1 = GetDeviceCaps ( Printer, HDC, PPPX )
    i2 = GetDeviceCaps ( Printer, HDC, PPPY )
    Label1.Caption = "Pantalla: " & p1 & " x" & p2
    Label2.Caption = "Impresora: " & i1 & " x " & i2
End Sub

    En muchas ocasiones necesitamos conocer dónde esta el directorio de Windows y dónde
reside el
directorio System del mismo. Es muy lógico suponer que todas las instalaciones están en el
directorio C:\Windows.

        Puede ser que se ejecute desde una red, o que el usuario haya cambiado el directorio por
omisión. En cualquiera de estos casos no podemos referirnos directamente a estos directorios,
sino que debemos conocerlos dinámicamente cuando ejecutamos la aplicación.

        Para ello utilizamos dos APIs de la librería Kernel, la primera nos devuelve el directorio de
Windows
(GetWindowsDirectory ), mientras que la segunda el directorio de System ( GetSystemDirectory
).

        Para hacer funcionar esta API debemos inicializar la variable que nos devuelve la
información, con 255 caracteres rellenos con el valor ASCII 0. Si la cadena estuviese vacía, no
funcionaría, y su comportamiento sería impredecible.

Declare Function GetWindowsDirectory Lib "Kernel " (ByVal lpBuffer As String, ByVal nSize As
Integer
Declare Function GetSystemDirectory Lib "Kernel" (ByVal lpBuffer As String, ByVal nSize As
Integer

Private Sub Command2_Click ()


    Dim Camino As String
    Camino = String( 255, 0 )
    w = GetWindowsDirectory ( Camino, Len(camino))
    Label3.Caption = Camino
    w = GetSystemDirectory ( Camino, Len(Camino))
    Label4.Caption = Camino
End Sub

    Por último queria comentar una utilidad realizada con llamadas a APIs. Consiste en el efecto
de poder rotar
un texto, algo que dentro de algunos lenguajes no se puede hacer, como es en el entorno
Visual Basic, a no ser
que sea por medio de una imagen. Esto no se realiza con una simple llamada, sino que es
necesaria una estructura de programación más compleja.

Centro de Tecnología Universal (CENTU) 8


API Windows en Visual Basic Facilitador: Donati Portorreal

        En primer lugar debemos definir dos estructuras. La primera nos va a permitir introducir
una posición del texto, y la segunda es una definición completa de una fuente por el usuario.

Type RECT
    LEFT As Integer
    TOP As Integer
    RIGHT As Integer
    BOTTOM As Integer
End Type

Global Const F_TAMNOMBRE = 32

Type FUENTE
    FANCHO As Integer
    FLARGO As Integer
    FESCAPE As Integer
    FORIENTACION As Integer
    FWEIGHT As Integer
    FITALICA As String * 1
    FUNDERLINE As String * 1
    FSTRIKEOUT As String * 1
    FCHARSET As String * 1
    FOUTPRECISION As String * 1
    FCLIPRECISION As String * 1
    FQUALITY As String * 1
    FPITCHANDFAMILY As String * 1
    FNOMBRE As String * F_TAMNOMBRE
End Type

Global Const TRANSPARENTE = 1


Global Const OPACO = 2

        Como se ha comentado antes, se utilizan varias APIs para realizar este efecto. Todo ellas
son de la
librería GDI, excepto una de USER.
 

Declare Sub GETCLIENTRECT Lib "USER" (ByVal HWND As INTEGER, LPRECT As RECT)
Declare Function SETBKMODE Lib "GDI" (ByVal HDC As Integer, ByVal NBKMODE As
Integer) As Integer
Declare Function CREATEFONTINDIRECT Lib "GDI" (LPLOGFONT As FUENTE) As Integer
Declare Function SELECTOBJECT Lib "GDI" (ByVal HDC As Integer, ByVal HOBJECT As
Integer
Declare Function TEXTOUT Lib "GDI" (ByVal X As Integer, ByVal Y As Integer, ByVal
LPSTRING As String    ByVal NCOUNT As Integer) As Integer
Declare Function DELETEOBJECT Lib "GDI"
 

        El mecanismo utilizado para visualizar un texto inclinado consiste en crear una fuente ya
inclinada y
visualizar el texto con esa fuente y el fondo transparente para no ocultar otros elementos de la
pantalla. En el ejemplo que sigue se puede ver que se va realizando el giro a través de una
barra de desplazamiento.

Private Sub HScroll_Change ( )

Dim POS As RECT


Dim LF As FUENTE

Centro de Tecnología Universal (CENTU) 9


API Windows en Visual Basic Facilitador: Donati Portorreal

Dim I As Integer, ANGULO As Integer


Dim HFONT As Integer, HOLDFONT As Integer
Dim TEXTO As String

' INICIALIZA EL TEXTO A VISUALIZAR


    TEXTO = " TEXTO A ROTAR "
' ESPECIFICA LA FUENTE A USAR
    LF.NOMBRE = "Arial"
    LF.FWEIGHT = 1000
' USA FONDO TRANSPARENTE
    I = SETBKMODE (HDC, TRANSPARENTE )
' CENTRA EL TEXTO EN LA VENTANA
    Call GETCLIENTRECT ( HWND, POS )
    Cls
    ANGULO = HScroll.Value
    LF.FESCAPE = ANGULO
    HFONT = CREATEFONTINDIRECT ( LF )
    HOLDFONT = SELECTOBJECT ( HDC, HFONT )
    I = TEXTOUT ( HDC, POS.RIGHT / 2, POS.BOTTOM / 2, TEXTO. Len ( TEXTO ))
    I = SELECTOBJECT ( HDC, HOLDFONT )
    I =DELETEOBJECT ( HFONT )
' RESTAURA EL FONDO POR DEFECTO
    I = SETBKMODE ( HDC, OPACO )
End Sub

        Como podemos comprobar, no siempre se puede realizar las operaciones que deseamos
con una sola API.
En la mayoría de los casos es necesario utilizar varias, que se complementan para obtener los
resultados deseados.

Algunas Funciones Interesantes y una breve descripcion dde cada una:

GetUserName (Devuelve en nombre del usuario)


GetComputerName (Devuelve en nombre del computador)
GetDiskFreeSpace (Devuelve información sobre el disco duro)
GetDiskFreeSpaceEx (Devuelve la capacidad de un disco mayor de 2Mb.)
GetVolumeInformation (Nombre del Disco, tipo de formato y numero de disco)
GetLogicalDriveStrings (Devuelve las unidades disponibles en un ordenador)
GetLocalTime (Devuelve la fecha y hora del ordenador)
GetCursorPos (Devuelve la posición del cursor en la pantalla)
GetDriveType (Devuelve el tipo de Unidad)
SetWindowPos (Formulario Siempre Visible)
GlobalMemoryStatus (Información sobre la memoria fisica disponible)
ShellExecute (Ejecutar)
GetVersionEx (Devuelve la versión del Windows)
SystemParametersInfo (Cambia el fondo de pantalla del Windows)
SHFileOperation (Enviar un archivo a la papelera de reciclaje)
GetWindowsDirectory (Mustra la ruta del Windows)
GetSystemDirectory (Mustra la ruta del directorio System de Windows)
sndPlaySound (Ejecutar sonidos .WAV)
FindExecutable (Busca el archivo ejecutable asociado a un archivo, y muestra el icono)
GetKeyboardStateByString - SetKeyboardStateByString (Seleccionar y Deseleccionar el
Bloque Numerico del teclado)
FindWindow (Indica si una aplicación determinada esta en ejecución)
SystemParametersInfo (Activa/Desactiva las teclas de Escape - CTRL+ALT+SUB - ALT+TAB
- CRTL+ESC)
GetSysColor (Devuelve los colores del Windows)

Centro de Tecnología Universal (CENTU) 10


API Windows en Visual Basic Facilitador: Donati Portorreal

GetACP (Determina la página de código ANSI vigente)


SetWindowPos (Esconder y mostrar la barra de tareas del Windows)
ExitWindowsEx (Apaga o Reinicia el Windows 95/98)
GetSystemInfo (Información sobre el Hardware)
SystemParametersInfo (Devuelve y establece parámetros del sistema de Windows)

Funciones y ejemplos:
SendMessage: la que siempre hay que tener a mano
SetWindowWord: crear ventanas flotantes
Manejo de ventanas...
GetVolumeInformation: leer el volumen de un disco (32 bits)
GetDriveType: comprobar el tipo de unidad
Dejar una ventana siempre visible
Usar Sleep en lugar de DoEvents
Manejo del Registro
Diálogos comunes del API
Iconos en la barra de tarea
Marcador de teléfonos de Win95
La línea actual y el número de líneas de un text-box
Uso de PostMessage en lugar de SendMessage

1.- SendMessage: la que siempre hay que tener a mano

'Declaración del API de 16 bits

Declare Function SendMessage Lib "User" _

                (ByVal hWnd As Integer, ByVal wMsg As Integer, _

                 ByVal wParam As Integer, lParam As Any) As Long

'Declaración del API de 32 bits.

Declare Function SendMessage Lib "User32" Alias "SendMessageA" _

                (ByVal hwnd As Long, ByVal wMsg As Long, _

                 ByVal wParam As Long, lParam As Long) As Long

'Utilidades para un menú de edición:

'

'Declaración de las constantes

Global Const WM_USER = &H400

Global Const EM_GETSEL = WM_USER + 0

Global Const EM_SETSEL = WM_USER + 1

Centro de Tecnología Universal (CENTU) 11


API Windows en Visual Basic Facilitador: Donati Portorreal

Global Const EM_REPLACESEL = WM_USER + 18

Global Const EM_UNDO = WM_USER + 23

Const EM_LINEFROMCHAR = WM_USER + 25

Const EM_GETLINECOUNT = WM_USER + 10

'

Global Const WM_CUT = &H300

Global Const WM_COPY = &H301

Global Const WM_PASTE = &H302

Global Const WM_CLEAR = &H303

'

'Deshacer:

    'Nota: si se hace de esta forma,

    'no es necesario usar una variable para asignar el valor devuelto.

    If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM_UNDO, 0, ByVal 0&) Then

    End If

    'también: x = SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM_UNDO, 0, ByVal


0&)

'Copiar:

    If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_COPY, 0, ByVal 0&) Then

    End If

'Cortar:

    If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_CUT, 0, ByVal 0&) Then

    End If

'Borrar:

    If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_CLEAR, 0, ByVal 0&) Then

    End If

'Pegar:

    If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_PASTE, 0, ByVal 0&) Then

Centro de Tecnología Universal (CENTU) 12


API Windows en Visual Basic Facilitador: Donati Portorreal

    End If

'Seleccionar Todo:

    If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM_SETSEL, 0, ByVal


&HFFFF0000) Then

    End If

'Crear un TextBox con 64 KB en lugar de 32

Global Const WM_USER = &H400

Global Const EM_LIMITTEXT = WM_USER + 21

Dim LTmp As long

LTmp = SendMessage(Text1.hWnd, EM_LIMITTEXT, 0, ByVal 0&)

2.- SetWindowWord: crear ventanas flotantes

Declare Function SetWindowWord Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer,
ByVal wNewWord As Integer) As Integer

Declare Function SetWindowWord Lib "User32" Alias "SetWindowWord" (ByVal hwnd As Long,
ByVal nIndex As Long, ByVal wNewWord As Long) As Long

'Crear una ventana flotante al estilo de los tool-bar

'Cuando se minimiza la ventana padre, también lo hace ésta.

Const SWW_hParent = -8

'En Form_Load (suponiendo que la ventana padre es Form1)

If SetWindowWord(hWnd, SWW_hParent, form1.hWnd) Then

End If

3.- Manejo de ventanas...

'Declaración de Funciones para tomar las listas de tareas

Centro de Tecnología Universal (CENTU) 13


API Windows en Visual Basic Facilitador: Donati Portorreal

Declare Function GetWindow Lib "user" (ByVal hWnd As Integer, ByVal wCmd As Integer) As
Integer

Declare Function GetWindowText Lib "user" (ByVal hWnd As Integer, ByVal lpString As String,
ByVal nMaxCount As Integer) As Integer

Declare Function GetWindowTextLength Lib "user" (ByVal hWnd As Integer) As Integer

Declare Function IsWindowVisible Lib "User" (ByVal hWnd As Integer) As Integer

'Declaraciones para 32 bits

Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal
wCmd 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 GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal


hwnd As Long) As Long

Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

'Constantes para GetWindow

Const GW_HWNDFIRST = 0

Const GW_HWNDLAST = 1

Const GW_HWNDNEXT = 2

Const GW_HWNDPREV = 3

Const GW_OWNER = 4

Const GW_CHILD = 5

4.- GetVolumeInformation: volumen de un disco (sólo 32 bits)

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 Long

Ejemplo para leer el volumen de un disco, esta función se puede usar para ¡catalogar los CD's
musicales!

Dim lVSN As Long, n As Long, s1 As String, s2 As String

Centro de Tecnología Universal (CENTU) 14


API Windows en Visual Basic Facilitador: Donati Portorreal

s1=String$(255,Chr$(0))

s2=String$(255,Chr$(0))

l= GetVolumeInformation("unidad", s1, Len(s1), lVSN, 0, 0, s2, Len(s2))

'lVSN tendrá el valor del Volume Serial Number (número de serie del volumen)

Si "unidad" es el CD-ROM y tenemos un disco de música, podemos usar el VSN para hacer un
catálogo de CD's ya que cada CD tiene un número diferente.

5.- GetDriveType: comprobar el tipo de unidad

Para comprobar si es un CD-ROM (o CD-musical):

'Valores de retorno de GetDriveType

Public Const DRIVE_REMOVABLE = 2

Public Const DRIVE_FIXED = 3

Public Const DRIVE_REMOTE = 4

'Estos tipos no están en el fichero de las declaraciones del API de 16 bits

Public Const DRIVE_CDROM = 5

Public Const DRIVE_RAMDISK = 6

'

Declare Function GetDriveType Lib "Kernel" (ByVal nDrive As Integer) As Integer

Declare Function GetDriveType Lib "Kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String)
As Long

Dim lDrive As Long

Dim szRoot As String

szRoot="D:\" 'Poner aquí la unidad del CD-ROM o la que queramos comprobar

lDrive= GetDriveType(szRoot)

If lDrive = DRIVE_CDROM Then

Centro de Tecnología Universal (CENTU) 15


API Windows en Visual Basic Facilitador: Donati Portorreal

    'Es un CD-ROM/Compact-Disc

End If

6.- Dejar una ventana siempre visible

De nuevo usaremos el API de Windows: SetWindowPos

'Declaración para usar ventanas siempre visibles

'Versión para 16 bits

Declare Function SetWindowPos Lib "User" (ByVal hWnd As Integer, ByVal hWndInsertAfter As
Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer,
ByVal wFlags As Integer) As Integer

'Versión para 32 bits

Declare Function SetWindowPos Lib "User32" Alias "SetWindowPos" (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

' SetWindowPos Flags

Const SWP_NOSIZE = &H1

Const SWP_NOMOVE = &H2

'Const SWP_NOZORDER = &H4

'Const SWP_NOREDRAW = &H8

Const SWP_NOACTIVATE = &H10

'Const SWP_DRAWFRAME = &H20

Const SWP_SHOWWINDOW = &H40

'Const SWP_HIDEWINDOW = &H80

'Const SWP_NOCOPYBITS = &H100

'Const SWP_NOREPOSITION = &H200

Const SWP_FLAGS = SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW Or


SWP_NOACTIVATE

Centro de Tecnología Universal (CENTU) 16


API Windows en Visual Basic Facilitador: Donati Portorreal

'Código para poner en Form_Load

'De esta forma no es necesario usar una variable para asignar el valor devuelto:

If SetWindowPos(hWnd, -1, 0, 0, 0, 0, SWP_FLAGS) Then

End if

7.- Usar Sleep en lugar de DoEvents

Por si alguno no lo sabe, DoEvents se usa cuando queremos que otros programas/procesos de
Windows sigan funcionando, de forma que nuestro programa no se apodere de todo el tiempo
de la CPU. Por ejemplo cuando hacemos un bucle que puede durar "mucho", al ejecutar
DoEvents, Windows permite que otros programas sigan funcionando normalmente.

Es aconsejable siempre usar DoEvents ( o Sleep 0&) en los bucles largos. Yo también lo uso
cuando quiero que se "refresque" la información de un control. ¿Cuantas veces has asignado a
un Label un nuevo Caption y no lo ha mostrado?, prueba a poner DoEvents después de la
asignación y verás como se muestra enseguida. (¡oye, esto debería aparecer en los trucos!)

Este truco está sacado de Tips & Tricks, from Visual Basic Web Magazine. Según el autor la
función DoEvents hace lo siguiente:

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {

                TranslateMessage(&msg);

                DispatchMessage(&msg);

Con lo cual gasta tiempo comprobandos otros mensajes en el mismo proceso. Este
comportamiento no tiene valor en un sistema operativo multitarea. Sleep lo hace de forma más
eficiente.

La declaración de Sleep es:

Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Y se puede llamar de la siguiente forma:

Sleep 0&

8.- Manejo del Registro del Sistema

Aquí os pongo algunos ejemplos para usar el Registro con el API de 32 bits.

Centro de Tecnología Universal (CENTU) 17


API Windows en Visual Basic Facilitador: Donati Portorreal

Creo que también vale para 16 bits, no lo he probado, pero sólo habrá que cambiar la
declaración de las funciones. Por si vale, pondré también las declaraciones de 16 bits. Pero
que conste que no las he probado.

Si quieres un ejemplo con todas estas funciones, echale un vistazo al código del programa
gsExecute, que está en gsExec.zip (19 KB) La explicación de cómo funciona este programa la
encontrarás en Programas de Visual Basic.

Normalmente, para obtener los programas asociados a una extensión, sólo es necesario usar
la función: RegQueryValue. La siguiente función de ejemplo, es la que uso para obtener
información de una clave del registro:

Public Const HKEY_CLASSES_ROOT = &H80000000

Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" _

                (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, _

                 lpcbValue As Long) As Long

'Busca una entrada en el registro

Private Function QueryRegBase(ByVal Entry As String, Optional vKey) As String

    Dim buf As String

    Dim buflen As Long

    Dim hKey As Long

    'Si no se especifica la clave del Registro, usar HKEY_CLASSES_ROOT

    If IsMissing(vKey) Then

        hKey = HKEY_CLASSES_ROOT

    Else

        hKey = CLng(vKey)

    End If

   

    On Local Error Resume Next

    buf = Space$(300)

    buflen = Len(buf)

    'Buscar la entrada especificada y devolver el valor asignado

Centro de Tecnología Universal (CENTU) 18


API Windows en Visual Basic Facilitador: Donati Portorreal

    If RegQueryValue(hKey, Entry, buf, buflen) = 0 Then

        If buflen > 1 Then

            'El formato devuelto es ASCIIZ, así que quitar el último caracter

            QueryRegBase = Left$(buf, buflen - 1)

        Else

            QueryRegBase = ""

        End If

    Else

        QueryRegBase = ""

    End If

    'Desactivar la detección de errores

    On Local Error GoTo 0

End Function

Para usarla, por ejemplo para saber el programa asociado para abrir una determinada
extensión, de que programa se obtiene el icono y que número de icono es:

NOTA: Para usar este ejemplo, hay que tener un control List2 en el Form y la rutina mostrada
antes.

Private Sub BuscarExtensionID(sExt As String)

    Dim lRet As Long

    Dim sKey As String

    Dim sValue As String

    Dim hKey As Long

    Dim sExe As String

    Dim sIcon As String

    Dim lIcon As Long

    Dim sProgId As String

    Dim i As Integer

   

    Caption = "Mostrar asociaciones de la clave: " & sExt

Centro de Tecnología Universal (CENTU) 19


API Windows en Visual Basic Facilitador: Donati Portorreal

    List2.Visible = True

    List2.Clear

    List2.AddItem "Valores del Registro para " & sExt

    '

    'Buscar en el registro la extensión...

    sProgId = QueryRegBase(sExt)

    If Len(sProgId) Then

        List2.AddItem "Clave: " & sProgId

        sKey = sProgId & "\DefaultIcon"

        List2.AddItem sKey

        sValue = QueryRegBase(sKey)

        If Len(sValue) Then

            i = InStr(sValue, ",")

            If i Then

                sIcon = Left$(sValue, i - 1)

                lIcon = Val(Mid$(sValue, i + 1))

            Else    'No tiene programa para Defaulticon

                sIcon = sValue

                lIcon = 0

                sValue = ""

            End If

        End If

        List2.AddItem "   Icono de: " & sIcon

        List2.AddItem "   Icono nº: " & lIcon

        '

        'Obtener el programa asociado por defecto para Abrir

        'no quiere decir que este sea el que se ejecute cuando se haga doble-click

        sKey = sProgId & "\Shell\Open\Command"

Centro de Tecnología Universal (CENTU) 20


API Windows en Visual Basic Facilitador: Donati Portorreal

        sValue = QueryRegBase(sKey)

        If Len(sValue) Then

            i = InStr(sValue, ".")

            If i Then

                i = InStr(i, sValue, " ")

                If i Then

                    sExe = Trim$(Left$(sValue, i - 1))

                Else

                    sExe = Trim$(sValue)

                End If

            Else

                sExe = Trim$(sValue)

            End If

        End If

        List2.AddItem sKey

        List2.AddItem "   Programa asociado: " & sExe

    End If

End Sub

Ejemplo para crear claves en el Registro:

Para no alargar demasiado este fichero, aquí sólo están las declaraciones de las funciones; en
los listados del programa gsExecute, hay ejemplos de cómo crear y borrar claves para
asociar/desasociar un programa a una extensión determinada.

'Claves del Registro

Public Const HKEY_CLASSES_ROOT = &H80000000

Public Const HKEY_CURRENT_USER = &H80000001

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const HKEY_USERS = &H80000003

'

'Para los valores devueltos por las funciones de manejo del Registro

Centro de Tecnología Universal (CENTU) 21


API Windows en Visual Basic Facilitador: Donati Portorreal

Public Const ERROR_SUCCESS = 0&

Public Const ERROR_NO_MORE_ITEMS = 259&

'

' Tipos de datos Reg...

Public Const REG_SZ = 1

'

'Declaraciones del API de Windows para 32 bits

Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As


Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long

Declare Function RegEnumKey Lib "advapi32" Alias "RegEnumKeyA" (ByVal hKey As Long,
ByVal iSubKey As Long, ByVal lpszName As String, ByVal cchName As Long) As Long

Declare Function RegOpenKey Lib "advapi32" Alias "RegOpenKeyA" (ByVal hKey As Long,
ByVal lpszSubKey As String, phkResult As Long) As Long

Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long

Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As


Long, ByVal lpSubKey As String, phkResult As Long) As Long

Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long,
ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As
Long) As Long

Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As


Long, ByVal lpSubKey As String) As Long

'Declaraciones para el API de 16 bits

Declare Function RegQueryValue Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As
String, ByVal lpValue As String, lpcbValue As Long) As Long

Declare Function RegEnumKey Lib "shell.dll" (ByVal hKey As Long, ByVal iSubKey As Long,
ByVal lpszName As String, ByVal cchName As Long) As Long

Declare Function RegOpenKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpszSubKey As
String, phkResult As Long) As Long

Declare Function RegCloseKey Lib "shell.dll" (ByVal hKey As Long) As Long

Declare Function RegCreateKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As String,
phkResult As Long) As Long

Declare Function RegSetValue Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As String,
ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long

Centro de Tecnología Universal (CENTU) 22


API Windows en Visual Basic Facilitador: Donati Portorreal

Declare Function RegDeleteKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As String)
As Long

Una nota de precaución:

Si vas a trabajar con el registro del sistema, te recomiendo que antes hagas copia del mismo.
En el CD de Windows 95, hay una utilidad: ERU.exe que copia los archivos del Sistema, así
como Autoexec, etc. Si no tienes este programa, copia los archivos System.dat y User.dat que
están el directorio de Windows.

Suerte y que no se te cuelgue!

9.- Diálogos comunes usando el API de Windows (16 y 32 bits)

Las funciones para manejar los diálogos comunes del API de Windows, son las siguientes:

Nota: En 16 bits no están todas las que son, es que no tengo ahora a mano el fichero con las
declaraciones para seleccionar el color y las fuentes. Si las necesitas, no dudes en pedirlas, las
buscaré. en algún sitio tengo que tenerlas. 8-)

'Declaraciones para el API de 16 bits

'Abrir y guardar

Declare Function GetOpenFileName Lib "commdlg.dll" (lpofn As tagOpenFileName) As Integer

Declare Function GetSaveFileName Lib "commdlg.dll" (lpofn As tagOpenFileName) As Integer

'Buscar y reemplazar (aún no he podido ponerlas en marcha???)

Declare Function FindText Lib "commdlg.dll" (lpFR As tagFindReplace) As Integer

Declare Function ReplaceText Lib "commdlg.dll" (lpFR As tagFindReplace) As Integer

'Para la impresora

Declare Function PrintDlg Lib "commdlg.dll" (tagPD As tagPrintDlg) As Integer

'

'Declaraciones para 32 bits

'Abrir y guardar

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA"


(pOpenfilename As OPENFILENAME) As Long

Centro de Tecnología Universal (CENTU) 23


API Windows en Visual Basic Facilitador: Donati Portorreal

Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA"


(pOpenfilename As OPENFILENAME) As Long

Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String,
ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer

'Buscar y reemplazar

Declare Function FindText Lib "comdlg32.dll" Alias "FindTextA " (pFindreplace As


FINDREPLACE) As Long

Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" (pFindreplace As


FINDREPLACE) As Long

'Para la impresora

Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG) As


Long

Declare Function PageSetupDlg Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As


PAGESETUPDLG) As Long

'Para los colores

Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As


CHOOSECOLOR) As Long

'Las fuentes

Declare Function ChooseFont Lib "comdlg32.dll" Alias "ChooseFontA" (pChoosefont As


CHOOSEFONT) As Long

No incluyo ejemplos ni las declaraciones de los tipos, por ser demasiado "grandes". Pero las
incluyo en un listado con ejemplos para abrir, etc., aunque con las funciones para 16 bits, ya
que desde que uso el VB para 32 bits, suelo hacerlo con el control que trae. Si quieres ver
ejemplos usando el control de diálogos comunes, pasate por la página de trucos.

10.- Mostrar un icono en la barra de tareas

Gracias a Joe LeVasseur por enviar este ejemplo de cómo crear un icono en la barra de tareas.

Aquí pongo parte del código, para los que sólo quieren echar un vistazo:

'---------------

Private Type TIPONOTIFICARICONO

    cbSize As Long

    hwnd As Long

    uId As Long

Centro de Tecnología Universal (CENTU) 24


API Windows en Visual Basic Facilitador: Donati Portorreal

    uFlags As Long

    ucallbackMessage As Long

    hIcon As Long

    szTip As String * 64

End Type

'------------------

Private Const NIM_ADD = &H0

Private Const NIM_MODIFY = &H1

Private Const NIM_DELETE = &H2

Private Const WM_MOUSEMOVE = &H200

Private Const NIF_MESSAGE = &H1

Private Const NIF_ICON = &H2

Private Const NIF_TIP = &H4

Private Const WM_LBUTTONDBLCLK = &H203

Private Const WM_LBUTTONDOWN = &H201

Private Const WM_LBUTTONUP = &H202

Private Const WM_RBUTTONDBLCLK = &H206

Private Const WM_RBUTTONDOWN = &H204

Private Const WM_RBUTTONUP = &H205

'--------------------

Private Declare Function Shell_NotifyIcon Lib "shell32" _

    Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, _

    pnid As TIPONOTIFICARICONO) As Boolean

'--------------------

Private Declare Function WinExec& Lib "kernel32" _

    (ByVal lpCmdLine As String, ByVal nCmdShow As Long)

'--------------------

Dim t As TIPONOTIFICARICONO

Centro de Tecnología Universal (CENTU) 25


API Windows en Visual Basic Facilitador: Donati Portorreal

Private Sub Form_Load()

    If App.PrevInstance Then

        mnuAcerca_Click

        Unload Me

        End

    End If

'---------------------------------

    t.cbSize = Len(t)

    t.hwnd = picGancho.hwnd

    t.uId = 1&

    t.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE

    t.ucallbackMessage = WM_MOUSEMOVE

    t.hIcon = Me.Icon

'---------------------------------

    t.szTip = "Ejemplo de barra de tareas..." & Chr$(0) ' Es un string de "C" ( \0 )

    Shell_NotifyIcon NIM_ADD, t

    Me.Hide

    App.TaskVisible = False

End Sub

11.- Cómo usar el marcador telefónico de Windows 95

Gracias de nuevo a Joe LeVasseur por enviar este ejemplo.

Aquí lo que se muestra es sólo la forma de usarlo.

Private Declare Function tapiRequestMakeCall& Lib "TAPI32.DLL" (ByVal DestAddress&, ByVal


AppName$, ByVal CalledParty$, ByVal Comment$)

Private Sub Command1_Click()

Centro de Tecnología Universal (CENTU) 26


API Windows en Visual Basic Facilitador: Donati Portorreal

    Dim ValDev&, Numero$, NombreProg$, Quien$

    Numero = "123-4567"

    NombreProg = "Mi Programa"

    Quien = "Pepe"

    ValDev = tapiRequestMakeCall(Numero, NombreProg,Quien,"")

End Sub

12.- Leer la etiqueta y el número de serie de un disco. (Sólo 32 bits)

La función que se usa para esto, es GetVolumeInformation, que está en el punto 4, pero lo que
ahora pongo, es un ejemplo de cómo usarla.

El ejemplo es un form con una caja de texto en la que se introduce la unidad (directorio raíz,
realmente), de la que queremos mostrar la información.

Como no es un listado muy grande, lo pongo al completo.

'---------------------------------------------------------------------------

'Form de prueba para leer la etiqueta y el número de serie de un disco.

'---------------------------------------------------------------------------

Option Explicit

'Declaración de la función, sólo está en el API de 32 bits

'

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 Long

Centro de Tecnología Universal (CENTU) 27


API Windows en Visual Basic Facilitador: Donati Portorreal

Private Sub Command1_Click()

    'Acción

    Dim lVSN As Long, n As Long, s1 As String, s2 As String

    Dim unidad As String

    Dim sTmp As String

    On Local Error Resume Next

    'Se debe especificar el directorio raiz

    unidad = Trim$(Text1)

    'Reservar espacio para las cadenas que se pasarán al API

    s1 = String$(255, Chr$(0))

    s2 = String$(255, Chr$(0))

    n = GetVolumeInformation(unidad, s1, Len(s1), lVSN, 0, 0, s2, Len(s2))

    's1 será la etiqueta del volumen

    'lVSN tendrá el valor del Volume Serial Number (número de serie del volumen)

    's2 el tipo de archivos: FAT, etc.

    'Convertirlo a hexadecimal para mostrarlo como en el Dir.

    sTmp = Hex$(lVSN)

    Label3(0) = s1

    Label3(1) = Left$(sTmp, 4) & "-" & Right$(sTmp, 4)

    Label3(2) = s2

End Sub

Private Sub Command2_Click()

    Unload Me

    End

End Sub

Centro de Tecnología Universal (CENTU) 28


API Windows en Visual Basic Facilitador: Donati Portorreal

Private Sub Form_Unload(Cancel As Integer)

    'Asegurarnos de "liberar" la memoria.

    Set Form1 = Nothing

End Sub

Ahora un "retrato" del Form:

Otras cosas más que se pueden hacer con SendMessage.

La declaración de esta función del API, para 16 y 32 bits, está en el punto 1

Const WM_USER = 1024

Const EM_GETLINECOUNT = WM_USER + 10

Const EM_LINEFROMCHAR = WM_USER + 25

TotalLineas = SendMessage(Text1.hWnd, EM_GETLINECOUNT, 0, 0&)

LineaActual = SendMessage(Text1.hWnd, EM_LINEFROMCHAR, -1, 0&) + 1

13.- Uso de PostMessage en lugar de SendMessage

En la lista de distribución VB-ES, leí una respuesta sobre que es preferible, en 32 bits, usar
PostMessage en lugar de SendMessage.

Quiero aclarar que el valor devuelto por la función PostMessage, es si ha podido poner el
mensaje en la cola o no.

Por tanto, si usas SendMessage para recibir un valor, el ejemplo anterior es un caso, no se te
ocurra cambiarla por PostMessage.

En los demás casos, en los que simplemente queremos enviar un mensaje a la cola de
Windows y no necesitamos esperar a que la operación termine, si podemos usar PostMessage,
ya que esta función trabaja de forma "asíncrona" y devolverá el control a VB antes que
SendMessage, que trabaja de forma "síncrona" y hasta que no acabe "su tarea" no vuelve a
casa.

La declaración de PostMessage para el API de 16 y 32 bits:

'Declaración del API de 32 bits

Declare Function PostMessage Lib "User32" Alias "PostMessageA" _

                                (ByVal hwnd As Long, ByVal wMsg As Long, _

Centro de Tecnología Universal (CENTU) 29


API Windows en Visual Basic Facilitador: Donati Portorreal

                                 ByVal wParam As Long, ByVal lParam As Long) As Long

'Declaración del API de 16 bits

Declare Function PostMessage Lib "User" _

                                (ByVal hWnd As Integer, ByVal wMsg As Integer, _

                                 ByVal wParam As Integer, lParam As Any) As Integer

Centro de Tecnología Universal (CENTU) 30

También podría gustarte