1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-10-06 09:17:07 +02:00

Change old window scaling eyeball with new windows api

This commit is contained in:
Elias Steurer 2023-07-13 11:20:05 +02:00
parent 646733bb2c
commit 0cdc4eefb0
2 changed files with 44 additions and 74 deletions

View File

@ -5,48 +5,9 @@
#include <QtQml> #include <QtQml>
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>
#include <shellscalingapi.h>
#include <vector> #include <vector>
#include <windows.h> #include <windows.h>
#include <shellscalingapi.h>
float getMonitorScaleFactor(int monitorIndex) {
// Get all monitors
int monitorCount = GetSystemMetrics(SM_CMONITORS);
if(monitorIndex < 0 || monitorIndex >= monitorCount) {
// Invalid monitor index
return 1.0f;
}
DISPLAY_DEVICE displayDevice;
ZeroMemory(&displayDevice, sizeof(displayDevice));
displayDevice.cb = sizeof(displayDevice);
// Enumerate through monitors until we find the one we're looking for
for(int i = 0; EnumDisplayDevices(NULL, i, &displayDevice, 0); i++) {
if(i == monitorIndex) {
DEVMODE devMode;
ZeroMemory(&devMode, sizeof(devMode));
devMode.dmSize = sizeof(devMode);
// Get settings for selected monitor
if(!EnumDisplaySettings(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode)) {
// Unable to get monitor settings
return 1.0f;
}
// Get DPI for selected monitor
HMONITOR hMonitor = MonitorFromPoint({devMode.dmPosition.x, devMode.dmPosition.y}, MONITOR_DEFAULTTONEAREST);
UINT dpiX = 0, dpiY = 0;
if(SUCCEEDED(GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY))) {
return (float)dpiX / 96.0f; // Standard DPI is 96
}
}
}
// If we reach here, it means we couldn't find the monitor with the given index or couldn't get the DPI.
return 1.0f;
}
/*! /*!
\class WinWindow \class WinWindow
@ -259,7 +220,7 @@ void WinWindow::setupWallpaperForOneScreen(int activeScreen)
ScreenPlayUtil::WinMonitorStats monitors; ScreenPlayUtil::WinMonitorStats monitors;
const int width = (std::abs(monitors.rcMonitors[activeScreen].right - monitors.rcMonitors[activeScreen].left) / scaling) + boderWidth; const int width = (std::abs(monitors.rcMonitors[activeScreen].right - monitors.rcMonitors[activeScreen].left) / scaling) + boderWidth;
const int height = (std::abs(monitors.rcMonitors[activeScreen].top - monitors.rcMonitors[activeScreen].bottom)/ scaling) + boderWidth; const int height = (std::abs(monitors.rcMonitors[activeScreen].top - monitors.rcMonitors[activeScreen].bottom) / scaling) + boderWidth;
const int x = monitors.rcMonitors[activeScreen].left + m_zeroPoint.x() + borderOffset; const int x = monitors.rcMonitors[activeScreen].left + m_zeroPoint.x() + borderOffset;
const int y = monitors.rcMonitors[activeScreen].top + m_zeroPoint.y() + borderOffset; const int y = monitors.rcMonitors[activeScreen].top + m_zeroPoint.y() + borderOffset;
@ -370,43 +331,52 @@ bool WinWindow::searchWorkerWindowToParentTo()
} }
/*! /*!
\brief Reads the physicalDotsPerInch and mapps them to scaling factors. \brief Returns scaling factor as reported by Windows.
This is needed to detect if the user has different monitors with
different scaling factors.
screen->physicalDotsPerInch()
100% -> 109 -> 1
125% -> 120 -> 1.25
150% -> 161 -> 1.5
...
*/ */
float WinWindow::getScaling(const int monitorIndex) float WinWindow::getScaling(const int monitorIndex) const
{ {
auto a = getMonitorScaleFactor(monitorIndex); // Get all monitors
return a; int monitorCount = GetSystemMetrics(SM_CMONITORS);
QScreen* screen = QGuiApplication::screens().at(monitorIndex);
const int factor = screen->physicalDotsPerInch(); if (monitorIndex < 0 || monitorIndex >= monitorCount) {
const int logicalDotsPerInch = screen->logicalDotsPerInch(); // Invalid monitor index
const int test = screen->physicalDotsPerInch() * screen->devicePixelRatio() ; return 1.0f;
const int devicePixelRatio = screen->devicePixelRatio() ;
switch (factor) {
case 72:
return 1;
case 107:
return 1.5;
case 109:
return 1;
case 161:
return 1;
default:
qWarning() << "Monitor with factor: " << factor << " detected! This is not supported!";
return 1;
} }
DISPLAY_DEVICE displayDevice;
ZeroMemory(&displayDevice, sizeof(displayDevice));
displayDevice.cb = sizeof(displayDevice);
// Enumerate through monitors until we find the one we're looking for
for (int i = 0; EnumDisplayDevices(NULL, i, &displayDevice, 0); i++) {
if (i == monitorIndex) {
DEVMODE devMode;
ZeroMemory(&devMode, sizeof(devMode));
devMode.dmSize = sizeof(devMode);
// Get settings for selected monitor
if (!EnumDisplaySettings(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode)) {
// Unable to get monitor settings
return 1.0f;
}
// Get DPI for selected monitor
HMONITOR hMonitor = MonitorFromPoint({ devMode.dmPosition.x, devMode.dmPosition.y }, MONITOR_DEFAULTTONEAREST);
UINT dpiX = 0, dpiY = 0;
if (SUCCEEDED(GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY))) {
return (float)dpiX / 96.0f; // Standard DPI is 96
}
}
}
// If we reach here, it means we couldn't find the monitor with the given index or couldn't get the DPI.
return 1.0f;
} }
/*! /*!
\brief Returns true of at least one monitor has active scaling enabled. \brief Returns true of at least one monitor has active scaling enabled.
*/ */
bool WinWindow::hasWindowScaling() bool WinWindow::hasWindowScaling() const
{ {
const auto screens = QGuiApplication::screens(); const auto screens = QGuiApplication::screens();
for (int i = 0; i < screens.count(); i++) { for (int i = 0; i < screens.count(); i++) {

View File

@ -55,8 +55,8 @@ private:
void setupWindowMouseHook(); void setupWindowMouseHook();
bool searchWorkerWindowToParentTo(); bool searchWorkerWindowToParentTo();
void configureWindowGeometry(); void configureWindowGeometry();
float getScaling(const int monitorIndex); bool hasWindowScaling() const;
bool hasWindowScaling(); float getScaling(const int monitorIndex) const;
private slots: private slots:
void checkForFullScreenWindow(); void checkForFullScreenWindow();