Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scroll 如何在一个窗口中获取滚动量?_Scroll_Scrollview_Autohotkey - Fatal编程技术网

Scroll 如何在一个窗口中获取滚动量?

Scroll 如何在一个窗口中获取滚动量?,scroll,scrollview,autohotkey,Scroll,Scrollview,Autohotkey,这是第一步,第二步是找到一种方法,将该金额应用于其他程序。但我真的不知道从哪里开始,我从谷歌看到的只是修改鼠标滚动的行为,而不是一个窗口中的滚动量。使用此选项而不是听按键的优点: 滚动将是无缝的,因为其他程序在后台滚动 单击滚动条可以工作 不同的滚动速度不会影响比较 在文本编辑器中移动行不会在PDF查看器中滚动页面 我可以告诉你我会做什么,但这不会很有趣 假设文本大致均匀分布(它可能不在两种语言之间,以及两个具有不同文本大小和宽度的窗口,在你做这项工作之前仔细考虑这一点),那么目标是强制两个

这是第一步,第二步是找到一种方法,将该金额应用于其他程序。但我真的不知道从哪里开始,我从谷歌看到的只是修改鼠标滚动的行为,而不是一个窗口中的滚动量。使用此选项而不是听按键的优点:

  • 滚动将是无缝的,因为其他程序在后台滚动
  • 单击滚动条可以工作
  • 不同的滚动速度不会影响比较
  • 在文本编辑器中移动行不会在PDF查看器中滚动页面

我可以告诉你我会做什么,但这不会很有趣

假设文本大致均匀分布(它可能不在两种语言之间,以及两个具有不同文本大小和宽度的窗口,在你做这项工作之前仔细考虑这一点),那么目标是强制两个滚动条相对于它们的整体相同百分比。所以您需要做的是编写一个函数来确定每个滚动条的百分比。我会截取两个窗口并裁剪出滚动条的重要部分,如下所示:

特别是向上和向下按钮、滚动手柄的顶部、滚动手柄的底部。将它们保存在自己的文件中。对两个窗口都这样做,以防它们绘制的滚动条略有不同

现在是棘手的部分。编写一个执行以下操作的函数:imagesearch在最右边25像素或指定窗口的顶部按钮。底部按钮也一样。手柄顶部也一样。手柄底部也一样。使用此选项确定窗口的位置

SetTitleMatchMode, 2 ; so it matches the end of the title
WinGetPos , X, Y, Width, Height, LibreOffice Writer ;exact substring of window name required
使用类似的方法查找滚动条部件

CoordMode, Pixel , Screen ;so image search searches entire screen
barwidth = 25 ; make sure it's more than the bar is wide.
ImageSearch, TopButtonX, TopButtonY, X+Width-barwidth , Y, X+Width, Y+Height, TopButton.bmp ; no jpg, fuzzy edges make searches fail
然后做一些数学,比如:

TopButtonY := TopButtonY+TopButtonImageHeight ; because we only care about the position of the bottom of the button.
BottomHandleY := BottomHandleY+BottomHandleImageHeight   ; because we only care about where the bottom of the handle is.
HandleHeight := TopHandleY - BottomHandleY ; how tall the scroll handle is
TotalHeight := TopButtonY - BottomButtonY - HandleHeight ;how tall the scroll field is
HandleOffset := TopHandleY - TopButtonY ;how far it is from the top
HandlePercent := HandleOffset / TotalHeight ; the part we care about. return this value
使用这样的函数,您可以知道每个窗口的滚动程度。剩下的就是发送滚动命令。有几个选择

; ControlSend , Control, Keys, LibreOffice Writer
ControlSend , Control, {Pgdown}, LibreOffice Writer ; or {Pgup}
ControlSend , Control, {WheelUp}, LibreOffice Writer ; or {wheeldown}
ControlSend , Control, {Up}, LibreOffice Writer ; or {down}
如果它允许您在窗口处于非活动状态时使用上/下箭头移动插入符号,那么这可能是最精确的选项,即使它需要更长的时间。最快、最精确的方法是使用control send模拟单击拖动。要使用ControlSend,您需要确定正在使用的控件。WindowSpy可以帮你做到这一点

首先:找到两个窗口的滚动位置。第二步确定哪个窗口处于活动状态。第三,以正确的方向轻推非活动窗口。重复此操作,直到它们在一定的公差范围内(否则它将无休止地上下反弹)

我再怎么强调也不为过,但请确保在尝试此操作之前,滚动条处于大致相同的位置。如果不是,你会浪费很多时间摆弄它。请记住,文本越长,其准确性将越来越低

如果它是一个选项,我肯定会考虑将两个窗口的内容复制到一个程序中,这样程序就可以访问更多的控件(或者更好的是专门用于这个目的的程序)。如果您有更多的访问权限,您可以使用段落分隔符以更精确的方式排列文本

如果您真的只想同时看到这两个文本(并且段落确实排成一行),您可以找到一个文本编辑器,它会告诉您以下信息:

如果autohotkey允许您读取该信息的文本,则可以将PDF复制到autohotkey的内存中(以行分隔),并使用autohotkey在可编辑文档中移动时仅显示PDF的相应段落


希望我所说的有帮助,祝你好运。

你认为图像中的手柄位置大致相同吗?我所能确定的是滚动的数量将是相同的。似乎要抓住这一点并不容易,这取决于程序在这一点上提供API,是吗?它们看起来处于大致相同的位置,但您非常接近顶部,即投影到520像素上的309页。这大约是每页2个像素,它留下的误差空间非常小。如果页面数量超过像素数量,即使文本完全相同且滚动条检测器写得很好,也肯定会出现问题。这不是一种理想的方法。如果保证段落在两种语言之间对齐,这就简化了事情:我假设您只是将PDF程序用作文本查看器,并且编辑器(libreoffice)也可以更改。因此,您只需找到一个编辑器,使行号(即插入符号前的“\n”个数)可用于autohotkey(或任何最方便的语言)。然后,您可以将PDF的内容复制到剪贴板,按“\n”分割,然后使用自己的程序将焦点放在与编辑器当前拥有的段落相匹配的段落上。这似乎是一个复杂的问题。对于一个简单的解决方案,我会尝试将相同的滚动事件发送到第二个窗口(只需要了解如何在不丢失当前焦点的情况下将事件发送到特定的应用程序)。但是,如果你想“同步”滚动位置,我认为这将是非常困难的。阅读卷轴位置和卷轴范围本身太难了-我试过一次,但很快就放弃了。@MikhailV那时候你是怎么做到的?我在AHK的论坛上读过相关主题,例如:有一些其他相关主题的链接,但坦率地说,这对我来说太多了。所以我想先读然后写滚动位置。