|
En este Capítulo tratare de algunas API’S usadas para retornar información del sistema y además, veremos como apagamos y reiniciamos nuestra computadora y por último estudiaremos las funciones utilizadas para cambiar la resolución del sistema, funciones muy utilizadas en caso de desarrollar un juego de computadora. UN POCO DE INFORMACIÓN Para este proyecto necesitaremos de un ComboBox y un ListBox. Luego pegan este código: Ver Código
El ejecutar dicho programa y pasear por el comboBox notarán como el LisBox se va llenando de información; a continuación estudiaremos las funciones que nos ayuda a retornar dicha información. GetComputerName Api: Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long Función encargada de retornar el nombre de la computadora; nombre que se le fue asignado al momento de instalar Windows, aunque dicho nombre puede ser modificado por el panel de control. O una función que veremos mas adelante. Como primer parámetro le pasamos la variable que almacenara el nombre, y como segundo parámetro le pasamos la cantidad de bytes que queremos recuperar. Como pueden ver su uso es muy sencillo. SetComputerName Api: Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" (ByVal lpComputerName As String) As Long Función no usada en el proyecto, dicha función es la encargada de asignarle un nuevo nombre a la computadora, como pueden ver es muy simple ya que como único parámetro tenemos la variable del tipo String que contiene el nombre que le queramos asignar. Teniendo claro que el limite de caracteres o bytes viene establecido por la constante: Private Const MAX_COMPUTERNAME_LENGTH = 31 GetKeyboardType Api: Declare Function GetKeyboardType Lib "user32" (ByVal nTypeFlag As Long) As Long Función encargada de retornar información acerca de la configuración del teclado. Como único parámetro le pasamos un “flag” que indica que tipo de información queremos consultar. Particularmente puede tomar 3 valores: 0 – Tipo de teclado 1 – Sub-tipo de teclado 2 – Numero de teclas “funcionales” en el teclado. Si colocamos 0, podemos obtener estos resultados:  Si colocamos 2, podemos obtener estos resultados:  Dicho valor se toma de lo que retorna la función cuando es ejecutada. En nuestro caso veamos el ejemplo: res = GetKeyboardType(0) La variable “res” contendrá el resultado que habrá de devolver la función al ser ejecutada, como el flag fue 0, “res” estará comprendido entre los valores de la primera tabla. GetSystemDirectory Api: Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Función encargada de retornar el directorio SYSTEM. Es decir, se encarga de señalar la ubicación de dicho directorio, normalmente es C:\Windows\System, o para los usuarios NT podria ser C:\Winnt\System32. Como primer parámetro le pasamos la variable que almacenará dicho valor, como segundo parámetro le pasamos la cantidad de bytes que queremos recuperar, y la función devuelve o retorna la cantidad de bytes que realmente fueron recuperados. En el ejemplo es fácil ver lo que hace: nombre = Space(MAX_PATH) ‘Configuramos nuestra variable de tipo string res = GetSystemDirectory(nombre, MAX_PATH) ‘Llamamos la función y la cantidad de bytes a recuperar sera el valor de la constante MAX_PATH List1.AddItem "Windows System = " & Left(nombre, res) ‘Tomamos solo los bytes necesarios. Y lo mostramos en el List1. GetSystemInfo Api: Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO) Función que retorna información actual del sistema, dicha información se almacena en una estructura que estudiaremos a continuación: Private Type SYSTEM_INFO dwOemID As Long ‘ Parámetro obsoleto, que solo se mantiene por compatibilidad. dwPageSize As Long ‘ Especifica el tamaño de pagina, que puede ser utilizado con la función VirtualAlloc. lpMinimumApplicationAddress As Long ‘ Puntero de la dirección baja en memoria accesible para aplicaciones y DLL lpMaximumApplicationAddress As Long ‘ Puntero de la dirección alta en memoria accesible para aplicaciones y DLL dwActiveProcessorMask As Long ‘ dwNumberOrfProcessors As Long ‘ Número de procesadores que posee el computador. dwProcessorType As Long ‘ Tipo de procesador presente en el computador. dwAllocationGranularity As Long dwReserved As Long ‘ Parámetro reservado por el sistema. End Type En el parametro dwProcessorType, tenemos varios tipos:
Private Const PROCESSOR_INTEL_386 = 386 Private Const PROCESSOR_INTEL_486 = 486 Private Const PROCESSOR_INTEL_PENTIUM = 586 Solo para NT: Private Const PROCESSOR_MIPS_R4000 = 4000 Private Const PROCESSOR_ALPHA_21064 = 21064 GetSystemMetrics Api: Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Con esta función podemos retornar información métrica (es decir, ancho y alto de distinto componentes) y además algunas configuraciones del sistema. Todas las medidas se encuentran especificadas en píxeles. La información que queremos buscar, se le pasa como constante en el parámetro “nIndex” y lo que retorna la función es el valor que estábamos buscando. En el ejemplo no ataque todas las constantes ya que son muchas y coloque las mas importantes, de todas maneras a continuación se explica para que sirve cada constante que puede ser pasada en dicha función: Dejo en claro que las constantes que empiezen por SM_CY, se refiere a “alto” y las que empiecen por SM_CX, se refiere a “alto”. Private Const SM_ARRANGE = 56 ‘ Flag que sirve para conocer como el sistema ordena las ventanas minimizadas. Private Const SM_CLEANBOOT = 67 ‘ Con este parámetro podemos saber como se inicio el sistema. Si la función retorna 0 = Booteo normal, 1 = Arranque en modo seguro, 2 = Arranque modo seguro con compatibilidad de red. Private Const SM_CMONITORS = 80 ‘ Sirve para conocer la cantidad de monitores, conectados al sistema. Private Const SM_CMOUSEBUTTONS = 43 ‘ Sirve para conocer la cantidad de botones presente en el mouse. Private Const SM_CXBORDER = 5 Private Const SM_CYBORDER = 6 ‘ Ancho y alto del borde de las ventanas. Private Const SM_CXCURSOR = 13 Private Const SM_CYCURSOR = 14 ‘ Ancho y alto del cursor de windows Private Const SM_CXDLGFRAME = 7 Private Const SM_CYDLGFRAME = 8 ‘ Hace lo mismo que SM_CXFIXEDFRAME y SM_CYFIXEDFRAME Private Const SM_CXDOUBLECLK = 36 Private Const SM_CYDOUBLECLK = 37 ‘ Ancho y alto del rectangulo localizado alrededor del primer click. Private Const SM_CXEDGE = 45 Private Const SM_CYEDGE = 46 ‘ Ancho y alto del borde 3-D Private Const SM_CXFIXEDFRAME = SM_CXDLGFRAME Private Const SM_CYFIXEDFRAME = SM_CYDLGFRAME ‘ Ancho y alto del rectangulo o “frame” alrededor del perimetro de la ventana que presenta “Caption” pero no es redimensionable. Private Const SM_CXFULLSCREEN = 16 Private Const SM_CYFULLSCREEN = 17 ‘ Ancho y alto del area cliente, establecido por una ventana maximizada. Private Const SM_CXHSCROLL = 21 Private Const SM_CYHSCROLL = 3 ‘ Ancho de la flecha presente en un scroll horizontal, y alto del scroll horizontal. Private Const SM_CXHTHUMB = 10 ‘ Ancho del “thumb” del scroll horizontal. Thumb es la barra por donde se desplaza el cuadrito que vemos en una barra de desplazamiento. Private Const SM_CYVTHUMB = 9 ‘ Alto del “thumb” del scroll vertical. Private Const SM_CXICON = 11 Private Const SM_CYICON = 12 ‘ Ancho y alto por defecto de un icono. Private Const SM_CXMAXIMIZED = 61 Private Const SM_CYMAXIMIZED = 62 ‘ Ancho y alto por defecto de una ventana cuando se maximiza. Private Const SM_CXMENUCHECK = 71 Private Const SM_CYMENUCHECK = 72 ‘ Ancho y alto por defecto de la casilla de verificacion colocada en el menu. Private Const SM_CXMIN = 28 Private Const SM_CYMIN = 29 ‘ Ancho y alto mínimo que puede tomar una ventana. Private Const SM_CXMINIMIZED = 57 Private Const SM_CYMINIMIZED = 58 ‘ Ancho y alto de una ventana minimizada. Private Const SM_CXSCREEN = 0 Private Const SM_CYSCREEN = 1 ‘ Ancho y alto de la dimensión de la pantalla Private Const SM_CXSIZE = 30 Private Const SM_CYSIZE = 31 ‘ Ancho y alto de los botones presenta en el “Caption” o barra de título. Private Const SM_CXSMICON = 49 Private Const SM_CYSMICON = 50 ‘ Ancho y alto recomendados para los iconos pequeños Private Const SM_CXVSCROLL = 2 Private Const SM_CYVSCROLL = 20 ‘ Alto de la flecha presente en un scroll vertical, y ancho del scroll vertical. Private Const SM_CYCAPTION = 4 ‘ Alto de la barra de título o “Caption” de una ventana Private Const SM_CYMENU = 15 ‘ Alto de una simple línea del menu bar. Private Const SM_MOUSEPRESENT = 19 ‘ Indica mediante TRUE si hay un mouse instalado. Private Const SM_MOUSEWHEELPRESENT = 75 ‘ Indica mediante TRUE o FALSE la existencia de la ruedita que poseen algunos mouse. Estas son algunas constantes, de todas maneras revisen la documentacion oficial, ya que a medida que salen nuevas versiones de windows dicho listado de constantes puede ir aumentando. Para la constante SM_ARRANGE, la función puede retornar algunos de los siguientes valores: Private Const ARW_BOTTOMLEFT = &H0& ‘ Empieza en la esquina inferior izquierda de la pantalla (posicion por defecto) Private Const ARW_BOTTOMRIGHT = &H1& ‘Empieza en la esquina inferior derecha de la pantalla. Private Const ARW_HIDE = &H8& ‘ Esconde la ventana minimizada. Private Const ARW_TOPLEFT = &H2& ‘ Empieza en la esquina superior izquierda de la pantalla. Private Const ARW_TOPRIGHT = &H3& ‘ Empieza en la esquina superior derecha de la pantalla. GetUserName Api: Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long Esta función retorna el usuario activo. Es decir, el usuario que inicio la sesión. Como primer parámetro se le pasa la variable que almacenara el nombre del usuario, y como segundo parámetro se le pasa la cantidad de bytes a recuperar. Por ejemplos anteriores sea intuitivo pensar que lo que retorna la función es la cantidad de bytes recuperados, pero en esta función no se trabaja de esa manera, después de haber ejecutado dicha función, la misma variables pasada en el parámetro “nSize” contendrá la cantidad de bytes recuperados. Como se puede ver en el ejemplo del proyecto: nombre = Space(255) res = 255 GetUserName nombre, res List1.AddItem "Usuario = " & Left(nombre, res) En este caso la variable “res” contiene la cantidad de bytes recuperados. GetVersionEx Api: Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long Función encargada de recuperar información acerca de la versión del sistema operativo. Dicha información es almacenada en una estructura, que es el único parámetro que se le pasa a la función. Private Type OSVERSIONINFO dwOSVersionInfoSize As Long ‘ Tamaño de la estructura en bytes dwMajorVersion As Long ‘ Identifica el número “mayor” de la versión del sistema operativo. dwMinorVersion As Long ‘Identifica el número “menor” de la versión del sistema operativo. dwBuildNumber As Long dwPlatformId As Long ‘ Identifica la plataforma del sistema operativo. szCSDVersion As String * 128 ‘ Variable que puede contener información adicional, por ejemplo, en caso de poseer NT, y tener el “Service Pack 3” instalado, en dicha constante se almacenara “Service Pack 3”, dando a entender al usuario que tiene dicha service pack instalado. End Type ¿Menor o Mayor?. Es sencillo entender esos dos parametros, un número que representa a una versión puede estar representado de la siguiente manera: 4.15, en esta caso “mayor” será 4 y el “menor” 15. La unión de estos dos parámetros daría la versión 4.15. El parámetro dwPlatformId, puede retornar los siguientes valores: Private Const VER_PLATFORM_WIN32s = 0 ‘ Windows 3.1 Private Const VER_PLATFORM_WIN32_WINDOWS = 1 ‘ Windows 98, 95, ME, etc. Private Const VER_PLATFORM_WIN32_NT = 2 ‘ Windows NT. GetWindowsDirectory Api: Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Función que sirve para retornar el directorio donde esta instalado el sistema operativo, y funciona exactamente igual que la función GetSystemDirectory. APAGANDO, RESETEANDO EL SISTEMA ExitWindowsEx Api: Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Función que sirve para resetear o apagar la computadora, tambien sirve para cerrar la sesión del usuario activo. Como primer parámetro se le pasa algunas de las siguientes constantes, las cuales realizan distintas acciones: Public Const EWX_LOGOFF = 0 ‘ Cierra todo los procesos que estan corriendo, y finaliza la sesión del usuario activo. Public Const EWX_POWEROFF = &H8 ‘ Prepara al sistema para apagarse. Public Const EWX_REBOOT = 2 ‘ Prepara al sistema y resetea la computadora. Public Const EWX_SHUTDOWN = 1 ‘ Prepara al sistema para apagar la computadora, con esto me refiero a transferir información al disco duro, cerrar los programas, etc. Y luego Windows apaga la máquina. Estos parámetros se pueden usar junto con los antes mencionados: Public Const EWX_FORCE = 4 ‘ Se obliga a terminar todos los procesos activos, dichos procesos no mandan a las aplicaciones los mensages WM_QUERYENDSESION y WM_ENDSESION. Estos dos últimos mensajes pueden ser capturados por los programas para realizar las operaciones pertinentes y cerrar la aplicación de manera apropiada, para evitar asi la perdida de información. Al usar EWX_FORCE se obliga a cerrar las aplicaciones, sin que estas pueden realizar las operaciones pertienentes de cierre, produciendo posibles perdidas de información. Esta API es la utilizada en sistema Windows 95,98,ME. A continuación se mostraran funciones que solo trabajan en plataforma NT. LockWorkStation Api: Declare Function LockWorkStation Lib "user32.dll" () As Long Bloquea la computadora, en la cual se ejecuta dicha función. InitiateSystemShutdown Api: Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long Esta función hace prácticamente lo mismo que ExitWindowsEx con la diferencia que se pueden apagar otras maquinas de manera remota, e incluye ciertas cosas que se mostrarán a continuación: Como primer parámetro “lpMachineName”, le pasamos el nombre de la computadora a la cual le queremos aplicar la “acción” a ejecutar. Si se le pasa NULL se entiende que nos referimos a la maquina local. Como segundo parámetro “lpMessage”, le pasamos una cadena de tipo String, la cual se le he mostrada al usuario de dicha computadora, notificándole que dicha computadora se apagara o se reseteara, también se le puede pasar NULL si no queremos ningún mensaje. “dwTimeout” especifica el tiempo en milisegundos que durará el mensaje del parámetro “lpMessage”, por ejemplo, si pasamos 2000 que es lo equivalente a 2 segundos, entonces el mensaje se le muestra al usuario por 2 segundos y luego ejecuta la acción a seguir. El parámetro “bForceAppsClosed”, sirve para forzar a las aplicaciones para cerrarse, es decir, si se le pasa TRUE, las aplicaciones se cierran automáticamente y sin necesidad de salvar la información. En caso de pasar FALSE se le muestran mensajes al usuario que le especifica que la aplicación va ser cerrada. Y por último tenemos “bRebootAfterShutdown”, en caso de colocarle TRUE, la computadora se resetea, en caso de FALSE, el sistema guarda toda la información pertinente de Windows, y procede a apagar la computadora. Queda claro, que no siempre se puede aplicar esta función ya que depende de los privilegios del usuario, ciertamente si es el administrador quien ejecuta dicha aplicación lo mas seguro es que no tenga problema, pero no cualquier usuario puede apagarla ya que dependerá si posee la permisología de la maquina para realizar dicha operación. Para ver como alterar dicha permisología, vayan directo a la documentación de MSND y vean la parte de “PRIVILEGES” AbortSystemShutdown Api: Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Long Se recuerdan del mensaje que puede ser mostrado por la función anterior; mientras se muestra dicho mensaje, nosotros podemos suspender el reseteo o apagado de la maquina, y dicha suspensión se hace con esta función, la cual tiene como unico parametro el nombre del computadora a la cual se quiere abortar la ejecución de la “accion” que se quería. CAMBIANDO LA RESOLUCIÓN DE WINDOWS Aquí les presento las 2 Api’s necesarias para cambiar la resolución de Windows. Para este ejemplo necesitan un formulario con un Listbox y un Botón. Ver Código
Si ejecutan el programa verán que en el ListBox se colocan todas las Resoluciones posibles que soporta la tarjeta de video que posean, seleccionen una y denle clic a “Cambiar Resolución” e inmediatamente verán como la computadora cambia de resolución. ENUMDISPLAYSETTINGS Api: Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean Con esta API obtenemos información acerca de un dispositivo gráfico, en nuestro caso la usamos para hacer un listado de las resoluciones posibles a las cuales podemos cambiar. Como parámetros tenemos: lpszDeviceName: este parámetro puede ser NULL. Si es NULL nos referimos al dispositivo gráfico usado en ese momento. iModeNum: sirve como índice, para recuperar la información del dispositivo gráfico. lpDevMode: Es un puntero a una estructura de tipo DEVMODE. En el programa lo usamos de esta manera: Do Resul = EnumDisplaySettings(0&, i, dev) List1.AddItem dev.dmPelsWidth & " X " & dev.dmPelsHeight & " " & dev.dmBitsPerPel & " bits" i = i + 1 Loop While Resul End Sub Como podrán observar, la estructura DEVMODE representada en la variable “dev”, cambia sus valores cada vez que entra, con este código logramos que “Mientras Resul sea true” continué mostrando información, cuando ya se haya extraído toda la información EnumDisplaySettings retorna FALSE y sale del bucle. Para moverse en los distintos tipos de información usamos la variable “i” la cual empieza en 0 y va aumentando de uno en uno. CHANGEDISPLAYSETTINGS Api: Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long Api utilizada para cambiar la configuración de un dispositivo gráfico. En nuestro caso lo usamos para cambiar la resolución del sistema operativo. Como parámetros tenemos, “lpDevMode” el cual se le pasa una variable de tipo DEVMODE, y luego tenemos un Flag “dwFlag” el cual lo utilizamos para indicar lo que queremos hacer. En el programa lo usamos de la manera siguiente: resultado1 = ChangeDisplaySettings(dev, CDS_TEST) If resultado1 = DISP_CHANGE_RESTART Then MsgBox "Necesitas reiniciar la maquina" End If If resultado1 = DISP_CHANGE_SUCCESSFUL Then ChangeDisplaySettings dev, CDS_UPDATEREGISTRY End If Primero probamos si la resolución, a la cual estamos invocando es compatible, para ello, usamos un flag “CDS_TEST” si la función ChangeDisplaySettings retorna DISP_CHANGE_RESTART significa que para realizar el cambio de la resolución hay que reiniciar la maquina, si la función retorna DISP_CHANGE_SUCCESSFUL significa que no hay ningún problema. Ahora ¿Por qué invocar dos veces ChangeDsiplaySettings? resultado1 = ChangeDisplaySettings(dev, CDS_TEST) En este caso probamos si es compatible. ChangeDisplaySettings dev, CDS_UPDATEREGISTRY Y aquí sabiendo que ya es compatible, actualizamos esa información en el registro de Windows, y para ello usamos el flag CDS_UPDATEREGISTRY Aquí mostré lo básico de las dos funciones usadas para cambiar la resolución de un dispositivo gráfico. Si desean conocer, con detalle los valores que retornan, los flag, etc. Pueden consultarla en la ayuda de MSDN de Visual Studio.
|