有没有让非当前活动的chrome还能控制翻页的办法[已解决]

我在用 chrome 查看论文资料,然后用 word 写论文。

word 在当前活动窗口写作,同时,我能否按 ctrl+1(或其他什么键) 来控制 chrome 上的资料往下翻?鼠标中键调出的浏览器自动滚屏并不能满足我。

其实就类似于 chrome 全局快捷键或全局热键的功能,我搜了一下,浏览器没全局快捷键,相关的帖子指向的也只是老板键、一键隐藏浏览器之类。

不知道 autohotkey 能否给一个软件指定若干全局热键?

可以的,但是如果不想激活 Chrome,就还得借助鼠标滚轮活动来实现,只是把这个过程自动化。

或者先激活 Chrome,发送翻页按键,然后再自动切回来。

第一种方法鼠标要被暂时移动过去一下,第二种方法焦点要暂时过去一下。

如果这是滚动页面,那不需要任何其他工具,可以直接操作的。 平台:win10 msoffice365

自学了一下AHK,代码如下:

#f12:: ---------------------------按下win键和F12键
IfWinExist 网页论文 ------------搜索标题以 "网页论文"开头的窗口
WinActivate --------------------激活它
Send {Space} -------------------发送空格键,网页翻页
IfWinExist 我写的论文.doc ------搜索标题以 "我写的论文"开头的窗口
WinActivate --------------------激活它,返回论文
return

@allor

还有更高效的方法吗?现在的方法相当于要跳转到活动窗口,有没有方法是直接给后台窗口赋予一个全局热键的?就跟播放器下一首的功能类似,只需在后台的程序就可以,不需要是当前活动窗口。我想要一个 pagedown 的全局热键。

大概是这种?

很相近了, 在非激活的窗口用滚轮,我想要的是在非激活的窗口用按键啊。

不过,

前几天我想用 AHK 来实现这样的功能,却实现不了。AHK 可以向非激活的窗口发送按键,却没办法发送滚轮的动作。

看到第二句,我仿佛找到了方向,我再去搜搜AHK的相关命令。评论里有人说用 controlsend 这个,我去学学。

前段时间没空上来。
有两个方法,一个实现比较简单,但局限性较大;另一个就是你后面提到的 controlsend

如果 chrome 是前台显示但非活动状态的话,可以利用 Win10 的非活动窗口滚动特性。
这种情况只要鼠标放在没激活的 chrome 窗口范围内,用 AHK 模拟滚轮滚动就行了。
鼠标可以一直停留在 chrome 窗口,也可以 AHK 记忆位置,使用时移过去再移回来,码字时一般不会有影响。

用后台发送的方式更巧妙点,但要找准控件。建议用 ControlClick 来模拟滚轮而不是用 ControlSend 发送空格。

1赞

测试了两个下午,再经过你提示的 ControlClick ,终于弄好了。

按键左边alt+q,滚轮向下滑动。

按键右边alt+q,滚轮向上滑动。代码如下:

ControlGet,id,Hwnd,,,有没有让非当前活动的chrome
;文字为窗口的标题,写一部分即可
<!q::
;按键左边alt+q
Loop,6
;数字为滚轮快慢
ControlClick,,ahk_id %id%,,WheelDown
;滚轮向下滑动
return

ControlGet,id,Hwnd,,,有没有让非当前活动的chrome
;文字为窗口的标题,写一部分即可
>!q::
;按键右边alt+q
Loop,6
;数字为滚轮快慢
ControlClick,,ahk_id %id%,,WheelUp
;滚轮向上滑动
return




使用方法:


以本帖滚动为例,
因为代码里抓取的是“有没有让非当前活动的chrome”这个窗口,即B。


如果


网页A在B之前(包括把AB最小化到任务栏里),如图所示:这个代码无效。


网页B在A之前,有 C 的话,alt+q 控制的是 C 滚动。
网页B在A之前, C 最小化,alt+q 控制 B 滚动。





最后,谢谢楼上两位的帮助。

为什么不能发送键盘按键?如何才可以发按键?

比如,ControlSend,,{Down},ahk_id %id% 根本不起作用,是无效的。

换成{Space}或{PgDn}也是无效的,我之前就是卡在这个地方,想不通。

ControlSend 的语法也没出错,搞不懂不能发按键的原因。

我换了个方法,随便打开一个长文档 TXT 它的窗口是可以发按键的,然后此 TXT 用窗口复杂的写字板打开,这个 ControlSend 就不能发送按键了。



再把上面的代码优化一下:

ControlGet,id,Hwnd,,,有没有让非当前活动的chrome
;文字为窗口的标题,写一部分即可

{
<!q::
;按键左边alt+q
Loop,6
;数字为滚轮快慢
ControlClick,,ahk_id %id%,,WheelDown
;滚轮向下滑动
return
}

{
>!q::
;按键右边alt+q
Loop,6
;数字为滚轮快慢
ControlClick,,ahk_id %id%,,WheelUp
;滚轮向上滑动
return
}

发送按键的话你得找准对应的接受按键事件的窗口控件(class)
模拟鼠标的话,一般找准窗口就行了。

或者试试这个:

IfWinExist 窗口标题
{
ControlFocus, Static1
ControlSend, ahk_parent, {Space}
}
return

我没搞懂控件是什么意思?控件是窗口里的元素?控件和要用哪条命令或函数,它们之间有什么关系?

控件就是窗口的组成元素,Control 系列命令就是用来操作控件的,只是个别命令需要你指定具体的操作目标。
比如你想发送 space 到 chrome,标题栏、地址栏、网页、网页上的输入框,这些控件都可以接受 space,但只有部分会响应,给出的还未必是你需要的反馈,所以这时候你就必须指定这个 space 是发给谁。

相关知识可以看这里 AHK中文资料

对于chrome窗口,window spy 里 classNN 都是空的,你的第二行命令好像没用

ControlFocus, Static1 
ControlSend, ahk_parent, {Space}

第三行我倒是明白什么意思。还有其他方法给chrome窗口发按键吗?

这个我在 Firefox 测试是没问题的,Chrome 的窗口构成,各个版本的变化太大……

可以试试这个 ControlSend,,{space},ahk_class Chrome_WidgetWin_1

但别抱太大希望,Chrome + ControlSend 是个经典问题了,每版能用的方法都不一样……

Chrome_WidgetWin_1 这个元素我之前测试过,现在用你给的命令,好像响应的是地址栏。

原来是chrome的锅。看来是只能发送鼠标了,功能已实现。