如何一次抓取滚动量window?
How to grab the scrolling amount in one window?
这是 scroll two windows simulteneously 的第一步,第二步是想办法将这笔金额应用到其他程序。但我真的不知道从哪里开始,我在 Google 中看到的只是修改 鼠标滚动 的行为,而不是 一次 window 的滚动量。使用它而不是听键的优点:
- 滚动将是无缝的,因为其他程序在后台滚动
- 点击滚动条有效
- 不同的滚动速度不影响比较
- 在文本编辑器中移动行不会在 PDF 查看器中滚动页面
我可以告诉你我会做什么,但这不会很有趣...
假设文本大致均匀分布(它可能不会像那样分布在两种语言之间,并且两种 windows 具有不同的文本大小和宽度,在您开始工作之前请仔细考虑),然后目标是强制两个滚动条相对于它们的整体处于相同的百分比。所以你需要做的是写一个函数来确定每个滚动条的百分比。我会同时截屏 windows 并裁剪掉滚动条的重要部分,如下所示:
特别是上下按钮,滚动手柄的顶部,滚动手柄的底部。将它们保存在自己的文件中。对两者都这样做 windows 以防他们绘制的滚动条略有不同。
现在是棘手的部分。编写一个执行以下操作的函数:图像搜索最右边 25 个像素或指定 window 内的顶部按钮。底部按钮也一样。手柄顶部也一样。手柄底部也一样。用它来确定你的 window 在哪里。
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
有了这样的功能,你就可以知道每个 window 滚动了多少。剩下的就是发送滚动命令。有几个选择。
; 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}
如果它允许您在 window 处于非活动状态时使用 up/down 箭头移动插入符号,这可能是最精确的选项,即使它需要更长的时间。最快最精确的方法是模拟点击拖动也使用控制发送。要使用 ControlSend,您需要弄清楚您正在使用哪个控件。 WindowSpy 可以帮助您。
所以首先:找到两个 windows 的滚动位置。其次确定哪个 window 处于活动状态。第三,将不活动的 window 推向正确的方向。重复直到它们在一定的公差范围内(否则它会无休止地上下弹跳)。
我怎么强调都不为过,但请确保在尝试此操作之前,将滚动条置于大致相同的位置足够接近。如果不是,您将浪费大量时间摆弄它。请记住,文本越长,它的准确性就会越来越低。
如果这是一个选项,我肯定会考虑将两者的内容复制 windows 到一个程序中,让您可以更多地访问控件(或更好的专门用于此目的的程序)。如果您有更多访问权限,则可以使用段落分隔符更精确地排列文本。
如果您真的只想并排查看两个文本(并且段落确实排成一行),您可以找到一个文本编辑器来告诉您这样的信息:
如果 autohotkey 让您阅读该信息的文本,您可以将 PDF 复制到 autohotkey 的内存中(以行分隔),并在可编辑文档中移动时使用 autohotkey 仅显示 PDF 的相应段落.
希望我说的对你有所帮助,祝你好运。
这是 scroll two windows simulteneously 的第一步,第二步是想办法将这笔金额应用到其他程序。但我真的不知道从哪里开始,我在 Google 中看到的只是修改 鼠标滚动 的行为,而不是 一次 window 的滚动量。使用它而不是听键的优点:
- 滚动将是无缝的,因为其他程序在后台滚动
- 点击滚动条有效
- 不同的滚动速度不影响比较
- 在文本编辑器中移动行不会在 PDF 查看器中滚动页面
我可以告诉你我会做什么,但这不会很有趣...
假设文本大致均匀分布(它可能不会像那样分布在两种语言之间,并且两种 windows 具有不同的文本大小和宽度,在您开始工作之前请仔细考虑),然后目标是强制两个滚动条相对于它们的整体处于相同的百分比。所以你需要做的是写一个函数来确定每个滚动条的百分比。我会同时截屏 windows 并裁剪掉滚动条的重要部分,如下所示:
特别是上下按钮,滚动手柄的顶部,滚动手柄的底部。将它们保存在自己的文件中。对两者都这样做 windows 以防他们绘制的滚动条略有不同。
现在是棘手的部分。编写一个执行以下操作的函数:图像搜索最右边 25 个像素或指定 window 内的顶部按钮。底部按钮也一样。手柄顶部也一样。手柄底部也一样。用它来确定你的 window 在哪里。
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
有了这样的功能,你就可以知道每个 window 滚动了多少。剩下的就是发送滚动命令。有几个选择。
; 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}
如果它允许您在 window 处于非活动状态时使用 up/down 箭头移动插入符号,这可能是最精确的选项,即使它需要更长的时间。最快最精确的方法是模拟点击拖动也使用控制发送。要使用 ControlSend,您需要弄清楚您正在使用哪个控件。 WindowSpy 可以帮助您。
所以首先:找到两个 windows 的滚动位置。其次确定哪个 window 处于活动状态。第三,将不活动的 window 推向正确的方向。重复直到它们在一定的公差范围内(否则它会无休止地上下弹跳)。
我怎么强调都不为过,但请确保在尝试此操作之前,将滚动条置于大致相同的位置足够接近。如果不是,您将浪费大量时间摆弄它。请记住,文本越长,它的准确性就会越来越低。
如果这是一个选项,我肯定会考虑将两者的内容复制 windows 到一个程序中,让您可以更多地访问控件(或更好的专门用于此目的的程序)。如果您有更多访问权限,则可以使用段落分隔符更精确地排列文本。
如果您真的只想并排查看两个文本(并且段落确实排成一行),您可以找到一个文本编辑器来告诉您这样的信息:
如果 autohotkey 让您阅读该信息的文本,您可以将 PDF 复制到 autohotkey 的内存中(以行分隔),并在可编辑文档中移动时使用 autohotkey 仅显示 PDF 的相应段落.
希望我说的对你有所帮助,祝你好运。