Obtendo o tamanho do cursor no Windows (pt-BR)

By Jeison Cardoso in Windows

October 10, 2023

Obter o tamanho do cursor no Windows é uma tarefa tão simples, mas que pode ser um pouco confusa.

A API do Windows não fornece uma função direta para obter o tamanho atual do cursor do mouse. O tamanho do cursor do mouse é definido nas configurações do sistema e não é facilmente acessível programaticamente.

O tamanho do cursor é definido no registro do Windows, na chave HKEY_CURRENT_USER\Control Panel\Cursors.

#include <Windows.h>

int GetCursorSize() {
    // Abra a chave de registro para as configurações do cursor
    HKEY hKey;
    if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Control Panel\\Cursors", 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
        // Tratamento de erro, se necessário
        return -1;
    }

    DWORD cursorSizeSetting;
    DWORD size = sizeof(cursorSizeSetting);

    // Obtenha o valor DWORD "CursorBaseSize" do registro
    if (RegQueryValueEx(hKey, L"CursorBaseSize", nullptr, nullptr, reinterpret_cast<BYTE*>(&cursorSizeSetting), &size) != ERROR_SUCCESS) {
        // Tratamento de erro, se necessário
        RegCloseKey(hKey);
        return -1;
    }

    // Feche a chave de registro
    RegCloseKey(hKey);

    // Verifique se o valor foi encontrado
    if (size != sizeof(cursorSizeSetting)) {
        // Valor não encontrado ou incorreto, trate o erro, se necessário
        return -1;
    }

    // Use o valor do registro para calcular o tamanho do cursor
    const int baseSize = GetSystemMetrics(SM_CXCURSOR) / 2;

    if (cursorSizeSetting < 32 || cursorSizeSetting > 256) {
        // O valor do registro está fora do intervalo permitido, trate o erro, se necessário
        return -1;
    }

    int cursorSizeValue = (cursorSizeSetting - 2 * baseSize) / baseSize;
    const int cursorSize = baseSize + cursorSizeValue * (baseSize / 2);

    return cursorSize;
}

Os tratamentos de erro foram omitidos para simplificar o código.

Além disso o tamanho do cursor é definido em pixels, mas o tamanho do cursor é definido em pontos. Para obter o tamanho do cursor em pixels é necessário obter o tamanho do cursor em pontos e multiplicar pelo DPI do monitor.

Por fim, para obter o DPI do monitor, use a função GetDpiForSystem:

int GetDpiForSystem() {
    // Obtenha o DPI do monitor
    HDC hdc = GetDC(nullptr);
    const int dpi = GetDeviceCaps(hdc, LOGPIXELSX);
    ReleaseDC(nullptr, hdc);

    return dpi;
}

O fator resultante como um valor de ponto flutuante é o tamanho do cursor em pontos. Para obter o tamanho do cursor em pixels, multiplique o tamanho do cursor em pontos pelo DPI do monitor.

int GetCursorSizeInPixels() {
    // Obtenha o tamanho do cursor em pontos
    const int cursorSize = GetCursorSize();

    // Obtenha o DPI do monitor ver abaixo
    const int dpi = GetDpiForSystem();

    // Calcule o tamanho do cursor em pixels
    const int cursorSizeInPixels = cursorSize * dpi / 72;

    return cursorSizeInPixels;
}

A terceira linha do código calcula o tamanho do cursor em pixels multiplicando o tamanho do cursor em pontos pelo DPI e dividindo o resultado por 72. O valor 72 é usado porque há 72 pontos em uma polegada. Este cálculo converte o tamanho do cursor de pontos para pixels.

Se não funcionar, entre em contato comigo.

Nota: Este post também foi publicado em Inglês.

Posted on:
October 10, 2023
Length:
3 minute read, 480 words
Categories:
Windows
Tags:
cpp
See Also:
Getting the cursor size on Windows
Boost on Visual Studio 2019
Build libvolk on windows