Algunas funciones de la API de Windows usadas desde Visual FoxPro
Conectandose a la red desde Visual FoxPro
Funciones de la API de Windows para conectarse, desconectarse e interrogar sobre una conexión de red. Estas funciones son:
- Interroga sobre una conexión de red...: WNetGetConnection
- Añade una nueva conexión de red......: WNetAddConnection
- Cancela una conexión de red.............: WNetCancelConnection
*---------------------------------------- * FUNCTION GetConnection(lcDrive) *---------------------------------------- * Retorna el nombre de la PC y recurso * compartido de una conexión de red * PARAMETROS: lcDrive * USO: ? GetConnection("K:") *---------------------------------------- FUNCTION GetConnection(lcDrive) DECLARE INTEGER WNetGetConnection IN WIN32API ; STRING lpLocalName, ; STRING @lpRemoteName, ; INTEGER @lpnLength LOCAL cRemoteName, nLength, lcRet, llRet cRemoteName=SPACE(100) nLength = 100 llRet = WNetGetConnection(lcDrive,@cRemoteName,@nLength) lcRet = LEFT(cRemoteName,AT(CHR(0),cRemoteName)-1) RETURN lcRet ENDFUNC *---------------------------------------- * FUNCTION AddConnection(tcDrive,tcResource,tcPassword) *---------------------------------------- * Conecta un recurso compartido a la unidad tcDrive * USO: ? AddConnection("Z:","PC_REMOTARECURSO") *---------------------------------------- FUNCTION AddConnection(tcDrive,tcResource,tcPassword) LOCAL lnRet DECLARE INTEGER WNetAddConnection IN WIN32API; STRING @lpzRemoteName, ; STRING @lpzPassword,; STRING @lpzLocalName IF PARAMETERS() < 3 lnRet = WNetAddConnection(@tcResource,0,@tcDrive) ELSE lnRet = WNetAddConnection(@tcResource,@tcPassword, @tcDrive) ENDIF IF lnRet # 0 RETURN "Error " + ALLT(STR(lnRet)) + ; " al conectar el drive " + tcDrive ENDIF RETURN "" ENDFUNC *---------------------------------------- * FUNCTION CancelConnection(tcDrive) *---------------------------------------- * Desconecta una unidad de red * USO: ? CancelConnection("Z:") *---------------------------------------- FUNCTION CancelConnection(tcDrive) LOCAL lnRet DECLARE INTEGER WNetCancelConnection IN WIN32API; STRING @lpzLocalName, ; INTEGER nForce lnRet = WNetCancelConnection( @tcDrive, 0) IF lnRet # 0 RETURN "Error " + ALLT(STR(lnRet)) + ; " al desconectar el drive " + tcDrive ENDIF RETURN "" ENDFUNC *----------------------------------------
Algunos directorios importantes
Muchas veces queremos que nuestras aplicaciones lean o escriban archivos en los directorios que estan por defecto en todas las computadoras que tienen instalado Windows. Por ejemplo el directorio "C:WINDOSW"
La ruta y el nombre de estos directorios, lo podemos conocer con las siguientes funciones de la API de Windows:
- Directorio de Windows................: GetWindowsDirectory
- Directorio System de Windows.....: GetSystemDirectory
- Directorio Temporal de Windows...: GetTempPath
*---------------------------------------- * FUNCTION WinDir() *---------------------------------------- * Retorna el directorio de Windows * USO: ? WinDir() -> "C:WINNT" *---------------------------------------- FUNCTION WinDir() LOCAL lcPath, lnSize lcPath = SPACE(255) lnsize = 255 DECLARE INTEGER GetWindowsDirectory IN Win32API ; STRING @pszSysPath,; INTEGER cchSysPath lnSize = GetWindowsDirectory(@lcPath, lnSize) IF lnSize <= 0 lcPath = "" ELSE lcPath = ADDBS(SUBSTR(lcPath, 1, lnSize)) ENDIF RETURN lcPath ENDFUNC *---------------------------------------- * FUNCTION SystemDir() *---------------------------------------- * Retorna el directorio SYSTEM de Windows * USO: ? SystemDir() -> "C:WINNTSYSTEM32" *---------------------------------------- FUNCTION SystemDir() LOCAL lcPath, lnSize lcPath = SPACE(255) lnsize = 255 DECLARE INTEGER GetSystemDirectory IN Win32API ; STRING @pszSysPath,; INTEGER cchSysPath lnSize = GetSystemDirectory(@lcPath, lnSize) IF lnSize <= 0 lcPath = "" ELSE lcPath = ADDBS(SUBSTR(lcPath, 1, lnSize)) ENDIF RETURN lcPath ENDFUNC *---------------------------------------- * FUNCTION TempDir() *---------------------------------------- * Retorna la ruta de los archivos temporales * USO: ? TempDir() -> "C:WINNTTEMP" *---------------------------------------- FUNCTION TempDir() LOCAL lcPath, lnRet lcPath = SPACE(255) lnSize = 255 DECLARE INTEGER GetTempPath IN WIN32API ; INTEGER nBufSize, ; STRING @cPathName lnRet = GetTempPath(lnSize, @lcPath) IF lnRet <= 0 lcPath = "" ELSE lcPath = ADDBS(SUBSTR(lcPath, 1, lnRet)) ENDIF RETURN lcPath ENDFUNC *----------------------------------------
Nombre de usuario y computadora
Cuando queremos saber el nombre de usuario o el nombre de la computadora, podemos usar directamente desde FoxPro el comando SYS(0), que nos devuelve información sobre el equipo de red cuando se utiliza Visual FoxPro en un entorno de red. Pero también existen las siguientes funciones de la API de Windows que nos devuelven esta información:
- Retorna el nombre del usuario.............: GetUserName
- Retorna el nombre de la computadora...: GetComputerName
*---------------------------------------- * FUNCTION UserName() *---------------------------------------- * Retorna el nombre del usuario * USO: ? UserName() -> "LUISG" *---------------------------------------- FUNCTION UserName() LOCAL lcUser, lnSize lcUser = SPACE(80) lnSize = 80 DECLARE INTEGER GetUserName IN WIN32API ; STRING @cUserName, ; INTEGER @nSize =GetUserName(@lcUser, @lnSize) IF lnSize < 2 lcUser = "" ELSE lcUser = SUBSTR(lcUser, 1, lnSize-1) ENDIF RETURN lcUser ENDFUNC *---------------------------------------- * FUNCTION ComputerName() *---------------------------------------- * Retorna el nombre de la computadora * USO: ? ComputerName() -> "PC_DESARROLLO" *---------------------------------------- FUNCTION ComputerName() LOCAL lcComputer, lnSize lcComputer = SPACE(80) lnSize = 80 DECLARE INTEGER GetComputerName IN WIN32API ; STRING @cComputerName, ; INTEGER @nSize =GetComputername(@lcComputer, @lnSize) IF lnSize < 2 lcComputer = "" ELSE lcComputer = SUBSTR(lcComputer, 1, lnSize) ENDIF RETURN lcComputer ENDFUNC *----------------------------------------
Sonidos y espera
Mediante la API de Windows, podemos ejecutar los sonidos del sistema o cualquier archivo de extensión .wav. También podemos detener la ejecución del programa durante "n" milisegundos. Las funciones son las siguientes:
- Ejecuta el sonido predeterminado del sistema...: MessageBeep
- Ejecuta el sonido de un archivo wav...............: PlaySound
- Detiene la ejecución de un programa...............: Sleep
*---------------------------------------- * FUNCTION Beep(tnSound) *---------------------------------------- * Ejecuta el sonido predeterminado del sistema * USO: ? Beep(0) *---------------------------------------- FUNCTION Beep(tnSound) tnSound = IIF(VARTYPE(tnSound) = "N", tnSound, 1) DECLARE INTEGER MessageBeep IN WIN32API ; INTEGER nSound RETURN IIF(MessageBeep(tnSound) = 1, .T., .F.) ENDFUNC *---------------------------------------- * FUNCTION PlayWav(lcWaveFile, lnPlayType) *---------------------------------------- * Ejecuta un archivo .WAV * USO: PlayWave([, ]) * Archivo_Wav = Ruta completa del archivo .Wav * Ejecucion = 1 - Ejecución en background (default) * 0 - La aplicación espera la ejecución * 2 - Si el archivo no existe, no ejecuta el default * 4 - Apaga el sonido que se está ejecutando * 8 - Continuado *---------------------------------------- FUNCTION PlayWav(lcWaveFile, lnPlayType) lnPlayType = IIF(VARTYPE(lnPlayType) = "N", lnPlayType, 1) DECLARE INTEGER PlaySound IN WINMM.DLL ; STRING cWave, ; INTEGER nModule, ; INTEGER nType RETURN IIF(PlaySound(lcWaveFile,0,lnPlayType) = 1, .T., .F.) ENDFUNC *---------------------------------------- * FUNCTION Sleep(lnMiliSeg) *---------------------------------------- * Función que detiene la ejecución de un programa * durante "n" milisegundos sin interfase con el teclado. * USO: ? Sleep(1500) *---------------------------------------- FUNCTION Sleep(lnMiliSeg) lnMiliSeg = IIF(VARTYPE(lnMiliSeg) = "N", lnMiliSeg, 1000) DECLARE Sleep IN WIN32API ; INTEGER nMillisecs RETURN IIF(Sleep(lnMiliSeg) = 1, .T., .F.) ENDFUNC *----------------------------------------
Posición del cursor
Algunas funciones de la API de Windows son muy curiosas, como esta que nos permite configurar la posición del cursor en nuestra pantalla:
- Posiciona el cursor en la pantalla......: SetCursorPos
*---------------------------------------- * FUNCTION SetCurPos(lnX, lnY) *---------------------------------------- * Coloca el cursor en la posición especificada * USO: ? SetCurPos(50,200) *---------------------------------------- FUNCTION SetCurPos(lnX, lnY) lnX = IIF(EMPTY(lnX),0,lnX) lnY = IIF(EMPTY(lnY),0,lnY) DECLARE INTEGER SetCursorPos IN WIN32API ; INTEGER lnX, ; INTEGER lnY RETURN IIF(SetCursorPos(lnX, lnY) = 1, .T., .F.) ENDFUNC *----------------------------------------
Verificar si la aplicación está activa
Podemos saber si una aplicación está activa, para ello tenemos la función de la API:
- Busca la ventana activa......: FindWindows
*---------------------------------------- * FUNCTION IsActive(tcCaption) *---------------------------------------- * Verifica si una aplicación ya está activa * USO: ? IsActive("Calculadora") *---------------------------------------- FUNCTION IsActive(tcCaption) DECLARE INTEGER FindWindow IN WIN32API ; STRING cNULL, ; STRING cWinName RETURN FindWindow(0, tcCaption) # 0 ENDFUNC *----------------------------------------
Con esta función podemos comprobar si nuestra aplicación de Visual FoxPro ya ha sido iniciada en una PC y así no iniciarla nuevamente. Para lograrlo escribiremos una función que se invoca en el inicio de nuestra aplicación, luego de haber colocado el título a nuestra ventana principal.
*---------------------------------------- * FUNCTION YaActiva() *---------------------------------------- * Comprueba que la aplicación no se esta ejecutando * Invoca a IsActive() descripta anteriormente *---------------------------------------- FUNCTION YaActiva() LOCAL llRet, lcCaption llRet = .F. lcCaption = _SCREEN.Caption *--- Renombra temporariamente el caption de la app _SCREEN.Caption = "_" + lcCaption IF IsActive(lcCaption) *--- Si ya esta activo MESSAGEBOX("Este sistema ya está activo",16,"Aviso") llRet = .T. ENDIF _SCREEN.Caption = lcCaption RETURN llRet ENDFUNC *----------------------------------------
Si la función YaActiva() retorna .T., entonces ya hay una instancia de la aplicación activa, y debemos cancelar la nueva ejecución.
Mas funciones
Muchas funciones de la API de Windows ya fueron tratadas en este Portal y existen muchas funciones mas, de la que podemos sacar provecho, y darle un toque mas profesional a nuestras aplicaciones.
Por favor, como se hace para grabar el audio que pasa por la tarjeta de sonido
ResponderBorrar