在日常办公中我们经常会使用到外接显示屏来辅佐我们 提高办公效率

然而多显示屏每次切换屏幕都要用鼠标来移动切换, 对鼠标的依赖非常重且非常麻烦😡

尤其是我左边显示屏是 IDE 或者 shell 终端, 右边是浏览器

于是乎在知乎上看到一篇这样的文章👇

MoveMouseToMonitor

请问win10接双显示器(扩展模式)怎么把鼠标游标切换到第二台显示器上?

看完这篇文章瞬间就觉得它能够完美解决我的问题, 于是乎我安装了答主分享的 MoveMouseToMonitor.exe 工具

然而使用过后似乎仍不能满足我的需求, 因为它仅仅实现了鼠标的光标由 A显示屏 👉 B显示屏 的移动

而实际的聚焦效果仍然保留在原来的 A显示屏

通俗易懂来讲就是 鼠标的聚焦键盘的聚焦 是两码事

这样就导致我的鼠标光标从 shell 终端 或者 IDE 切换到浏览器后

输入键盘时, 实际的输出仍然会停留在 shell 终端 或者 IDE 的上

MoveMouseToMonitor V2.0

这。。。实现了但没完全实现我想要的效果😂

于是我就花了亿点点时间研究了下 AutoHotKey 的语法和这个MoveMouseToMonitor.exe 程序的源代码

然后再此基础上做了一点点改动, 具体改动为当执行完 PerformMove 函数成功移动鼠标后

创建一个 ActivateWindowByMousePosition 函数, 获取当前鼠标位置的窗口 title

WinActivate 会根据鼠标窗口的 title 来激活目标窗口, 把键盘的聚焦也切换到该窗口, 从而真正实现切换并激活窗口👍

PerformMove(MoveMonNum, OffX, OffY)
{
    global MoveX, MoveY
    Gosub, CheckNumMonsChanged
    RestoreDPI := DllCall("SetThreadDpiAwarenessContext", "ptr", -3, "ptr")
    SysGet, Coordinates%MoveMonNum%, Monitor, %MoveMonNum%
    Left := Coordinates%MoveMonNum%Left
    Right := Coordinates%MoveMonNum%Right
    Top := Coordinates%MoveMonNum%Top
    Bottom := Coordinates%MoveMonNum%Bottom
    If (OffX = -1)
        MoveX := Left + (Floor(0.5 * (Right - Left)))
    Else
        MoveX := Left + OffX
    If (OffY = -1)
        MoveY := Top + (Floor(0.5 * (Bottom - Top)))
    Else
        MoveY := Top + OffY
    DllCall("SetCursorPos", "int", MoveX, "int", MoveY)
    Sleep, 10
    DllCall("SetCursorPos", "int", MoveX, "int", MoveY)
    DllCall("SetThreadDpiAwarenessContext", "ptr", RestoreDPI, "ptr")

    Gosub, ActivateWindowByMousePosition

    Return
}

ActivateWindowByMousePosition:
    MouseGetPos, , , id, control
    WinGetTitle, title, ahk_id %id%
    WinActivate, %title%
    Return

Github传送门👇

https://github.com/chuchu-z/MoveMouseToMonitorV6