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.