我正在尝试创建一个程序,该程序将捕获windows x,y位置和w,h比率与它恰好打开的监视器相比较。然后,程序将隐藏窗口,直到它被释放。它将在监视器上释放,当单击一个按钮时,程序的主要gui已被移动到。当窗口被释放时,它将以与原来相同的方式显示和定位,就在新显示器上。到目前为止,除了位置和尺寸之外,一切都在起作用。
我只使用显示器的工作区域,并设置了3台显示器。他们的坐标如下:
左:0
上:0
右:1366
底部:738
左:1366
上:-652
右:3286
底部:398
左:-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
}
然后在尝试恢复窗口时:
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
答案 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