# 事件触发
当某个事件发生后触发动作。需Quicker版本1.36.26+。
注意:
- 本功能为测试阶段,欢迎反馈问题或提出需求。
- 如果您有多台电脑,请全部都升级到最新版。否则,如果在旧版本上修改并同步设置,将会丢失事件触发数据。
- 本功能为专业版功能,免费版可创建2条规则以便体验之用。
- 参考和分享:[事件触发功能使用场景分享贴](https://getquicker.net/QA/Question/15783)
# 概要
## 配置方式
通常使用这样的步骤配置事件触发规则:
1)创建并测试动作。可以考虑将此类动作放入单独的[虚拟场景](https://getquicker.net/KC/Manual/Doc/profiles#DqJsy)中。
2)创建事件触发规则,在事件发生后运行步骤1中创建的动作。
## 事件规则

每条事件触发规则分为3个部分:
(1)**事件类型**;
(2)**说明**:描述本条规则的目的或功能,方便规则较多时进行区分;
(3)**触发条件参数**,用于限定仅某些符合条件的事件才会触发动作。
有多个条件时,需要每个条件都符合。
对于单个条件,参数通常可以接收三种形式的参数:
- a. 单个值(不区分小写)。
- b. 用小写分号`;`隔开的多个值。
- c. 使用`regex:正则表达式`指定一个匹配验证表达式。
部分参数支持选择器,可在鼠标悬浮在输入框上后,在右侧看到按钮。

【**事件过滤表达式**】(需版本1.7.1+)如果需要,可以使用自定义的表达式对事件信息(输出参数)做进一步的判断,以确定是否真的需要触发动作。此表达式需要返回布尔类型的值,返回`true`表示允许继续执行动作。请参考[表达式文档](https://getquicker.net/kc/help/doc/expression)。
假如有一个监控目录中图片文件的创建的需求。因为文件类型较多,所以文件筛选器只能使用`*.*`,这时候目录中创建任何文件都会触发事件。通过事件过滤表达式,就可以实现文件名仅以特定后缀结尾的才真正执行目标动作。

或者,想要仅在启动第一个记事本窗口时执行动作,可以判断一下进程个数:

(4)**执行动作设置**。
- 运行动作:要执行的动作,可以为动作ID或不重复的动作名称。
- 自定义动作参数。 可以使用[插值](https://getquicker.net/KC/Help/Doc/interpolation)或表达式插入事件输出的一些数据。

- 延迟执行时间:事件发生后稍等一些时间再执行动作。可用于等待被操作的目标窗口准备好接受输入。
- 限定主机:限制规则尽在特定的电脑上执行(根据电脑主机名判断)。
- 启用此任务:是否启用此规则。
- 触发后不再判断和执行后续规则:如果为某个事件定义多条规则,启用此选项后,当某条规则匹配到,后面的规则就不再判断了。此选项对于一些事件类型不适合,如目录监控、空闲和连续使用、定时重复等。
## 调试规则
可以使用 [显示动作参数](https://getquicker.net/Sharedaction?code=4013fb3b-feeb-4d23-1b01-08db0722f6ff) 动作调试规则的触发(在规则触发时显示传递给动作的参数)。

# 事件类型
## 窗口焦点变化
### 窗口获得焦点
某个窗口变为活动窗口(前台窗口)时,如果窗口的标题、类名、所属进程符合设定的条件,则触发对应的动作。

注意:
(1)请设置一定的“延迟执行时间”以避免:a. 窗口未准备好造成的动作失败 b. 某些因为线程冲突造成的卡顿现象。
(2)触发的动作避免出现界面,以免意外抢占焦点,产生重复激活窗口的情况或其它副作用。
**触发条件参数:**
- 窗口标题:可选;
- 窗口类名:可选;
- 进程名:可选,程序名去除.exe后缀。
- 进程变化条件:
- **不判断**:不判断活动进程变化情况,即使同一个进程的多个窗口切换焦点也触发;
- **进程变化**:焦点在同一个进程内的窗口之间切换不再触发;焦点切换到另外一个进程时触发(如焦点从一个记事本窗口切换到另一个记事本窗口或Word窗口);
- **程序变化**:焦点在同一个程序的窗口之间切换时不再触发(如多个记事本窗口,即使它们每个都有自己的进程);而在切换不同程序时触发(如焦点从记事本窗口切换到了Word窗口)。
**输出参数**(用于向被触发的动作传递参数):
包含新获得焦点的窗口信息和前一个窗口的信息。

**示例场景**
(1)“另存为...”“打开...”窗口显示时,自动切换到最后打开的资源管理器目录(触发动作:[切换](https://getquicker.net/Sharedaction?code=b7a369da-ec8e-4d0f-764b-08d950c2afd2))。

### 窗口失去焦点
当一个窗口失去焦点时触发。
触发条件参数与“窗口获得焦点”一致。
输出参数包含丢失焦点的窗口的信息和新获得焦点的窗口信息。

## 进程
### 进程启动(进程被创建)
在某个程序启动后执行动作。

输出参数:

### 进程退出
某个程序退出后执行动作。参数与“进程被创建”事件相同。
## 网络状态变化
### 网络连接了
需Win10及以上操作系统支持。
当计算机连接到某个网络时执行动作。

网络连接时,可能会经历多次状态变化,连接级别(ConnectivityLevel)逐渐升高,从而多次触发事件。
**触发条件参数**
【网络名】可以点击参数输入框右侧按钮选取。

【最低连接级别】达到指定的连接级别之后才判断为网络连接成功了。
连接级别:[参考文档](https://learn.microsoft.com/en-us/uwp/api/windows.networking.connectivity.networkconnectivitylevel?f1url=%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(Windows.Networking.Connectivity.NetworkConnectivityLevel.LocalAccess)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.7.2)%3Bk(DevLang-csharp)%26rd%3Dtrue&view=winrt-22621)
- 0:未连接
- 1:本地连接(LocalAccess,仅连接到本地局域网)
- 2:受限的Internet连接(ConstrainedInternetAccess,需要身份验证以后才能访问Internet的情况,比如在机场、咖啡店等wifi连接的情况)
- 3:Internet连接(InternetAccess,可以访问局域网和Internet)
**输出参数**

【NetworkName】网络连接名称。
【ConnectivityLevel】连接级别。(参见本文前面的说明)
【IPAddress】IP v4 地址。
【IsWlan】是否为WLAN连接。
【IsWwan】是否为移动数据连接。
【InterfaceType】Iana连接类型:由 Internet 分配名称机构定义的接口类型 (IANA) [参考文档](https://learn.microsoft.com/zh-cn/uwp/api/windows.networking.connectivity.networkadapter.ianainterfacetype?f1url=%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(Windows.Networking.Connectivity.NetworkAdapter.IanaInterfaceType)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.7.2)%3Bk(DevLang-csharp)%26rd%3Dtrue&view=winrt-22621)。
【SSID】WLAN连接时,所连接热点的ssid。
### 网络断开了
需Win10及以上操作系统支持。
当计算机丢失了网络时执行动作。
**输出参数**
【NetworkName】之前连接的网络名称。
## 设备
### 蓝牙设备连接了
当某个蓝牙设备连接后,执行指定的动作。需Win10以上操作系统支持此功能。
注:有时候计算机可能无法正常识别蓝牙设备的设备名称。如果遇到无法触发的情况,可以使用动作 [显示动作参数](https://getquicker.net/Sharedaction?code=4013fb3b-feeb-4d23-1b01-08db0722f6ff) 将DeviceName作为参数传递给动作,以显示软件检测到的设备名。 通常删除设备重新配对可以解决。

输出参数:

### 蓝牙设备断开了
当某个蓝牙设备断开后执行指定的动作。

输出参数:

### 蓝牙设备进入附近
当某个蓝牙设备进入附近后,触发动作。
此功能根据蓝牙低功耗(BluetoothLE)设备的广播消息判断设备是否在附近。
(不是所有的蓝牙设备都会广播。可以点击“设备名”参数右边的蓝牙图标选择设备)

输出参数:

### 蓝牙设备离开附近
当无法收到指定设备的广播消息后20秒,判断为设备离开。

出参数:

注意:因为蓝牙设备受信号干扰等因素,可能会无法将广播送达电脑,此功能有误触发的可能。
### 磁盘插入
插入U盘等情况后,触发动作。
注意:U盘如果包含多个分区,将会触发多次事件。

输出参数:

### 音频设备激活(如耳机插入等)
插入耳机/话筒等情况时触发动作。

输出参数:

### 音频设备断开(拔出)
耳机拔出等情况触发动作。
参数同“音频设备激活”事件。
## 键盘状态
### 按键锁定状态切换
CpasLock(Captial)/NumLock/ScrollLock 三个键切换锁定状态时触发动作。

注:Captial = CapsLock、Scroll = ScrollLock。
**触发条件参数**
【按键】关注的按键。为“任意”时,3个键的切换都会触发事件,否则仅在指定按键切换时触发。
**输出参数:**

【KeyCode】键名,的可能值为`CapsLock``Scroll``NumLock`。由于一个键可能有多个键名(Captial/CapsLock等),如果需要区分按的哪个键,建议使用KeyValue进行判断。
【KeyValue】键值,CaspLock=20, NumLock=144,ScrollLock=145。
【IsLocked】是否锁定。
## 浏览器
### 浏览器网址变更
如下事件发生后触发事件:
- 浏览器切换了标签页,或打开了新的标签页;
- 某个标签页网址更新了;
- 从其它软件切换到了浏览器窗口。
本功能需要在浏览器扩展中开启网址同步功能:

**触发条件参数:**
【匹配网址】仅当新加载的网址匹配指定的值时才触发事件。
本参数的匹配规则为实际网址以本参数值指定的网址开始。如参数设置为 `https://test.com`
则所有`https://test.com/a/b/c`都可以匹配。
【忽略非活动标签页的网址变更】选中时,忽略非活动网页的变更事件。需要扩展0.7.2版本。

**输出参数:**

【Browser】浏览器进程名。
【Pid】浏览器进程ID。
【TabId】发生事件的标签页ID。
【Url】标签页网址。
【IsActive】此标签页是否为活动标签页。需扩展0.7.2版本。
【EventType】事件类型。1:标签页激活; 2:标签页更新; 3:窗口获得焦点。
## 文件系统
### 文件系统事件
当指定目录发生文件创建、删除、重命名或更新时,触发事件。

**触发条件参数**
【路径】监控的路径。每个规则只能指定一个路径,可在路径中使用环境变量(如`%USERPROFILE%\AppData%`)。该路径必须事先存在。
【文件筛选器】使用带有通配符的表达式设定关注的文件类型。此处只能指定一种。使用 `*.*`表示监控所有文件。
【包含子目录】是否监控子目录中的文件。
【监控文件创建事件】【监控文件修改事件】【监控文件删除事件】【监控文件重命名事件】设置监控的事件类型。
**输出参数**

【ChangeType】变更类型,可能为`Created``Deleted``Changed``Renamed`。
【Name】受影响的文件名或目录名(不包含所在目录的路径)。
【FullName】受影响的文件或目录的完整路径。
【OldName】重命名文件时,旧的文件名。
【OldFullPath】重命名文件时的旧的完整路径。
## 剪贴板
### 剪贴板内容变化
监控某些符合条件的剪贴板内容变化并触发事件。

**触发条件参数**
【生效进程】仅监控特定进程下的剪贴板内容变更。
【内容类型】剪贴板内容变后,包含指定的内容类型后才触发事件。
【文本匹配表达式】如果监控的内容为文本类型,则其内容匹配这里指定的表达式时才触发事件。
【包含自定义类型】“内容类型”为“自定义”时,在这里指定剪贴板需要包含的类型名。(可通过第三方剪贴板查看工具查看,如“FreeClipboardViewer”)
【忽略Quicker获取选中文本/文件引起的剪贴板变化】忽略Quicker动作中使用获取选中文本等操作后0.5秒内的剪贴板变更事件。
【忽略Quicker粘贴文本/文件引起的剪贴板变化】忽略Quicker动作中发送文本等操作后0.5秒内的剪贴板变更事件。
**输出参数**
【cliptext】剪贴板文本内容。
## 其它系统事件
本部分内容主要是针对.Net中 [Microsoft.Win32.SystemEvents类](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents?view=netframework-4.7.2) 中的事件进行封装。
### 屏幕/显示设置改变了
连接或断开显示器、更改分辨率等设置时触发。对应于[SystemEvents.DisplaySettingsChanged](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents.displaysettingschanged?view=netframework-4.7.2)事件。
本事件无触发条件参数和输出参数。
### 电源状态改变了
当电脑休眠/睡眠或唤醒的时候触发事件。对应于[SystemEvents.PowerModeChanged](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents.powermodechanged?view=netframework-4.7.2)事件。
触发条件参数:无
**输出参数**

【模式】
- `Resume`系统唤醒。
- `Suspend`系统即将睡眠/休眠。
- `StatusChange`系统电源事件通知。可能是电池电力不足/开始充电,插入或断开了电源线,或其它电源事件。
【PowerLineStatus】电源线连接状态。本参数和下面的几个是通过[SystemInformation.PowerStatus](https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.powerstatus.batterychargestatus?view=windowsdesktop-7.0)获得的。
- 0:未连接
- 1:已连接
- 255:未知状态
【BatteryChargeStatus】充电状态。请参考[这里](https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.batterychargestatus?view=windowsdesktop-7.0)
【BatteryLifePercent】电池剩余电量比例。
【BatteryLifeRemaining】电池预计剩余时间(秒数)。
【BatteryFullLifetime】电池满电预计寿命(秒数)。
### 用户正在尝试注销或关闭系统
对应于[SystemEvents.SessionEnding](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents.sessionending?view=netframework-4.7.2&f1url=%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(Microsoft.Win32.SystemEvents.SessionEnding)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.7.2)%3Bk(DevLang-csharp)%26rd%3Dtrue)事件。该事件不一定有机会触发。

### 会话切换事件
对应于[SystemEvents.SessionSwitch](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents.sessionswitch?view=netframework-4.7.2&f1url=%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(Microsoft.Win32.SystemEvents.SessionSwitch)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.7.2)%3Bk(DevLang-csharp)%26rd%3Dtrue)事件。当登录的用户改变时触发。

**输出参数**
【Reason】会话变更的类型。[参考文档](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.sessionswitchreason?view=netframework-4.7.2)
| ConsoleConnect | 1 | 会话已与控制台建立连接。 |
| --- | --- | --- |
| ConsoleDisconnect | 2 | 会话已与控制台断开连接。 |
| RemoteConnect | 3 | 会话已与远程连接建立连接。 |
| RemoteDisconnect | 4 | 会话已与远程连接断开连接。 |
| SessionLock | 7 | 会话已被锁定。 |
| SessionLogoff | 6 | 用户已从会话注销。 |
| SessionLogon | 5 | 用户已登录到会话。 |
| SessionRemoteControl | 9 | 会话已将其状态更改为远程控制状态或从远程控制状态更改为当前的状态。 |
| SessionUnlock | 8 | 会话已被解除锁定。 |
### 计算机锁定
是“会话切换事件”中Reason为`SessionLock`的一种情况。 因为可能会经常使用,所以单独提出了一种事件类型。
### 计算机解锁
是“会话切换事件”中Reason为`SessionUnlock`的一种情况。 因为可能会经常使用,所以单独提出了一种事件类型。
### 用户偏好设置改变
用户修改了某种系统设置。对应于 [SystemEvents.UserPreferenceChanged](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents.userpreferencechanged?view=netframework-4.7.2) 事件。
**输出参数**
【Category】设置变更的类型。参考[官方文档](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.userpreferencecategory?view=netframework-4.7.2)。
| Accessibility | 1 | 指示与供残障人士使用的系统辅助功能关联的用户首选项。 |
| --- | --- | --- |
| Color | 2 | 指示与系统颜色关联的用户首选项。 此类别包括像窗口或菜单的默认颜色这样的选项。 |
| Desktop | 3 | 指示与系统桌面关联的用户首选项。 此类别包括桌面的背景图像或背景图像布局。 |
| General | 4 | 指示不与任何其他类别关联的用户首选项。 |
| Icon | 5 | 指示图标设置的用户首选项,包括图标高度和图标间距。 |
| Keyboard | 6 | 指示键盘设置的用户首选项,例如,按下键的重复速率和延迟时间。 |
| Locale | 13 | 指示对于区域设置(如字符编码和区域性字符串)的用户首选项更改。 |
| Menu | 7 | 指示菜单设置的用户首选项,例如,菜单延迟和文本对齐方式。 |
| Mouse | 8 | 指示鼠标设置的用户首选项,例如,双击时间和鼠标灵敏度。 |
| Policy | 9 | 指示策略设置的用户首选项,例如,用户权限和访问级别。 |
| Power | 10 | 指示系统电源设置的用户首选项。 此类别包括电源功能设置,例如,系统自动进入低能模式之前的空闲时间。 |
| Screensaver | 11 | 指示与屏幕保护程序关联的用户首选项。 |
| VisualStyle | 14 | 指示与视觉样式关联的用户首选项,例如,启用或禁用视觉样式,以及从一种视觉样式切换到另一种视觉样式。 |
| Window | 12 | 指示与系统窗口的尺寸和特性关联的用户首选项。 |
## 时间相关
### 定时重复
每个一定的时间触发一次动作。

**触发条件参数**
【重复间隔】重复触发事件的秒数。
【最大重复次数】最多重复几次后停止触发。0表示不限制。
**输出参数**
无。
### 设备闲置超过一定时间
在键盘/鼠标一定时间内没有输入时触发动作。

**触发条件参数**
【输入方式】
- 键盘或鼠标:键盘和鼠标同时闲置超过一定时间。
- 键盘:键盘闲置超过一定时间。
- 鼠标:鼠标闲置超过一定时间。
【空闲时长】指定最少闲置时间(单位:秒)
【重复间隔】在闲置超过设定的时间后,间隔一定的时间,如果设备仍然闲置中,则再次触发事件。设置为0时,不重复触发。
【最大重复次数】最多重复几次后停止触发。0表示不限制。
**输出参数**

【Repeat】第几次重复。
【Seconds】闲置时间(秒数)。
### 设备连续使用超过一段时间
(通过键盘和鼠标使用情况判断)在使用电脑一段时间后触发。

**触发条件参数**
【连续使用时长】单位秒。超过此时间后仍在使用键盘或鼠标,则触发事件。(如:设置连续工作半小时,即1800秒后提示休息)
【重复间隔】在闲置超过设定的时间后,间隔一定的时间,如果设备仍然在使用,则再次触发事件。设置为0时,不重复触发。(如:如果没有休息,则每间隔120秒再提醒一次)
【闲置重置时间】如果键盘和鼠标一段时间没有使用,则重新开始计算使用时长。(如:中间休息够了30秒,则重新开始计算30分钟后提示休息)
**输出参数**

【Repeat】第几次重复。
【Seconds】连续使用时长(秒数)。
# 更新历史
- 20230218 增加事件过滤表达式的说明。
- 20230222 进程启动/退出:增加参数ProcCount。 (v1.37.3)
- 20230313 增加蓝牙设备可能不能获取名称的说明。