如何计算相对于屏幕的位置和大小,移动到监视和恢复比率

时间:2016-05-17 19:52:53

标签: math autohotkey

我正在尝试创建一个程序,该程序将捕获windows x,y位置和w,h比率与它恰好打开的监视器相比较。然后,程序将隐藏窗口,直到它被释放。它将在监视器上释放,当单击一个按钮时,程序的主要gui已被移动到。当窗口被释放时,它将以与原来相同的方式显示和定位,就在新显示器上。到目前为止,除了位置和尺寸之外,一切都在起作用。

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

1(主要中心监视器)

左:0

上:0

右:1366

底部:738

2(右侧监视器)

左:1366

上:-652

右:3286

底部:398

3(左侧监视器)

左:-1920

上:-864

右:0

下图:186

对于视觉表示,这是虚拟的样子:

visual

正如您所看到的,左侧和右侧显示器是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
}

然后在尝试恢复窗口时:

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%

当我在同一台显示器上隐藏和恢复之前,我让它工作了。从那以后我改变了它,现在它使窗口重新出现在监视器上。我一直在盯着这个并且将价值翻转了很长时间,我让自己感到困惑。如果你有时间,我只需要第二双眼睛。

提前致谢。

修改按照下面发布的链接,最终完美运行的代码如下:

用于存储值:

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

1 个答案:

答案 0 :(得分:0)

根据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