Está en la página 1de 17

a

I
¡

I
q.

API de Windows 1

lxdiqe
¿Que es el API de Win32?
Llamadas a las Funciones API
Librerias Dinamicas
Declarando una Funcion DLL
Algunas Funciones API
Ejémplo : GetDeviceCaps
Ejempl o : Getüli ndowsDi rectory
Ejemplo: Rotar un Texto
Algunas APls lnteresantes...

¿Qué es el API Win32?

-t
Win32 es un coniunto de funciones, tipos y mensaies pre{efinidos para poder prooramar
i
t sobre los sistemás operativos de 32 tiits de Microéoft.'El API Win32, sur§e par'a cübrir la
necesidad de crear un sistema operativo
de32 bits como es Windorms 95, frente al API de 16 bits existente de Windows 3.1. Surge
el problema de que Win32, ¡o.qs compqtiblg con el API de 16 bits, lo que implica que-si
queremos portar un código de Windows 3.1
a Windovvs_ 95, deberemos reescribir el codigo. Aunque hemos dicho que elAPl 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 lim-ita- cíones entre ambos API soh:

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


¡ No tiene API de cornunicaciones.
r 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 trabaio
de Windows debe
,t
conocer también su entorno de programación, conocido generalmente como interfaz de
programación de aplicaciones de Wiñdows ( Windows Application Programming lnterface,
bbráv¡adamente Windows API ).
:
La característica primaría de la API de Windous son las funciones y los mensajes
internos/externos de

\
enlace-con la aplicacióñ 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 APl, y a continuación se descarga.

La gran véntaja que posee este método- es


-- que
-r- no es necesario tener gran cantidad
decódigócargado
en memoria a la hora de ejecutar nuestra aplicación. En contra, es necesario que cuando
llevemos nuestro ejecutablé a otra instalación, tengamos que llevar las DLLs neicesarias.

También tenemos que pensar que si utilizamos las DLLS que nos proporciona
Windows, en cualquier
máquina con este sistema operativo vamos a en@ntrar esas mismas DLLs, con lo cual no
es ne@sano 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 ac{ualizar sin tener que modificar los programas que las utilizan.
Otra ventaja es el
ahono de memo6?fJr*'Oal y de disco ya que como es Windorne quien administra la
utilización de las I
no existe duplicidad de codigo cuando varias aplicaciones las utilizan.

.También, como todo fieje) tíene inconvenientes. Uno de ellos es el tiempo que
Windows tiene oue emoleaÍ
en leer las funciónes qüe el programa necesita utilizar de una DLL.

Otra desventaja es que cada programa ejecutable necesita que estén presentes las
DLLs oue 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 Windona tenemos gran cantidad de DLLs, agrupando las APls 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 declanar 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 serción de declaraciones de la forma
o del módulo conespondiente. Por ejemplo:

Declare Function lopen Lib "kernel" Alias "_lopen" (Byval lpPathname as string, Byval

\
!

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, p.!es .l-a mayoría de las APls retoman 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 rnetiendo dentro de la función es el contenido
de la variable, mientras
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 decír, no
hos interesa la posición de memoria de la variable, sino su contenido. Al trabajar con APls
la cosa cambia. La mavoría
de estas funciones esián desarrolladas en C, y en este lenguaje se r.rtiliza 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 argurnento por valor, se debe de escribir la palabra clave ByVal
delante de [a decfaració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 "Kemel" (lpCatchBuf As Any) As lnteger

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

Algunas Funciones de la APl.


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

- Funciones de direccionamiento de memoria a 32 bits.


Recupera elAPl para aplicaciones que utilizAn 32 bits.

- Funciones de eiecución de aplicaciones. -


Tiene 1á función de cargar y ejecutar aplicaciones.
ej:
[J!!ñlEo,'"
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.
Fin_dExecutable: récupera el nombre del ejecutable asoc¡ado a
un fichero especificado.
- Funciones "Stress"
Controla espacio libre v maneiadores de ficheros (handles),
AllocDiskS.¡iace: crea ún fichéro del espacio coniumido eín una partición del
disco ( instalar software).

- Funciones TrueType
Funciones que controlan los fuentes o tipos de letra a utilizar.
GetRasterizarCaps: recupera el estacio del típo de letra en un sistema.
Cuando se hace un cambio dei
tipo de letra , reestableee el que hay por defecto.

- Funciones de versión.

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

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

- Funciones KERNEL.
Lleva a cabo una EIS 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.
GetDriverlnfo: recupera datos de un dispositivo instalable.
Copylcon: copia un icono.
Pr¡vate-Srb Command2 Click l)
Dim Camino As Strino-
Camino = Strino( 25d 0 )
w = GetWindoriGD_irectory ( Camino, Len(camino))
Label3.Caption = Camincí
w = GetSybtemDirectory ( Camino, Len(Camino))
Label4.Cáotion = Camiíxi
End Sub

Por último queria comentar una utilidad realizada con llamadas a APls. Consiste en el
efecto de poder rotar
.u¡ teryto, 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.

En primer lugar debemos definir dos estructuras. La primera nos va a permitir


introducir una posicíón del texto, y la segunda es una definición completa de unei fuente
por el usuario.

Type RECT
LEFT As lnteoer
TOP As lnteoér
RIGHT As lnieger
_ BO_TTOM As ln"teger
End Type

Global Const F_TAMNOMBRE = 32

Type FUENTE
FANCHO As lnteger
FLARGO As lnte§er
FESCAPE As lntéoer
FORIENTACION As lnteoerv
FWEIGHT As lnteger
FITALICA As Strinó " 1
FUNDERLINE As §tring * 1
FSTRIKEOUT As Strinó * 1
FCHARSET As Strino *-1
FOUTPRECTSION A5 Strino " 1
FCLIPRECISION As Strinor 1
FQUALITY As Strino * 1
FPITCHANDFAMILY As StTino * 1
FNOMBRE As String * F_TAMNOMBRE
End Type

Global Const TRANSPARENTE = 1


Global Const OPACO = 2

Como se ha comentado antes, se utilizan varias APls para realizar este efecto. Todo
ellas son de la
librería GDl, excepto una de USER.
evuelve información sobre el disco duro)
(Devuelve
)evuelve la capacidad de un disco maVor
may de 2Mb.)
(Nombre del Disco, tipo de formato y riumero de disco)
;'(De-vuelve las uni<iaüe9 disponibleé en un ordenadori

Devuelve la

sobre la memoria fisica disponible)


: la versión del Windows)
(Cambia elfondo de panialla del Windovrs)
un archivo a la papelera de reciclaje)
lustra la ruta dejl W¡nOows)
stra la ruta del directorio System de Windows)
'sonidos WAV)
el archivo-e-jecutable.asoqgdg q un archivo, y muetra el icono)
'§etx'e-v-oóárlstáteeystñnqtsálétóirínái:vóáséiéééióÍal,
(lndica si una aplícación determinada esta en eiecución)
!g]gE!!& (Activa/Desactiva las teclas de Escape - CTRL+ALT+SUB -
(Devuelve los colores del Windows)
páoina de código
rrmina la página códioo ANSI vi§ente)
viqente
:ondery labarra delareas
er v mostrar lábarra de tareas del Windows)
o Éeinicia el Windows 95/98)

(Devuelve y establece parámetros del sistema de Windowsi


API de Windows 2

hav que tener a mano


rs flotantes
irñátióh: leer el volumen de n disco (32 bits)
cornorobar el tioo de unida,
rna §iemore vislble
uqar de DoEvents

L- SendMessage: la que siempre hay que tener a mano


'Declaración delAPl de 16 bits

Declare Function SendMessage Lib "User" _


(ByVal hWnd As lnteger, ByValult4sg As Integer, _

ByValwParam As lnteger, lParam As Any) As Long

'Declaración delAPl de 32 bits.

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

(ByVal hwnd As Long, ByValurMsg As Long, _

ByValr,vParam As Long, lParam As Long) As Long

'Utilidades para un menú de edición:

'Declaración de las constantes


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

End lf

'Pegar:

lf SendMessage(Soeen.ActiveForm.ActiveControl.hWnd, WM_PASTE, 0, ByVal 0&)


Then

End lf

'Seleccionar Todo:

lf
SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM- SETSEL, 0, ByVal
&HFFFF0000) Then

End lf

'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_L|M|T[EXT, 0, ByVal 0&)

2.- SetWindowWord: crear ventanas flotantes


Declare Function SetWindoraM/ord Lib "User'' (ByVal hWnd As lnteger, ByVal nlndex As
lnteger, ByValvNewWord As lnteger) As lnteger

Declare Function SetWindowWord Lib "User32" Alias "SetWindouilVord" (ByVal hvurd As


Long, ByVal nlndex As Long, ByVal vNewWord As Long) As Long

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

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

Const SWW hParent = -8


4.- GetVolumelnformation: volumen de un disco (sólo 32 bits)
Declare Function GetVolumelnformation Lib "Kernel32" Alias
"GetVolumelnformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNarn
As
fq. String, nlgtüry,gtttanieSize As Long,
Slring, ByVal nVolumeNameSize lpVolumeSerialNumber As Long,
^
loMaximumComoonentLenoth
lpMaximumCorirponentLength As Lono. Lg§,
Long, ;ysremhrags
loFileSvstemFlaos
lpFileSystemFlags As
AS
Lono.
Long, ByVal
NameSize As Long) As Lo
lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize Long

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

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

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

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

l= GetVolumelnformation("unidad", s1, Len(s1), IVSN,0, O, s2, Len(s2))

'IVSN 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: cornprobar 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 elfichero de las declaraciones delAPl de 16 bits

Public Const DRIVE_CDROM = 5

Public Const DRIVE_RAMDISK = 6


'Const SWP_NOREDRAW = &H8

Const SWP_NOACTIVATE = &H10

'Const SWP_DRAWFRAME = &H20

Const SWP_SHO\MA/INDOW = &H40

'Const §WP_HIDEWINDOW = &H80

'Const SWP_NOCOPYBITS = &H100

'Const SWP_NOREPOSITION = &H200

Const SWP FLAGS = SWP NOMOVE Or SWP NOSIZE Or SWP SHOWWINDOW Or


SWP-NOA§TIVATE

'Código para poner en Form_Load

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

lf SetWindovrPos(hWnd, -1, 0, 0, 0, 0, SWP_FLAGS) Then

End if

7.- Usar Sleep en lugar de DoEvents


Por si
alguno no losabe, DoEvents se usa cuando queremos que otros
programas/procesos de Windows sigan funcionando, de forma que nuestro programa no
se apodere Qe todo..el .tiempo de_laCPU. Por e.jemplo cuando hacemos un bucle.que
puede durar "mucho", al ejecutar DoEvents, Windows permite que otros programas sigan
funcionando normalmente.

Es aconseiable siemore usar DoEvents ( o Sleep 0&) en los bucles laroos. Yo también lo
uso cuandb quiero que se "refresque" ld információrí de un control. ¿Cuantas veces has
asignado a un Label un nuevo Caption y no lo ha mostrado?, pruebá a poner DoEvents
después de la asignación y verás como se muestra enseguida. (¡oye, esto debería
aparecer en los trucosl)

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 );
'l

Dim hKey As Long

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

lf lsMissing(vKey) Then

hKeY = HKEY-CLASSES-ROOT

Else

hKeY = CLng(vKeY)

End lf

On Local Error Resume Next

buf = Space$(300)

buflen = Len(buf)

'Buscar la entrada especificada y devolver el valor asignado

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

lfbuflen>1Then
'Elformato devuelto es A§CllZ, así que quitar el último caracter

QueryRegBase = Left$(buf, buflen - 1)

Else

QueryRegBase = ""

End lf

Else

QueryRegBase = ""

End lf

'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
lf i Then

slcon = Left$(sValue, i- 1)

llcon = Va¡(Mid$(sValue, ¡ + 1))

Else 'No tiene programa para Defaulticon

slcon = sValue

llcon = 0

sValue = ""

End lf

End lf

List2.Addltem " lcono de: " & slcon

List2.Addltem " lcono no: " & llcon

'Obtener el programa asociado por defecto para Abrir

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

sKey = sProgld &'\Shell\Open\Command"

sValue = QueryRegBase(sKey)

lf Len(sValue) Then

i= lnStr(sValue, ".") :

lf iThen

í = lnStr(i, sValue, " ")


lf i Then

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

Else

sExe = Trim$(sValue)

End lf
!-ong, ByVal iSubKey-As Long,- ByVal lpszñame As String, ByVal cchName As Lon§) As
Long

Declare Function RegOpenKey Lib "advapt32" Alias "RegOpenKeyA" (ByVal hKey As


Long, ByVal lpszSubKey'As Stríng, phkResün ns Long) As [ong

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

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


As Long, ByVal lpSubXey As Stñng, phkRes'ult As Long) As Loñg

Declare Function RegSetValue Lib "advapi32 dll" Alias "RegSetValueA' (ByVal hKey As
Lolg, 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 lpSubKdy As Strin§) As Long

'Declaraciones para elAPl de 16 bits

Declare Function RegQueryValue Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As
String, ByVal lpValue-As Stíing, lpcbValue ns LohSí) As Lon§

Declare Function RegEnumKey Lib "shell.dll" (ByVal hKey As Long, ByVal iSubKey As
Long, ByVal lpszNamé As Strin§, ByVal cchNaniehs Long)-As Long -'

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

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 [ong) As Lbng

Declare Function RegSetValue Lib "shell.dll" (ByVal hKev As Lono. BvVal lpSubKev As
String, ByVal dwTypeas Long, ByVal lpData Ai String, ByVal cbDatá A§ Lond) As Loñg

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

Una nota de precaución:

Si vas a trabaiar con el registro del sistema, te recomiendo que antes hagas copia del
mismo. En el CD Oe Winddws 95, hay una ütil¡dad: ERU.exe üue copia los-arcfriüos det
Sistema,. así-como Autoexec, etc. Si no tienes este progrbma,'copia los archivos
System.dat y User.dat que están el directorio de Windows.' -

Suerte y que no se te cuelgue!


Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTe)dA" (pFindreplace As
FINDREPLACE) As [ong

'Para la impresora

Declare Function PrintDlg Lib "comdlg32.dll" Alias "Pr¡ntDlgA" (pPrintdlg As PRINTDLG)


As Long

Declare Function PaoeSetupDlo


-As
Lib "comdls32.dll" Alias
"PageSetupD lgA' (pPagesetupd lg PAG E§ETU P D LG ) As Long

'Para los colores

Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA' (p0hoosecolor


As CHOOSECOLOR) As Long

'Las fuentes

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


CHOOSEFONT) As Long

No incluyo ejemplos ni las declaraciones de los tipos, por ser demasiado "grandes". Pero
las incluio eh uñ listado con eiemolos oara abrir.'etc.. aunque con las funéiones para 16
bits, ya (ue desde que uso el'VB'pqrá.l1bit§r.áuelo haceilo con el control que-'trae. Si
quierés üer ejemplo§ usando el cóntrol de diálogos comunes, pasate por la'página de
trucos.

10.- Mostrar un icono en ¡a 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 Tl PONOTI FICARICONO

cbSize As Long

hwnd As Long

uld As Long

uFlags As Long

' ucallbackMessage As Long


Private Sub Form_Load$

lf App.Prevlnstance Then

mnuAcerca_Click

Unload Me

End

t.cbSize = Len(t)

t.hwnd = picGancho.hwnd

t.uld = 1&

t.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE

t. ucallbackMessage = WM_MOUSEMOVE

t.hlcon = Me.lcon
al

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

Shell_Notifylcon NIM_ADD, t

Me.Hide

App.TaskVisible = False

End Sub

1{.- Cómo usar el marcador telefón¡co de Windows 95


Gracias de nuevo a Joe LeVasseur por enviar este elemplo.

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

Private Declare Fu¡clig4 lap.jRg_questMakeCall& Lib'TAP|32.DLL" (ByVal DestAddress&,


ByVal AppName$, ByVal CalledParty$, ByVal Comment$)
ByVal lpFileSystemNameBuffer As String, _

ByVal nFileSystemNameSize As Long)As Long

Private Sub Commandl_Clíck()

'Acción

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

Dim unidad As String

Dím 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 = Stringg(255, Cnr$(O))

s2 = String$(2s5, Cnr$(O))

n = GetVolumelnformation(unidad, s1, Len(s1), IVSN, 0, 0, s2, Len(s2))

's1 será la etiqueta del volumen

'IVSN tendrá el valor delVolume 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$(IVSN)

Label3(O) = s1

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

Label3(2) = 52

End Sub
t-
a
a

I ,area" no vüelve a casa.

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

'Declaración delAPl de 32 bits

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

(ByVal hwnd As Long, ByValwMsg As Long, _

ByValwParam As Long, ByVal lParam As Long) As Long

'Declaración del API de 16 bits

Declare Function PostMessage Lib "User'' _

(ByVal hWnd As lnteger, ByVal wMsg As lnteger, _

ByValr¡rParam As lnteger, lParam As Any) As lnteger

L J

También podría gustarte