双屏有BUG

BUG反馈 · 112 次浏览
LienSen 创建于 28天19小时前

双屏,设置只对主屏生效。我副屏也能用,但是改的悬停时间不起效果,而且无法选择切换。


星染浅夏 28天17小时前 :

这个应该没法搞了,我就一个屏幕,多屏无法编写和测试。

LienSen 回复 星染浅夏 8天21小时前 :

你好,我这边之前用AI修复了双屏的BUG,基于13版本的,非前两天更新的14版本的。你可以看下是否给他合并进你的动作里。https://getquicker.net/Sharedaction?code=0181eb7f-38a4-4b0f-f320-08ded00c13e1

星染浅夏 回复 LienSen 8天20小时前 :

晚点看看,可以说下改了哪里吗


LienSen 回复 星染浅夏 8天20小时前 :

太棒了!有了源码,我就能完全看懂原作者的精妙逻辑了。

原作者写得非常聪明:他利用 `默认变换` 这个子程序,**把屏幕的四个角落全部“映射”成了左上角(也就是绝对的 `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 算起)。这样原作者精妙的判断逻辑就能在你的任何一块屏幕上完美运行了!

星染浅夏 回复 LienSen 8天20小时前 :

换上去了,试试看行不行

LienSen 回复 星染浅夏 8天20小时前 :

可以了

回复内容
暂无回复
回复主贴