分享几个 AutoHotKey 脚本:一键切换IDEA多行标签页等

2,353 阅读3分钟

AutoHotKey 之于 Windows,就好比 Javascript 之于 Chrome, 千万不要错过“DIY”操作系统的乐趣!

一键切换Android Studio/IDEA多行标签页

IDEA的标签页操作不是很灵活。单行模式下,拖拽时自动滚动很慢,而且一旦误操作,容易错误地把标签页拿下来,再放上去的时候,却变成了同一行的最后一个,很糟心。还是多行标签页重排起来比较轻松。

但是多行标签页又不能限制最大行数,数量一多,就会挤占大量的看代码空间,所以往往需要来回切换两种模式。

设置按钮位于 File -> Settings -> Editor -> Eidtor Tabs(这么长的路径…) ,也可以右击任意一个标签,选“Configure Eidtor Tabs…”

打开的设置会遮挡住IDE的界面,而且需要多次运用肉眼比对,在数个列表中搜寻相关入口。如此简单的功能,犯不着为它练成肌肉记忆,如果能一键切换就好了!

第一反应是,能不能用插件实现?然而搜索资料,出来的都是为插件写设置,而不是让插件去修改IDE设置。幸好,还有万能的AutoHotKey!

; 需要在Android Studio设置“Configure Eidtor Tabs”快捷键为 Ctrl+K
; 一键切换多行标签页
toggle_多行标签(){
	send ^k ; 调用的快捷键,直达设置界面
	sleep, 750
	send {Tab}
	sleep, 20
	send {Tab}
	sleep, 20
	send {Space}
	sleep, 20
	send {Enter}
}

绑定:

#IfWinActive ahk_exe studio64.exe
F1::
	toggle_多行标签()
return

一键重载脚本

AutoHotKey 脚本有个神奇的功能,那就是可以自己重载自己!

; 当打开 vscode,且标题为“脚本名称.ahk”时,按F1重载当前脚本!
#IfWinActive ahk_exe Code.exe
F1::
        WinGetTitle,Title
        TStart := SubStr(Title, 1, 10)
        IfEqual TStart, vscode.ahk
        {
            Reload ; 重载脚本……
        }
return

调用按键的默认行为(正确,用美元符号$修饰)

$F1::
    Send {F1}

调用按键的默认行为(错误)

AutoHotKey 可以暂时关闭对于按键的拦截,稍后再恢复,其间可以调用按键原来的功能:

; 如果是 ~F1:: 则不会拦截,但是两种功能会同时发生
F1::
	IfEqual TStart, vscode.ahk
	{
		Reload; 重载脚本……
	}
	else {
                ; 如果没有打开“脚本名称.ahk”,则调用原来的功能。
                ; p.s. 此处F1的原功能,是vscode显示所有命令面板
		Hotkey F1, Off
		Send {F1}
		Hotkey F1, On
	}
return

一键翻译

使用浏览器时,模拟右击+T,实现用加号键一键翻译。

#IfWinActive ahk_exe chrome.exe
NumpadAdd:: ; 小键盘加号打开谷歌翻译,回车切换
	CoordMode, Mouse, Screen
	global lastXW
	MouseGetPos, xpos, ypos
	WinGetPos,x,y,w,h
	xw := lastXW
	WinGetTitle, title
	IfInString, title, Chrome
	{
		xw := x + w
		lastXW := xw
	}
	pY := ypos
	if pY<200
		pY := 200
	MouseClick, Right, xw - 10, pY
	MouseMove, xpos, ypos
	sleep, 20
	Send {T}
	sleep, 20
	Send {T}
	;MouseMove, lastX, ypos
	; DllCall("SetCursorPos", "int", lastX, "int", ypos)
	var=取消置顶 %lastX% - %ypos%
	;弹出顺时消息("Title",var, "-500", "w120")
return

一键修改edge浏览器的“书签管理器”字体

“书签管理器”的字体也可以用css代码改,但是由于浏览器限制,不能像普通页面那样自动注入。所以可以用 AutoHotKey 模拟手动注入! 这才是机器人该干的事,减少重复负担!

; 调大edge“书签管理器”的字体
#IfWinActive ahk_exe msedge.exe
F1::
    Send {F12}
    WinGetTitle,WndTitle
    TStart := SubStr(WndTitle, 1, 9)
    IfEqual TStart, Favorites
    {
            clipboard := ""
            clipboard := "var d=document, sty=d.createElement('style'); if(d.title!='Favorite') { d.title='Favorite'; sty.innerText='.card_clickable_title{font-size:15px!important;font-weight:unset!important;white-space:unset!important;max-height: 32px;position:absolute; background:#3b3b3b!important;width:80%!important;}'; d.head.append(sty); }"
            ClipWait
            S := clipboard
            Sleep 750 ; 等待dev侧栏弹出
            Send ^v
            Sleep 150 ; 等待粘贴
            Send {Enter}
            Sleep 150 ; 等待执行
            Send {F12}
    }
return

一键复制文件名

执行复制()
{
	IfWinActive, ahk_exe PotPlayerMini64.exe
	{
		S := 
		WinGetTitle,S
		clipboard := ""
		clipboard := S
		ClipWait
		弹出顺时消息("",Clipboard,"-500", "w450")
	} else {
		clipboard := ""
		Send, ^c ; ctrl+c得全路径
		ClipWait
		IfWinActive, ahk_exe explorer.exe
		{
			S := clipboard
			SplitPath,S,,,,S
			clipboard := ""
			clipboard := S
			ClipWait
			弹出顺时消息("",clipboard,"-500", "w550")
			;MsgBox % "取得无后缀文件名 : " . S
			return
		}
	}
}
#IfWinActive ahk_exe explorer.exe
F1
	执行复制()
return
#IfWinActive ahk_exe PotPlayerMini64.exe
F1::  
	执行复制()
return

在屏幕上打印消息

弹出顺时消息(Title,Message,Timeout,Width := "w120")  {
Progress, %Width% b1 zh0 fs18, %Message%,,%Title%,
		settimer, killAlert,%Timeout%
}
弹出顺时消息("","脚本已加载···","-500", "w150")

Win+F2 关闭屏幕

Fn键坏了,可以用win代替一部分功能!从官方论坛搜来的方法,但是去掉了“Start screensaver”。实测可以连带关闭副屏。 Win+shift+F2 锁定工作站,似乎不会暂停后台音乐。

#F2::
	弹出顺时消息("","即将关闭屏幕…","-500", "w340")
	Sleep 500
	;SendMessage 0x112, 0xF140, 0, , Program Manager  ; Start screensaver
	SendMessage 0x112, 0xF170, 2, , Program Manager  ; Monitor off
Return

#+F2::
    Run rundll32.exe user32.dll`,LockWorkStation     ; Lock PC
    Sleep 1000
    SendMessage 0x112, 0xF170, 2, , Program Manager  ; Monitor off
    Return

封装 PowerToys Run 搜索词

PowerToys Run 是微软 PowerToys 的一个子功能,可以用alt+空格搜索窗口名称,界面优美,类似于在各种IDE或编辑器中用 Ctrl+E 搜索代码文件。

但是,PowerToy Run 没有对于搜索词的记忆。于是我们可以用 AutoHotKey 封装,比如任意界面用 alt+s 搜索 Android Studio,用 alt+g 搜索 Github,用 alt+d 搜索 Vscode 等等……

ListWindow(name) {
	S := clipboard
	clipboard := "" 
	clipboard := name
	ClipWait
	WinGetTitle, title, A
	IfNotEqual, title, PowerToys.PowerLauncher
	{
		Send !{Space}
		sleep 150
	}
	else{
		Send ^a
		sleep 50
	}
	WinGetTitle, title, A
	IfEqual, title, PowerToys.PowerLauncher
	{
		Send ^v
		sleep 50
	}
	clipboard := S
	sleep 50
}
!D::
	ListWindow("Code.exe") ; Visual Studio Code
Return
!C::
	ListWindow("Code.exe") ; Visual Studio Code
Return
!S::
	ListWindow("Studio64") ; Android Studio
Return
!G::
	ListWindow("Github")
Return
!Q::
	ListWindow("Chrome")
Return
!E::
	ListWindow("Edge")
Return
!W::
	ListWindow("explorer.exe")
Return

Potplayer 自动连跳

Potplayer 虽然设置复杂,但许多设定值得借鉴的。比如左右方向键跳跃时间,可以用ctrl或shift修改跳跃的幅度。利用AutoHotKey,更可以是实现自动连续跳跃(相当于一致按着)!

未完待续……

设置窗口点击穿透、滑动修改透明度

未完待续……

修改原生控件样式,强行点击灰色的按钮

设备管理器中,自带键盘的驱动无法被禁用,该按钮是灰色的。试试强行点击会不会成功?先用windows官方的spy++获得控件id,假设为0x000107D6:

~F2::  
        ; ^ 代表 切换 0x8000000 样式,也就是 WS_DISABLED
	WinSet, Style, ^0x8000000, ahk_id 0x000107D6
Return

按F2后,就可以点击灰色的按钮了,不过实测在这个例子中没啥用…

切换上一窗口

alt+tab虽然也很快,但是有一瞬间的视线突变与遮挡。搜索得旧论坛的代码,加以改进:

; 参考 https://www.autohotkey.com/board/topic/54030-resolved-activate-last-active-window-what-is-wrong
global Wnds
Wnds := []
DetectHiddenWindows, off
loop 
{	
	WinGet, wid, ID, A
	WinWaitNotActive, ahk_id %wid%
	idx := HasVal(Wnds, wid)
	if(idx) {
		Wnds.RemoveAt(idx)
	}
	Wnds.Push(wid)
}
; loop 后面的全局脚本不会执行,但不影响函数、快捷键的解析

LastWindow() {
	WinGet, wid, ID, A
	idx := Wnds.Length()
	While( idx > 0 )
	{
		pid := Wnds[idx]
		if(wid != pid)
		{
			WinGet, Style, Style, ahk_id %pid% 
			If (Style & 0x10000000)
			{
				WinActivate ahk_id %pid%
				break
			}
		}
		idx := idx - 1
	}
}
#Z::
	LastWindow()
return
#W::
	LastWindow()
return

AHK的数组连个indexOf都没有,需要:

HasVal(haystack, needle) {
	if !(IsObject(haystack)) || (haystack.Length() = 0)
		return 0
	for index, value in haystack
		if (value = needle)
			return index
	return 0
}

自动拖拽文本到选定的位置

未完待续……

更多有趣好玩的功能,等着你来探索!