11 funciones de la API de Windows que los desarrolladores de Office deben conocer

Los desarrolladores de Office dependen mucho de VBA. Sin embargo, aunque es versátil y robusto, no lo hace todo. A veces, una solución de VBA es complicada o difícil de implementar. Cuando eso sucede, recurra a la Interfaz de Programación de Aplicaciones de Windows (API). Encontrarás miles de funciones útiles. Aunque los desarrolladores de Office deberían encontrar útiles las API en este artículo, no solo son para Office. Puedes usarlas en la mayoría de las aplicaciones basadas en Windows. (Todos estos consejos son específicos para sistemas de 32 bits).

Las funciones de VBA proporcionadas en este artículo no están listas para uso real. Son simples llamadas a la API, para que puedas ver cómo las piezas funcionan juntas. Sin embargo, algunas podrían moverse fácilmente a tu biblioteca de código tal como están. Ejecuta los procedimientos de VBA desde la ventana Inmediato, pasando los argumentos necesarios, para ver los resultados. Una vez que sepas cómo llaman los procedimientos de VBA a las funciones de la API y qué esperar a cambio, puedes modificar los procedimientos según sea necesario y utilizarlos en tus propios proyectos.

Índice de Contenido
  1. 1: Sleep
  2. 2: GetUserName
  3. 3: GetComputerName
  4. 4: BringWindowToTop
  5. 5: FindWindow
  6. 6: FindExecutable
  7. 7: GetActiveWindow
  8. 8: GetTempPath
  9. 9: GetTempFileName
  10. 10: GetDesktopWindow
  11. 11: ShowWindow

1: Sleep

La función Sleep suspende la ejecución durante un período especificado. Coloca el código en ejecución en un estado inactivo durante el número de milisegundos que se pasa a la función. Simplemente declara la función y luego llámala como se muestra desde un procedimiento de VBA:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep milisegundos

2: GetUserName

Si necesitas saber quién está conectado a una base de datos de Access, usa GetUserName. Hay otras formas de hacer esto sin llamar a una API, pero esta es tan simple, ¿por qué molestarse en escribir tu propio código? GetUserName recupera el nombre del sistema actual o el nombre del usuario actual conectado a la red. Declárala y llámala, pasando la información apropiada, de la siguiente manera:

Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function apicGetUserName() As String
  'Llamado a apiGetUserName devuelve usuario actual.
  Dim lngRespuesta As Long
  Dim strUsuario As String * 32
  lngRespuesta = GetUserName(strUsuario, 32)
  apicGetUserName = Left(strUsuario, InStr(strUsuario, Chr$(0)) - 1)
End Function

3: GetComputerName

Esta próxima función, GetComputerName, es similar a GetUserName excepto que recupera el nombre del sistema. Declárala y llámala de la siguiente manera:

Private Declare Function GetComputerName Lib "kernel32" Alias _
 "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function apicGetComputerName() As String
  'Llamada a apiGetUserName devuelve usuario actual.
  Dim lngRespuesta As Long
  Dim strUsuario As String * 32
  lngRespuesta = GetComputerName(strUsuario, 32)
  apicGetComputerName = Left(strUsuario, InStr(strUsuario, Chr$(0)) - 1)
End Function

4: BringWindowToTop

Esta función de la API lleva la ventana especificada a la parte superior. Si la ventana es una ventana de nivel superior, la función la activa. Si la ventana es una ventana secundaria, la función activa la ventana principal asociada. Simplemente pasa el identificador de ventana adecuado. Si la función falla, devuelve 0; si tiene éxito, devuelve un valor distinto de cero. Utiliza la siguiente declaración:

10 tipos de empleados que no quieres ser
Private Declare Function BringWindowToTop Lib "user32" _
(ByVal lngHWnd As Long) As Long

Cuando llames a la función, pasa el valor del identificador de ventana como una variable Long.

5: FindWindow

BringWindowToTop requiere un valor de identificador. Necesitarás FindWindow, otra API, para eso. Esta puede ser un poco frustrante porque requiere información especializada y si no lo haces bien, la función no funcionará. Específicamente, necesitas la clase o nombre de la ventana, como se muestra en la llamada simple a continuación. Esta función devuelve el identificador del documento de Word December2010.docx.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Function apicFindWindow(strClassName As String, strWindowName As String)
  'Obtiene el identificador de la ventana.
  Dim lngWnd As Long
  apicFindWindow = FindWindow(strClassName, strWindowName)
End Function

Los nombres de clase para las tres principales aplicaciones de Office son los siguientes:

  • Microsoft Access - OMain
  • Microsoft Excel - XLMAIN
  • Microsoft Word - OpusApp

El nombre de la ventana (lpWindowName) suele ser el título de la ventana; consulta la barra de título de la ventana. Si tienes suerte, pasar el objeto en la siguiente forma funcionará:

objeto.Caption

Por ejemplo, podrías intentar la siguiente declaración para devolver el identificador de un formulario de Excel llamado ufrmEmployees:

FindWindow(vbNullString, ufrmEmployees.Caption)

Desafortunadamente, no siempre funciona de esa manera. Si la función devuelve 0, no funcionó: un identificador de ventana nunca es 0. Si omites uno de los parámetros (no son necesarios ambos), pasa vbNullString.

Decidiendo entre clave primaria natural y de sustitución: 10 consejos infalibles

Si tienes problemas para obtener la propiedad lpWindowName, obtén una copia de AutoIt. Esta herramienta devuelve el nombre exacto de la ventana para las ventanas abiertas. ¡Gracias a Stuart McLachlan de Lexacorp por recomendar esta herramienta útil!

6: FindExecutable

¿Alguna vez has necesitado saber qué está instalado antes de ejecutar una aplicación de Office específica? FindExecutable puede recuperar esa información. Esta función requiere el nombre de un archivo de datos existente y un directorio de trabajo. La función devuelve el nombre y la ruta de la aplicación que Windows lanzaría si hicieras doble clic en el archivo de datos. Si la función falla, devuelve un valor de 32 o menos. Declárala y utiliza la siguiente función de VBA para llamar a FindExecutable:

Private Declare Function FindExecutable Lib "shell32.dll" Alias _
"FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, _
ByVal lpResult As String) As Long
Function apicFindExecutable(strDataFile As String, strDir As String) As String
  'Devuelve el ejecutable para el archivo de datos pasado.
  Dim lgnApp As Long
  Dim strApp As String
  strApp = Space(260)
  lgnApp = FindExecutable(strDataFile, strDir, strApp)
  If lngApp > 32 Then
    apicFindExecutable = strApp
  Else
    apicFindExecutable = "No hay ninguna aplicación coincidente."
  End If
End Function

Debes pasar la ruta completa a través de strDataFile, no solo el nombre del archivo de datos. La función devolverá la ruta del ejecutable necesario para ejecutar el archivo de datos.

7: GetActiveWindow

Cuando trabajas con más de una aplicación de Office, probablemente necesitarás considerar las ventanas. Afortunadamente, hay muchas funciones de API para trabajar con ellas. GetActiveWindow recupera el identificador de ventana de la ventana actualmente activa, la ventana nueva en la que hiciste clic por última vez. Si no hay ninguna ventana activa asociada con el subproceso, el valor de retorno es NULL. Declárala y llámala de la siguiente manera:

Private Declare Function GetActiveWindow Lib "user32" () As Long
Function apicGetActiveWindow()
  'Devuelve el identificador de ventana de la ventana activa.
  Dim lngWindow As Long
  apicGetActiveWindow = GetActiveWindow()
End Function

Puedes aprender rápidamente si un formulario específico sigue siendo la ventana activa utilizando la siguiente expresión si la aplicación host compatible tiene una propiedad de identificador (Access sí la tiene):

GetActiveWindow() = | <> formulario.hWND

8: GetTempPath

GetTempPath devuelve la ruta de la carpeta temporal del sistema. Requiere dos parámetros: la longitud de una cadena para contener la ruta de acceso y la cadena en sí. Esta función devuelve la longitud de la ruta de acceso medida en bytes o 0 si la función falla. Declárala y llámala de la siguiente manera:

Descubre la exposición El Arte de los Videojuegos en el Museo Smithsonian
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Function apicGetTempPath() As String
  'Devuelve la ruta de la carpeta temporal del sistema.
  Dim strPath As String * 512
  Dim lgnPath As Long
  lgnPath = GetTempPath(512, strPath)
  apicGetTempPath = Left(strPath, InStr(1, strPath, vbNullChar))
End Function

9: GetTempFileName

Esta función a menudo funciona como compañera de GetTempPath. Es posible que no la uses con frecuencia, pero cuando la necesites, será útil. GetTempFileName crea un nombre para un archivo temporal. Esta función tiene cuatro parámetros: una cadena para la ruta de acceso del archivo, una cadena de prefijo que se utiliza para comenzar un nombre de archivo único, un número único para construir el nombre temporal y una cadena que se utiliza para devolver el nombre de archivo. Ambas cadenas de ruta de acceso y prefijo son obligatorias y no pueden estar vacías. La función devuelve el número único utilizado para crear el nombre de archivo o 0 si hay un error. Declárala y llámala de la siguiente manera:

Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA"

(ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As
Long, ByVal lpTempFileName As String) As Long

Public Function apicGetTempFileName(str As String) As String
  'Devuelve un nombre de archivo temporal.
  Dim strPath As String * 512
  Dim strName As String * 576
  Dim lngRet As Long
  lngRet = GetTempPath(512, strPath)
  If (lngRet > 0 And lngRet < 512) Then
     lngRet = GetTempFileName(strPath, str, 0, strName)
     If lngRet <> 0 Then
        apicGetTempFileName = Left(strName, _
           InStr(strName, vbNullChar))
     End If
  End If
End Function

La función anterior combina GetTempPath y GetTempFileName para devolver un nombre de archivo temporal. Simplemente pasa un prefijo y la función genera un nombre único utilizando el prefijo.

10: GetDesktopWindow

Esta función recupera un identificador de la ventana del escritorio, que cubre toda la pantalla. Todas las demás ventanas se dibujan encima de la ventana del escritorio. Esta es una de las funciones más fáciles de implementar, ya que no hay parámetros. Rara vez la utilizarás sola; más bien, la combinarás con otras funciones de API. Por ejemplo, podrías combinarla con otras para poder soltar archivos temporalmente en el escritorio o enumerar todas las ventanas abiertas en el escritorio. Declárala y llámala de la siguiente manera:

Private Declare Function GetDesktopWindow Lib "user32" () As Long
Public Function apicGetDesktopWindow()
  'Recupera el identificador del escritorio.
  apicGetDesktopWindow = GetDesktopWindow
End Function

11: ShowWindow

Después de recuperar el identificador de ventana mediante FindWindow, es posible que quieras manipular la misma ventana con ShowWindow. Por lo general, es mejor usar métodos nativos, pero la capacidad existe, y a veces las soluciones nativas simplemente no ofrecen lo que deseas. Declárala y llámala de la siguiente manera:

Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Function apicShowWindow(strClassName As String, strWindowName As String, lngState As Long)
  'Obtiene el identificador de ventana.
  Dim lngWnd As Long
  Dim intRet As Integer
  lngWnd = FindWindow(strClassName, strWindowName)
  apicShowWindow = ShowWindow(lngWnd, lngState)
End Function

La función de VBA llama tanto a FindWindow como a ShowWindow. El tercer argumento, lngState, pasa una de las constantes mostradas en Tabla A.

10 consejos para crear políticas efectivas en tu organización

Tabla A

Constante

Valor entero

Explicación

SW_FORCEMINIMIZE11Minimiza una ventana.
SW_HIDE0Oculta la ventana y activa otra ventana.
SW_MAXIMIZE3Maximiza una ventana.
SW_MINIMIZE6Minimiza la ventana especificada y activa la siguiente ventana de nivel superior.
SW_RESTORE9Activa y muestra la ventana.
SW_SHOW5Activa la ventana.
SW_SHOWMAXIMIZED3Activa la ventana y la muestra como una ventana maximizada.
SW_SHOWMINIMIZED2Activa la ventana y la muestra como una ventana minimizada.
SW_SHOWMINNOACTIVE7Muestra la ventana como una ventana minimizada (sin activar la ventana).
SW_SHOWNA8Muestra la ventana en su tamaño y posición actuales (sin activar la ventana).
SW_SHOWNOACTIVATE4Muestra una ventana en su tamaño y posición más recientes (sin activar la ventana).
SW_SHOWNORMAL1Activa y muestra una ventana.

Me gustaría agradecer a Stuart McLachlan, FPNGCS y Jim Dettman, Access MVP, por compartir sus API favoritas conmigo.

Cómo crear un formulario de usuario en Word para solicitar elementos de dirección

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Ultimas Noticias, allí encontraras muchos artículos similares a 11 funciones de la API de Windows que los desarrolladores de Office deben conocer , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.