# AutoHotkey如何检测软件是否运行？

**URL:** <https://meta.appinn.net/t/topic/38604>\
**Category:** 问题求助\
**Tags:** autohotkey\
**Created:** [2022 年12 月 4 日 13:49 UTC](https://meta.appinn.net/t/topic/38604 "2022-12-04T13:49:02Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2022 年12 月 4 日 13:49 UTC](https://meta.appinn.net/t/topic/38604/1 "2022-12-04T13:49:02Z")

</div>

想实现`Alt + W`快捷键打开浏览器的操作，但打开浏览器前需要检测是否有浏览器窗口在后台，若有直接激活后台窗口，若没有则启动浏览器。

下面的AutoHotkey脚本之前用着没有什么问题。

```auto
!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看来是一样的，如图。

 ![image](https://meta.appinn.net/uploads/default/original/3X/d/2/d214b90ea94e6b94d314d5f20fabb330008e7f2d.jpeg)  
 ![image](https://meta.appinn.net/uploads/default/original/3X/a/4/a498367c721cc143a9d49789c8beaf5d28443071.jpeg)

查文档没有找到解决方案，请问各位是否有解决方案呢？

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2022 年12 月 4 日 14:05 UTC](https://meta.appinn.net/t/topic/38604/2 "2022-12-04T14:05:51Z")

</div>

~~没有解决方案的解决方案：删除YM的PWA，直接用浏览器。~~

---

<div class="post-metadata">

**Author:** ![qiuzip](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/q/e36b37/32.png) [@qiuzip](https://meta.appinn.net/u/qiuzip)\
**Post date:** [2022 年12 月 4 日 14:11 UTC](https://meta.appinn.net/t/topic/38604/3 "2022-12-04T14:11:26Z")

</div>

把Edge固定到任务栏最左边，然后用Win+1效果一样吧？

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2022 年12 月 4 日 14:13 UTC](https://meta.appinn.net/t/topic/38604/4 "2022-12-04T14:13:42Z")

</div>

不太喜欢在任务栏固定图标 :rofl:  
不过确实是个方法  
不行的话就这样了 :smiling_face_with_three_hearts:

---

<div class="post-metadata">

**Author:** ![dog](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/dog/32/18667_2.png) [@dog](https://meta.appinn.net/u/dog)\
**Post date:** [2022 年12 月 4 日 14:20 UTC](https://meta.appinn.net/t/topic/38604/5 "2022-12-04T14:20:54Z")

</div>

WinExist(WinTitle, WinText, ExcludeTitle, ExcludeText)  
活用这个excludetitle就可以了  
排除掉名字里含ym的窗口

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2022 年12 月 4 日 15:05 UTC](https://meta.appinn.net/t/topic/38604/7 "2022-12-04T15:05:27Z")

</div>

哦对，忘了WinExist还有后面三个配置了🤦‍♂️明天试试

---

<div class="post-metadata">

**Author:** ![chr](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/c/bb73d2/32.png) [@chr](https://meta.appinn.net/u/chr)\
**Post date:** [2022 年12 月 4 日 17:01 UTC](https://meta.appinn.net/t/topic/38604/8 "2022-12-04T17:01:42Z")

</div>

我就是Win1浏览器，Win2资源管理器 :face_with_open_eyes_and_hand_over_mouth:

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2022 年12 月 4 日 23:11 UTC](https://meta.appinn.net/t/topic/38604/9 "2022-12-04T23:11:45Z")

</div>

资源管理器不是有Win +E嘛🤪:rofl:

---

<div class="post-metadata">

**Author:** ![chr](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/c/bb73d2/32.png) [@chr](https://meta.appinn.net/u/chr)\
**Post date:** [2022 年12 月 5 日 00:39 UTC](https://meta.appinn.net/t/topic/38604/10 "2022-12-05T00:39:04Z")

</div>

主要是固定住任务栏的位置不乱跑

---

<div class="post-metadata">

**Author:** ![KagamineTime](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/k/4da419/32.png) [@KagamineTime](https://meta.appinn.net/u/KagamineTime)\
**Post date:** [2022 年12 月 5 日 11:21 UTC](https://meta.appinn.net/t/topic/38604/11 "2022-12-05T11:21:45Z")

</div>

还可以参考这里的内容：

> **[WinTitle 与上次找到的窗口 | AutoHotkey v1](https://wyagd001.github.io/zh-cn/docs/misc/WinTitle.htm#multi)**
>
> This page lists criteria that can be used in the WinTitle parameter of commands, functions, etc. to determine the target window(s).

也就是说，  
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的类名]` 就可以了，  
记得中间至少要有一个空格～  
就像下面这样：

```auto
if WinExist("ahk_exe msedge.exe ahk_class [edge的类名]") ; 如果窗口存在于任务栏
	WinActivate ; 激活窗口
else ; 如果只在托盘区显示或尚未启动
	Run "……\msedge.exe" ; 则运行该程序
Return

```

话说`edge的类名`应该知道如何获取吧？  
`WinGetClass`就可以啦～

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2022 年12 月 5 日 12:18 UTC](https://meta.appinn.net/t/topic/38604/12 "2022-12-05T12:18:25Z")

</div>

谢谢回复。  
不知道你说的类名是不是我上面两张图中Windows Spy显示的`ahk_class`?  
如果是的话，那恐怕你说的方法无法实现，因为他们两个都是`Chrome_WidgetWin_1`。  
:rofl: :rofl: :rofl:  
我在想AutoHotKey能不能识别`窗口名称` ~~我不知道我用词对不对~~

 ![image](https://meta.appinn.net/uploads/default/original/3X/a/5/a5ba7e1ec711218707bffe5636e132b9a8ef747d.png)  
我发现Edge在任务栏窗口的名称有一个固定的后缀，在我这里也就是` - Hayashikawa - Microsoft Edge`，PWA的YM则没有这个后缀，是否有办法识别出这个后缀？  
`ahk_class`是支持正则表达的，但我尝试运行失败了。  
:thinking: :thinking: :thinking:  
可能我的表述有些乱，抱歉。

---

<div class="post-metadata">

**Author:** ![dog](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/dog/32/18667_2.png) [@dog](https://meta.appinn.net/u/dog)\
**Post date:** [2022 年12 月 5 日 12:29 UTC](https://meta.appinn.net/t/topic/38604/13 "2022-12-05T12:29:46Z")

</div>

你直接把你代码里那句改成：  
WinExist(ahk\_exe msedge.exe, , Youtube Music)

应该就好了啊。

---

<div class="post-metadata">

**Author:** ![KagamineTime](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/k/4da419/32.png) [@KagamineTime](https://meta.appinn.net/u/KagamineTime)\
**Post date:** [2022 年12 月 5 日 14:33 UTC](https://meta.appinn.net/t/topic/38604/14 "2022-12-05T14:33:50Z")

</div>

严谨版：

```auto
if WinExist(" - Microsoft Edge ahk_exe msedge.exe ahk_class Chrome_WidgetWin_1", , YouTube Music) ; 如果窗口存在于任务栏
	WinActivate ; 激活窗口
else ; 如果只在托盘区显示或尚未启动
	Run "……\msedge.exe" ; 则运行该程序
Return

```

简洁版：

```auto
if WinExist("ahk_exe msedge.exe", ,YouTube Music) ; 如果窗口存在于任务栏
	WinActivate ; 激活窗口
else ; 如果只在托盘区显示或尚未启动
	Run "……\msedge.exe" ; 则运行该程序
Return

```

WinTitle 可以写成  
`[窗口标题] ahk_exe [进程名] ahk_class [窗口类名]`  
多个条件之间用空格隔开就可以了，表明同时符合多个条件的窗口～  
在使用 `SetTitleMatchMode, 2` 之后，`[窗口标题]` 可以是标题的一部分文字～

@dog 上述脚本同时也结合了这位的方法～

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2022 年12 月 6 日 00:48 UTC](https://meta.appinn.net/t/topic/38604/15 "2022-12-06T00:48:25Z")

</div>

@dog

```auto
!w::
if WinExist("ahk_exe msedge.exe", , "YouTube Music")
    WinActivate
else
    Run C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
return

```

感谢两位提供解决方案，不过需要给`YouTube Music`加上双引号才能正确识别。

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2023 年1 月 12 日 12:49 UTC](https://meta.appinn.net/t/topic/38604/16 "2023-01-12T12:49:06Z")

</div>

@dog  
`if WinExist("ahk_exe msedge.exe", , "YouTube Music")`  
你好，请问我现在想要排除`YouTube Music`和`另外多个窗口`，请问该怎么写呢？

---

<div class="post-metadata">

**Author:** ![dog](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/dog/32/18667_2.png) [@dog](https://meta.appinn.net/u/dog)\
**Post date:** [2023 年1 月 12 日 13:12 UTC](https://meta.appinn.net/t/topic/38604/17 "2023-01-12T13:12:02Z")

</div>

[SetTitleMatchMode | AutoHotkey (autoahk.com)](https://www.autoahk.com/help/autohotkey/zh-cn/docs/commands/SetTitleMatchMode.htm)

可以使用正则表达式来进行  
类似下面这样（没测试，不一定对

```auto
SetTitleMatchMode, RegEx
if WinExist("ahk_exe msedge.exe", , (qq music)|(kugou music)|(YouTube Music))

```

---

<div class="post-metadata">

**Author:** ![dms](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/dms/32/3545_2.png) [@dms](https://meta.appinn.net/u/dms)\
**Post date:** [2023 年1 月 12 日 13:16 UTC](https://meta.appinn.net/t/topic/38604/18 "2023-01-12T13:16:22Z")

</div>

只看了问题，感觉这个直接指定好程序路径就行了。

> 在 WinTitle 中使用 `ahk_exe ProcessNameOrPath` 来识别属于任何具有给定名称或路径的进程的窗口.

（via [https://www.autoahk.com/help/autohotkey/v2/docs/misc/WinTitle.htm#ahk\_exe](https://www.autoahk.com/help/autohotkey/v2/docs/misc/WinTitle.htm#ahk_exe) ）

应该就可以稳定的限定在浏览器程序了。

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2023 年1 月 12 日 13:40 UTC](https://meta.appinn.net/t/topic/38604/19 "2023-01-12T13:40:19Z")

</div>

试了一下不行，排除参数没有生效

---

<div class="post-metadata">

**Author:** ![CyanRuin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/cyanruin/32/60235_2.png) [@CyanRuin](https://meta.appinn.net/u/CyanRuin)\
**Post date:** [2023 年1 月 12 日 13:41 UTC](https://meta.appinn.net/t/topic/38604/20 "2023-01-12T13:41:12Z")

</div>

我需要排除的都是PWA应用，所以他们的进程都是msedge.exe :thinking:

---

<div class="post-metadata">

**Author:** ![dms](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/dms/32/3545_2.png) [@dms](https://meta.appinn.net/u/dms)\
**Post date:** [2023 年1 月 12 日 14:01 UTC](https://meta.appinn.net/t/topic/38604/21 "2023-01-12T14:01:50Z")

</div>

> [@CyanRuin](#):
>
> 所以他们的进程都是msedge.exe

ahk\_exe 后面可以放程序的进程名称，就像你们现在使用的一样（ msedge.exe），也可以放进程的完整路径，那如果放入浏览器的完整路径（`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe`），就指定的非常明确了

[下一页](https://meta.appinn.net/t/topic/38604.md?page=2)
