双屏,设置只对主屏生效。我副屏也能用,但是改的悬停时间不起效果,而且无法选择切换。
这个应该没法搞了,我就一个屏幕,多屏无法编写和测试。
你好,我这边之前用AI修复了双屏的BUG,基于13版本的,非前两天更新的14版本的。你可以看下是否给他合并进你的动作里。https://getquicker.net/Sharedaction?code=0181eb7f-38a4-4b0f-f320-08ded00c13e1
晚点看看,可以说下改了哪里吗
太棒了!有了源码,我就能完全看懂原作者的精妙逻辑了。原作者写得非常聪明:他利用 `默认变换` 这个子程序,**把屏幕的四个角落全部“映射”成了左上角(也就是绝对的 `0,0`)**,这样主程序里就不用写复杂的坐标判断了。但他的失误在于:**他假设所有屏幕的宽度和高度都是固定从全局获取的,且假设屏幕的左上角起点永远是 `0,0`**,这在双屏(副屏起点可能是 1920 或 -1920)时就会彻底失效。因为主程序的判断已经被子程序完美“隔离”了,所以**主程序你一行都不用改!** 只需要按照以下步骤,修改这三个子程序即可修复双屏问题:---### 第 1 步:修改【角落判定】子程序这个子程序用于判断鼠标是不是在四个角。我们需要把写死的 `0` 换成当前屏幕的真实边界。请在编辑器打开 **角落判定** 子程序,找到里面 4 个 `如果 (If)` 条件步骤,将它们的表达式替换为以下代码:1. **左上角的判断:** * 原代码:`$= {mouseX} == 0 && {mouseY} == 0` * **替换为:** ```csharp $= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top ```2. **右上角的判断:** * 原代码:`$= {mouseX} == {屏幕宽度}-1 && {mouseY} == 0` * **替换为:** ```csharp $= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Right - 1 && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top ```3. **左下角的判断:** * 原代码:`$= {mouseX} == 0 && {mouseY} == {屏幕高度}-1` * **替换为:** ```csharp $= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Bottom - 1 ```4. **右下角的判断:** * 原代码:`$= {mouseX} == {屏幕宽度}-1 && {mouseY} == {屏幕高度}-1` * **替换为:** ```csharp $= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Right - 1 && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Bottom - 1 ```---### 第 2 步:修改【默认变换】子程序(核心!)这个子程序负责把真实坐标变成相对坐标。我们需要让它动态获取当前屏幕的尺寸,并且减去屏幕的坐标偏移量。请打开 **默认变换** 子程序:1. 找到第 2 个步骤(`赋值`给 `屏幕宽度`): * 原内容:`$= _context.GetRootContext().GetVarValue("屏幕宽度")` * **替换为:** ```csharp $= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Width ```2. 找到第 3 个步骤(`赋值`给 `屏幕高度`): * 原内容:`$= _context.GetRootContext().GetVarValue("屏幕高度")` * **替换为:** ```csharp $= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Height ```3. **【极其关键】**在修改完上面两个高度/宽度的步骤后,在紧接着的下方(也就是在算 `-1` 的步骤之前),**新建两个【赋值】步骤**,用于抹平双屏的坐标差值: * **新建第 1 个赋值:** * 输出到变量选择:`实际X` * 计算表达式内容填: ```csharp $= {实际X} - System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left ``` * **新建第 2 个赋值:** * 输出到变量选择:`实际Y` * 计算表达式内容填: ```csharp $= {实际Y} - System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top ```---### 第 3 步:修改【实际变换】子程序这个子程序负责把相对坐标还原成真实屏幕坐标(用于让鼠标吸附回角落)。我们需要把前面减去的差值再加回来。请打开 **实际变换** 子程序:1. 和第 2 步一模一样,先把开头的 `屏幕宽度` 和 `屏幕高度` 获取方式改掉: * `屏幕宽度` **替换为:** ```csharp $= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Width ``` * `屏幕高度` **替换为:** ```csharp $= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Height ```2. **直接拉到该子程序的最底部**(在所有 `如果 (If)` 步骤都结束之后),**新建两个【赋值】步骤**,把偏移量加回来: * **新建第 1 个赋值:** * 输出到变量选择:`实际X` * 计算表达式内容填: ```csharp $= {实际X} + System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left ``` * **新建第 2 个赋值:** * 输出到变量选择:`实际Y` * 计算表达式内容填: ```csharp $= {实际Y} + System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top ```---### 总结全部改完后保存动作即可。**修复原理:** 无论你的副屏在左边(X为负数)还是右边(X为一千多),这几行 C# 代码会实时探测你当前鼠标落在哪个物理屏幕上,然后自动把它的坐标轴归零(变成 0,0 算起)。这样原作者精妙的判断逻辑就能在你的任何一块屏幕上完美运行了!
换上去了,试试看行不行
可以了
这个应该没法搞了,我就一个屏幕,多屏无法编写和测试。
你好,我这边之前用AI修复了双屏的BUG,基于13版本的,非前两天更新的14版本的。你可以看下是否给他合并进你的动作里。https://getquicker.net/Sharedaction?code=0181eb7f-38a4-4b0f-f320-08ded00c13e1
晚点看看,可以说下改了哪里吗
太棒了!有了源码,我就能完全看懂原作者的精妙逻辑了。
原作者写得非常聪明:他利用 `默认变换` 这个子程序,**把屏幕的四个角落全部“映射”成了左上角(也就是绝对的 `0,0`)**,这样主程序里就不用写复杂的坐标判断了。
但他的失误在于:**他假设所有屏幕的宽度和高度都是固定从全局获取的,且假设屏幕的左上角起点永远是 `0,0`**,这在双屏(副屏起点可能是 1920 或 -1920)时就会彻底失效。
因为主程序的判断已经被子程序完美“隔离”了,所以**主程序你一行都不用改!** 只需要按照以下步骤,修改这三个子程序即可修复双屏问题:
---
### 第 1 步:修改【角落判定】子程序
这个子程序用于判断鼠标是不是在四个角。我们需要把写死的 `0` 换成当前屏幕的真实边界。
请在编辑器打开 **角落判定** 子程序,找到里面 4 个 `如果 (If)` 条件步骤,将它们的表达式替换为以下代码:
1. **左上角的判断:**
* 原代码:`$= {mouseX} == 0 && {mouseY} == 0`
* **替换为:**
```csharp
$= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top
```
2. **右上角的判断:**
* 原代码:`$= {mouseX} == {屏幕宽度}-1 && {mouseY} == 0`
* **替换为:**
```csharp
$= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Right - 1 && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top
```
3. **左下角的判断:**
* 原代码:`$= {mouseX} == 0 && {mouseY} == {屏幕高度}-1`
* **替换为:**
```csharp
$= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Bottom - 1
```
4. **右下角的判断:**
* 原代码:`$= {mouseX} == {屏幕宽度}-1 && {mouseY} == {屏幕高度}-1`
* **替换为:**
```csharp
$= {mouseX} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Right - 1 && {mouseY} == System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Bottom - 1
```
---
### 第 2 步:修改【默认变换】子程序(核心!)
这个子程序负责把真实坐标变成相对坐标。我们需要让它动态获取当前屏幕的尺寸,并且减去屏幕的坐标偏移量。
请打开 **默认变换** 子程序:
1. 找到第 2 个步骤(`赋值`给 `屏幕宽度`):
* 原内容:`$= _context.GetRootContext().GetVarValue("屏幕宽度")`
* **替换为:**
```csharp
$= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Width
```
2. 找到第 3 个步骤(`赋值`给 `屏幕高度`):
* 原内容:`$= _context.GetRootContext().GetVarValue("屏幕高度")`
* **替换为:**
```csharp
$= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Height
```
3. **【极其关键】**在修改完上面两个高度/宽度的步骤后,在紧接着的下方(也就是在算 `-1` 的步骤之前),**新建两个【赋值】步骤**,用于抹平双屏的坐标差值:
* **新建第 1 个赋值:**
* 输出到变量选择:`实际X`
* 计算表达式内容填:
```csharp
$= {实际X} - System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left
```
* **新建第 2 个赋值:**
* 输出到变量选择:`实际Y`
* 计算表达式内容填:
```csharp
$= {实际Y} - System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top
```
---
### 第 3 步:修改【实际变换】子程序
这个子程序负责把相对坐标还原成真实屏幕坐标(用于让鼠标吸附回角落)。我们需要把前面减去的差值再加回来。
请打开 **实际变换** 子程序:
1. 和第 2 步一模一样,先把开头的 `屏幕宽度` 和 `屏幕高度` 获取方式改掉:
* `屏幕宽度` **替换为:**
```csharp
$= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Width
```
* `屏幕高度` **替换为:**
```csharp
$= System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Height
```
2. **直接拉到该子程序的最底部**(在所有 `如果 (If)` 步骤都结束之后),**新建两个【赋值】步骤**,把偏移量加回来:
* **新建第 1 个赋值:**
* 输出到变量选择:`实际X`
* 计算表达式内容填:
```csharp
$= {实际X} + System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Left
```
* **新建第 2 个赋值:**
* 输出到变量选择:`实际Y`
* 计算表达式内容填:
```csharp
$= {实际Y} + System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position).Bounds.Top
```
---
### 总结
全部改完后保存动作即可。
**修复原理:** 无论你的副屏在左边(X为负数)还是右边(X为一千多),这几行 C# 代码会实时探测你当前鼠标落在哪个物理屏幕上,然后自动把它的坐标轴归零(变成 0,0 算起)。这样原作者精妙的判断逻辑就能在你的任何一块屏幕上完美运行了!
换上去了,试试看行不行
可以了