Win32 Funciones de sistema

En este tutorial veremos algunas de las funciones que podemos usar para comunicarnos con el sistema operativo, estas nos servirán para obtener información del sistema que ejecuta la aplicación o para cambiar la configuración del mismo.

Algunas de las cosas que haremos son: obtener resolución de pantalla, nombre de usuario y pc, letras de dispositivos de almacenamiento como discos duros, particiones, unidades de cd, dvd, etc., y unidades de almacenamiento externas como dispositivos USB entre otras.

1. Obtener la resolución de pantalla

Para esta operación usaremos la función GetSystemMetrics() como parámetro debemos indicar SM_CXSCREEN para obtener la resolución horizontal y SM_CYSCREEN para obtener la resolución vertical, esta función forma parte de la librería user32.lib.

#include <windows.h>
#include <iostream>

#pragma comment(lib, "user32.lib")

int main(void) {
    int ancho = GetSystemMetrics(SM_CXSCREEN);
    int alto = GetSystemMetrics(SM_CYSCREEN);
    
    std::cout << "La resolucion es: " << ancho  << " x " << alto << std::endl;
    std::cin.get();

    return 0;
}

El resultado será: La resolucion es: 1920 x 1080, para mi PC.

2. Nombre de usuario y PC

La siguiente función que utilizaremos será GetComputerName() que nos devuelve el nombre del computador, debemos crear una variable de texto para almacenar el resultado, el tamaño máximo del nombre lo obtenemos con MAX_COMPUTERNAME_LENGTH, veamos el ejemplo:

#include <windows.h>
#include <iostream>

int main(void) {
    wchar_t computerName[MAX_COMPUTERNAME_LENGTH + 1];
    
    DWORD size = sizeof(computerName) / sizeof(computerName[0]);
    int result = GetComputerNameW(computerName, &size);

    if (result != 0) {
        std::wcout << "Computer name: " << computerName;
        std::wcin.get();
    }

    return 0;
}

El resultado en la consola: Cumputer name: CARMELO.

De un modo parecido también podemos obtener el nombre de usuario, para ello usamos la función GetUserName() de este modo:

DWORD len = sizeof(userName) / sizeof(wchar_t);
int result = GetUserNameW(userName, &len);

Esta función obtiene el nombre de la cuenta de usuario con la que estamos ejecutando la aplicación.

3. Directorio de trabajo actual

Ahora veremos la función GetCurrentDirectory() que nos permite obtener la carpeta o directorio actual de trabajo de la aplicación, este directorio se puede cambiar usando la función SetCurrentDirectory(L"c:/dir"), como parámetro debemos indicar el nuevo directorio de trabajo para la aplicación.

#include <windows.h>
#include <iostream>

int main(void) {
    TCHAR buffer[MAX_PATH];

    DWORD r = GetCurrentDirectory(MAX_PATH, buffer);

    if (r == 0 || r > MAX_PATH) {
        std::cout << "Error en la funcion GetCurrentDirectoryW()" << std::endl;
    }
    else {
        std::wcout << "El directorio es: " << buffer;
    }

    std::cin.get();

    return 0;
}

Esta función devuelve un DWORD que contiene cero si se produjo un error en la operación, de lo contrario contiene la longitud de la cadena.

4. Obtener unidades de almacenamiento

Lo último que haremos será obtener las letras que representan cada una de las unidades o dispositivos de almacenamiento que tengamos en nuestro sistema, para esta operación disponemos de la función GetLogicalDriveStrings() que nos devuelve una cadena que contiene las unidades de nuestro sistema.

#include <windows.h>
#include <iostream>

int wmain(void) {
    TCHAR LogicalDrives[MAX_PATH] = { 0 };
    DWORD r = GetLogicalDriveStrings(MAX_PATH, LogicalDrives);

    if (r > 0 && r <= MAX_PATH) {
        wchar_t *driveLetter = LogicalDrives;
        while (*driveLetter) {
            std::wcout << driveLetter << std::endl;
            driveLetter += wcslen(driveLetter) + 1;
        }
    }

    std::cin.get();

    return 0;
}

Al ejecutar este código veremos:

  • C:\
  • D:\
  • E:\

5. Versión de sistema operativo

Al incluir el encabezado VersionHelpers.h tendremos disponibles un grupo de funciones que nos ayudarán a determinar la versión del sistema operativo que estemos ejecutando, este grupo de funciones tiene la siguiente forma: IsWindows10OrGreater() y devuelve un valor booleano que indica si el sistema es Windows 10 o superior, para este caso.

#include <Windows.h>
#include <VersionHelpers.h>
#include <iostream>

int wmain(void) {
    std::string window_version;

    if (IsWindows8Point1OrGreater()) {
        window_version = "Windows 8.1+";
    }
    else if (IsWindows8OrGreater()) {
        window_version = "Windows 8+";
    }
    else if (IsWindows7OrGreater()) {
        window_version = "Windows 7+";
    }

    std::cout << "La version es: " << window_version.c_str() << std::endl;
    std::cin.get();

    return 0;
}

Terminamos este tutorial aquí, en próximas publicaciones seguiremos viendo las diversas funciones que nos permitirán obtener información del sistema que estemos ejecutando, hasta la próxima.

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Conociendo la clase cv::Mat de OpenCV