如何计算相对于屏幕的位置和大小,移动到显示器和还原比例

How to calculate position and size relative to screen, move to monitor and restore ratio

我正在尝试创建一个程序,该程序将捕获 windows x、y 位置和 w、h 比率,与它恰好打开的显示器进行比较。然后,程序将隐藏 window 直到它被释放。单击按钮时,它将在监视器上释放程序的主图形用户界面已移动到的位置。当 window 被释放时,它将以与原来相同的方式显示和定位自己,只是在新显示器上。到目前为止,一切正常,除了位置和大小部分。

我只使用显示器的工作区,并且设置了 3 个显示器。他们的坐标如下:

1(主要中心监视器)

左:0

顶部:0

右:1366

底部:738

2(右显示器)

剩下:1366

顶部:-652

右:3286

底部:398

3(左显示器)

左:-1920

顶部:-864

右:0

底部:186

为了直观表示,以下是它们的虚拟外观:

如您所见,左右显示器是 1920x1080,但我中间的显示器实际上是一台笔记本电脑,分辨率较小,为 1366x768

在代码方面,我尝试了几种方法,但最新的尝试如下:

存储值时,

Sysget monstart, Monitor, %currentMonitorIndex%
WinGetPos, answerWinx, answerWiny, answerWinw, answerWinh, %title%
if( monstartLeft <= 0 ) ; check if this is the left monitor and has negative coordinates
{
    if( monstartRight = 0 ) ; change 0 to 1 to prevent dividing by 0
    {
        monstartRight = 1
    }
    ; get ratios for the position and size relative to monitor
    ratiox := answerWinx / monstartRight
    ratioy := answerWiny / monstartBottom
    ratiow := ( answerWinx + answerWinw ) / monstartRight
    ratioh := ( answerWiny + answerWinh ) / monstartBottom
}
else
{
    ratiox := answerWinx / monstartLeft
    ratioy := answerWiny / monstartBottom
    ratiow := ( answerWinx + answerWinw ) / monstartLeft
    ratioh := ( answerWiny + answerWinh ) / monstartBottom
}

然后在尝试恢复 window 时:

cubeIndex := GetMonitorIndexFromWindow( hGui1 )
SysGet, monit, Monitor, %cubeIndex%
monitWidth := monitRight - monitLeft
monitHeight := monitBottom - monitTop
if( monitLeft >= 0 )
{
    winNewX := monitLeft + ( ratiox * ( monitRight - monitLeft ) )
    winNewY := monitTop + ( ratioy * ( monitBottom - monitTop ) )
    winNewW := ratiow * monitRight
    winNewH := ratioh * monitBottom
    winNewWidth := winNewW - winNewX
    winNewHeight := winNewH - winNewY
}
else
{
    winNewX := ratiox * monitLeft
    winNewY := ratioy * monitBottom
    winNewW := ratiow * monitLeft
    winNewH := ratioh * monitBottom
    winNewWidth := abs( winNewW - winNewX )
    winNewHeight := abs( winNewH - winNewY )
}
ratiox := ratiox
ratioy := ratioy
ratiow := ratiow
ratioh := ratioh

WinMove, %title%,, winNewX, winNewY, winNewWidth, winNewHeight
WinActivate, %title%

我之前在同一台显示器上隐藏和恢复时,它一直在工作。从那以后我改变了它,现在它使 window 重新出现在显示器之外。长期以来,我一直盯着这个并翻转价值观,以至于我自己都感到困惑。如果你有时间,我只需要第二双眼睛。

提前致谢。

编辑 按照下面发布的link,最终完美运行的代码如下:

用于存储值:

ratiox := ( answerWinx - monstartLeft ) / ( monstartRight - monstartLeft )
ratioy := ( answerWiny - monstartTop ) / ( monstartBottom - monstartTop )
ratiow := ( ( answerWinx + answerWinw ) - monstartLeft ) / ( monstartRight - monstartLeft )
ratioh := ( ( answerWiny + answerWinh ) - monstartTop ) / ( monstartBottom - monstartTop )

并检索它们:

winNewX := monitLeft + ( monitRight - monitLeft ) * ratiox
winNewY := monitTop + ( monitBottom - monitTop ) * ratioy
winNewW := monitLeft + ( monitRight - monitLeft ) * ratiow
winNewH := monitTop + ( monitBottom - monitTop ) * ratioh
winNewWidth := winNewW - winNewX
winNewHeight := winNewH - winNewY

根据 Forivin 的建议,这是我找到的答案

用于存储值:

ratiox := ( answerWinx - monstartLeft ) / ( monstartRight - monstartLeft )
ratioy := ( answerWiny - monstartTop ) / ( monstartBottom - monstartTop )
ratiow := ( ( answerWinx + answerWinw ) - monstartLeft ) / ( monstartRight - monstartLeft )
ratioh := ( ( answerWiny + answerWinh ) - monstartTop ) / ( monstartBottom - monstartTop )

并检索它们:

winNewX := monitLeft + ( monitRight - monitLeft ) * ratiox
winNewY := monitTop + ( monitBottom - monitTop ) * ratioy
winNewW := monitLeft + ( monitRight - monitLeft ) * ratiow
winNewH := monitTop + ( monitBottom - monitTop ) * ratioh
winNewWidth := winNewW - winNewX

winNewHeight := winNewH - winNewY