GithubHelp home page GithubHelp logo

Comments (11)

lowbees avatar lowbees commented on June 2, 2024 4

在构造函数添加以下代码就可以了,好像是屏幕变化的时候Qt又给窗口加上了边框导致的

connect(window, &QWindow::screenChanged, this, [=]
{
    auto hWnd = reinterpret_cast<HWND>(window->winId());
    SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
});

from framelesshelper.

LeeGaning avatar LeeGaning commented on June 2, 2024 1

简单处理了下,跨屏幕移动时resize下,有概率失败。
另外副屏幕通过最大化时,再最小化时恢复一定白屏(原因屏幕识别错误)。

 .../FramelessHelper/Kernels/NativeWindowHelper.cpp | 30 ++++++++++++++--------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp b/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp
index 0c2cefa..b75da1f 100644
--- a/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp
+++ b/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp
@@ -110,7 +110,13 @@ bool NativeWindowHelper::nativeEventFilter(void *msg, long *result)
         LPMINMAXINFO lpMinMaxInfo = reinterpret_cast<LPMINMAXINFO>(lParam);
 
         QRect g = d->availableGeometry();
+        static QRect old_g = g;
         QMargins m = d->maximizedMargins();
+        if(g != old_g) {
+            //fix:screen swtich window size change bug
+            old_g = g;
+            d->window->resize(d->window->size());
+        }
 
         lpMinMaxInfo->ptMaxPosition.x = - m.left();
         lpMinMaxInfo->ptMaxPosition.y =  - m.top();
@@ -329,15 +335,17 @@ QMargins NativeWindowHelperPrivate::maximizedMargins() const
 
 QRect NativeWindowHelperPrivate::availableGeometry() const
 {
-    MONITORINFO mi{0};
-    mi.cbSize = sizeof(MONITORINFO);
-
-    auto hWnd = reinterpret_cast<HWND>(window->winId());
-    auto hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
-    if (!hMonitor || !GetMonitorInfoW(hMonitor, &mi)) {
-        Q_ASSERT(NULL != hMonitor);
-        return window->screen()->availableGeometry();
-    }
-
-    return QRect(mi.rcWork.left, mi.rcWork.top, mi.rcWork.right - mi.rcWork.left, mi.rcWork.bottom - mi.rcWork.top);
+    //fix:restore form max window,get wrong geometry size(multi screens)
+    return window->screen()->availableGeometry();
+
+//    MONITORINFO mi{0};
+//    mi.cbSize = sizeof(MONITORINFO);
+
+//    auto hWnd = reinterpret_cast<HWND>(window->winId());
+//    auto hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
+//    if (!hMonitor || !GetMonitorInfoW(hMonitor, &mi)) {
+//        Q_ASSERT(NULL != hMonitor);
+//        return window->screen()->availableGeometry();
+//    }
+//    return QRect(mi.rcWork.left, mi.rcWork.top, mi.rcWork.right - mi.rcWork.left, mi.rcWork.bottom - mi.rcWork.top);
 }

from framelesshelper.

Will-Zhu-27 avatar Will-Zhu-27 commented on June 2, 2024 1

我尝试在nativeEventFilter函数中处理WM_MOVE消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。

确实解决了,还可以精简下只设置SetWindowPos就行。

RECT rcClient;
GetWindowRect(msg->hwnd, &rcClient);
SetWindowPos(msg->hwnd, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, SWP_FRAMECHANGED);

from framelesshelper.

simonezhang avatar simonezhang commented on June 2, 2024

same problem

from framelesshelper.

LeeGaning avatar LeeGaning commented on June 2, 2024

Qt 5.12.9 + Mingw,same problem

from framelesshelper.

wuxinmao2008 avatar wuxinmao2008 commented on June 2, 2024

已遇到同样的问题。从一个屏幕到另一个屏幕的拖动过程中,绘制的区域变小了(水平方向上大约1016个像素,垂直方向上大约3040个像素)。还不知道如何修改

from framelesshelper.

liyangfamily avatar liyangfamily commented on June 2, 2024

同样遇到相同的问题,不知道如何修改

from framelesshelper.

liyangfamily avatar liyangfamily commented on June 2, 2024

我尝试在nativeEventFilter函数中处理WM_MOVE消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。

from framelesshelper.

winsoft666 avatar winsoft666 commented on June 2, 2024

我尝试在nativeEventFilter函数中处理WM_MOVE消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。

HOOK本就不是正道

from framelesshelper.

feipeng8848 avatar feipeng8848 commented on June 2, 2024

在多个显示器之间切换时,界面错位并失效,编译环境VS2015/2017都试过
显示器【1】正常
image
拖动到显示器【2】错位并失效
image

按钮其实并没有失效,只是坐标没变。我在做无边框的时候用的也是nativeEventFilter拦截系统消息,出现了完全一样的问题。

from framelesshelper.

feipeng8848 avatar feipeng8848 commented on June 2, 2024

我尝试在nativeEventFilter函数中处理WM_MOVE消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。

HOOK本就不是正道

感觉不涉及到什么正道不正道的问题,用win32开发无边框也是拦截消息的做法(msdn 的文档 https://docs.microsoft.com/en-us/windows/win32/dwm/customframe ) 更觉得这是windows系统做的不好

from framelesshelper.

Related Issues (18)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.