将鼠标指针移动到输入区域

将鼠标指针移动到输入区域

Windows 包含用于在键入时隐藏鼠标指针的设置,但不包含用于将指针移动到活动键入区域的设置。我的意思是我可以通过 tab、enter 或 alt+tab 等切换键入区域,但我的指针仍然很远。我应该使用什么(程序、脚本、自动热键脚本)来实现类似的系统范围行为?

答案1

如果您需要的话,AutoHotkey 将允许您指定一个快捷键来将鼠标移动到当前光标位置。

#a::                             ; shortcut key is <Win>+a
    CoordMode, Caret, Screen     ; set Caret to use Screen Coordinates
    CoordMode, Mouse, Screen     ; set Mouse to use Screen Coordinates
    MouseMove, %A_CaretX%, %A_CaretY%   ; move mouse to caret position
return

您还可以指定脚本在某些您知道光标焦点将改变的事件之后运行

~!Tab Up::
    keywait, Alt ; wait for user to let off alt key after activation
    sleep 200    ; give the selected program time to activate
    gosub #a     ; move the mouse
return

答案2

为此,您需要使用 DllCall 来获取真正的插入符号位置。以下方法在我测试过的所有地方都有效(包括 MS Word,它不支持 A_CaretX/Y)。

#s:: ;assign hotkey to win + s
; https://msdn.microsoft.com/en-us/library/windows/desktop/ms632604(v=vs.85).aspx
VarSetCapacity(GuiThreadInfo, 48) ;create "struct"
NumPut(48, GuiThreadInfo,,"UInt") ;update cbSize member

; https://msdn.microsoft.com/en-us/library/windows/desktop/ms633506(v=vs.85).aspx
DllCall("GetGUIThreadInfo", int, 0, ptr, &GuiThreadInfo)

hwnd := NumGet(&GuiThreadInfo+7*4) ;get 7th member of struct
left := NumGet(&GuiThreadInfo+8*4) ;8th member
top  := NumGet(&GuiThreadInfo+9*4) ;9th

ControlGetPos, x, y,,,,ahk_id %hwnd% ;get position of active control, relative to window
MouseMove, left+x, top+y
return

相关内容