Use native Windows monitor handle for cursor overlay

This commit is contained in:
evgeny committed 2026-10-17 00:16:56 +02:00
1 parent 4a6f95cebd
commit e440c62339
3 files changed
+38 -17

No files matched your search

+9 -5
View File
@@ -57,6 +57,7 @@ extern "C" {
#ifdef UTUN_STREAM_WIN_CURSOR
#include "../src/stream_screen_cursor.h"
#include <QWindow>
#include <QtGui/qscreen_platform.h>
#include <qt_windows.h>
#endif
@@ -422,8 +423,10 @@ private slots:
POINT saved{}; QVERIFY(GetCursorPos(&saved));
auto restorePosition = qScopeGuard([&] { SetCursorPos(saved.x, saved.y); });
for (auto* screen : QGuiApplication::screens()) {
DEVMODEW mode{}; mode.dmSize = sizeof(mode);
QVERIFY(EnumDisplaySettingsExW(screen->name().toStdWString().c_str(), ENUM_CURRENT_SETTINGS, &mode, 0));
auto* native = screen->nativeInterface<QNativeInterface::QWindowsScreen>(); QVERIFY(native);
MONITORINFO monitor{}; monitor.cbSize = sizeof(monitor);
QVERIFY(GetMonitorInfoW(native->handle(), &monitor));
QPoint origin(monitor.rcMonitor.left, monitor.rcMonitor.top);
QWindow target(screen); target.setFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
target.setGeometry(QRect(screen->geometry().topLeft(), QSize(200, 160))); target.show();
QVERIFY(QTest::qWaitForWindowExposed(&target));
@@ -436,11 +439,12 @@ private slots:
StreamScreenCursor overlay(screen);
const QColor background(0x12, 0x34, 0x56), inverted(0xed, 0xcb, 0xa9);
for (QPoint position : {QPoint(60, 70), QPoint(0, 0)}) {
QVERIFY(SetCursorPos(mode.dmPosition.x + position.x(), mode.dmPosition.y + position.y()));
QVERIFY(SetCursorPos(origin.x() + position.x(), origin.y() + position.y()));
SetCursor(cursor);
CURSORINFO info{}; info.cbSize = sizeof(info); QVERIFY(GetCursorInfo(&info));
QVERIFY(info.flags & CURSOR_SHOWING); QVERIFY(info.hCursor == cursor);
QImage frame(mode.dmPelsWidth, mode.dmPelsHeight, QImage::Format_RGB32);
QImage frame(monitor.rcMonitor.right - monitor.rcMonitor.left,
monitor.rcMonitor.bottom - monitor.rcMonitor.top, QImage::Format_RGB32);
frame.setDevicePixelRatio(screen->devicePixelRatio()); frame.fill(background);
QImage blank = frame;
QVERIFY(overlay.draw(frame));
@@ -451,7 +455,7 @@ private slots:
SetCursor(nullptr); frame = blank;
QVERIFY(overlay.draw(frame)); QCOMPARE(frame, blank);
}
QVERIFY(SetCursorPos(mode.dmPosition.x + 60, mode.dmPosition.y + 70)); SetCursor(cursor);
QVERIFY(SetCursorPos(origin.x() + 60, origin.y() + 70)); SetCursor(cursor);
for (auto* other : QGuiApplication::screens()) {
if (other == screen) continue;
StreamScreenCursor otherOverlay(other);