想实现Alt + W快捷键打开浏览器的操作,但打开浏览器前需要检测是否有浏览器窗口在后台,若有直接激活后台窗口,若没有则启动浏览器。
下面的AutoHotkey脚本之前用着没有什么问题。
!w::
SetTitleMatchMode, 2
if WinExist(ahk_exe msedge.exe)
WinActivate
else
Run C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
return
直到今天安装了YouTube Music的PWA应用,发现浏览器和YM同时在后台的情况下,快捷键变成了激活YM的窗口。
使用Windows Spy查看发现原来两个窗口在AutoHotkey看来是一样的,如图。
查文档没有找到解决方案,请问各位是否有解决方案呢?
没有解决方案的解决方案:删除YM的PWA,直接用浏览器。
把Edge固定到任务栏最左边,然后用Win+1效果一样吧?
1 个赞
不太喜欢在任务栏固定图标 
不过确实是个方法
不行的话就这样了 
1 个赞
dog
(荒废千年)
5
WinExist(WinTitle, WinText, ExcludeTitle, ExcludeText)
活用这个excludetitle就可以了
排除掉名字里含ym的窗口
1 个赞
哦对,忘了WinExist还有后面三个配置了
明天试试
还可以参考这里的内容:
也就是说,
WinTitle 可以放入多个条件,
例如下面这几个 WinTitile 都可以找到 Firefox 主窗口,
但是限定条件不一样:
Firefox ahk_exe firefox.exe ahk_class MozillaWindowClass
ahk_exe firefox.exe ahk_class MozillaWindowClass
ahk_class MozillaWindowClass
ahk_exe firefox.exe
楼主的这种情况,
一般在原来的 ahk_exe msedge.exe 后面加上 ahk_class [edge的类名] 就可以了,
记得中间至少要有一个空格~
就像下面这样:
if WinExist("ahk_exe msedge.exe ahk_class [edge的类名]") ; 如果窗口存在于任务栏
WinActivate ; 激活窗口
else ; 如果只在托盘区显示或尚未启动
Run "……\msedge.exe" ; 则运行该程序
Return
话说edge的类名应该知道如何获取吧?
WinGetClass就可以啦~
1 个赞
谢谢回复。
不知道你说的类名是不是我上面两张图中Windows Spy显示的ahk_class?
如果是的话,那恐怕你说的方法无法实现,因为他们两个都是Chrome_WidgetWin_1。

我在想AutoHotKey能不能识别窗口名称我不知道我用词对不对
我发现Edge在任务栏窗口的名称有一个固定的后缀,在我这里也就是
- Hayashikawa - Microsoft Edge,PWA的YM则没有这个后缀,是否有办法识别出这个后缀?
ahk_class是支持正则表达的,但我尝试运行失败了。

可能我的表述有些乱,抱歉。
dog
(荒废千年)
13
你直接把你代码里那句改成:
WinExist(ahk_exe msedge.exe, , Youtube Music)
应该就好了啊。
1 个赞
严谨版:
if WinExist(" - Microsoft Edge ahk_exe msedge.exe ahk_class Chrome_WidgetWin_1", , YouTube Music) ; 如果窗口存在于任务栏
WinActivate ; 激活窗口
else ; 如果只在托盘区显示或尚未启动
Run "……\msedge.exe" ; 则运行该程序
Return
简洁版:
if WinExist("ahk_exe msedge.exe", ,YouTube Music) ; 如果窗口存在于任务栏
WinActivate ; 激活窗口
else ; 如果只在托盘区显示或尚未启动
Run "……\msedge.exe" ; 则运行该程序
Return
WinTitle 可以写成
[窗口标题] ahk_exe [进程名] ahk_class [窗口类名]
多个条件之间用空格隔开就可以了,表明同时符合多个条件的窗口~
在使用 SetTitleMatchMode, 2 之后,[窗口标题] 可以是标题的一部分文字~
@dog 上述脚本同时也结合了这位的方法~
1 个赞
@dog
!w::
if WinExist("ahk_exe msedge.exe", , "YouTube Music")
WinActivate
else
Run C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
return
感谢两位提供解决方案,不过需要给YouTube Music加上双引号才能正确识别。
1 个赞
@dog
if WinExist("ahk_exe msedge.exe", , "YouTube Music")
你好,请问我现在想要排除YouTube Music和另外多个窗口,请问该怎么写呢?
dog
(荒废千年)
17
SetTitleMatchMode | AutoHotkey (autoahk.com)
可以使用正则表达式来进行
类似下面这样(没测试,不一定对
SetTitleMatchMode, RegEx
if WinExist("ahk_exe msedge.exe", , (qq music)|(kugou music)|(YouTube Music))
dms
(稻米鼠)
18
只看了问题,感觉这个直接指定好程序路径就行了。
在 WinTitle 中使用 ahk_exe ProcessNameOrPath 来识别属于任何具有给定名称或路径的进程的窗口.
(via https://www.autoahk.com/help/autohotkey/v2/docs/misc/WinTitle.htm#ahk_exe )
应该就可以稳定的限定在浏览器程序了。
我需要排除的都是PWA应用,所以他们的进程都是msedge.exe 
dms
(稻米鼠)
21
ahk_exe 后面可以放程序的进程名称,就像你们现在使用的一样( msedge.exe),也可以放进程的完整路径,那如果放入浏览器的完整路径(C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe),就指定的非常明确了