关于 EM_GETSEL/EM_SETSEL:
- EM_GETSEL 检索左/右位置
- EM_SETSEL 设置锚点/活动位置
EM_SETSEL 使用锚点/活动位置,使您可以轻松地将插入符号放置在选择的左侧/右侧,所以我不确定为什么在另一个答案中使用了 kludge。
EM_GETSEL 是笨拙的窗口消息,为此需要拼凑。这个 kludge 暂时将选择更改为 0 个字符,以便检索活动位置,但是,当我使用它时,我没有看到任何明显的变化。
检索锚点/活动位置:
- 使用 EM_GETSEL 检索左/右位置
- 使用 EM_SETSEL 将选择临时设置为 0 个字符,将插入符号留在活动位置
- 使用 EM_GETSEL 检索活动位置
- 使用 EM_SETSEL 恢复原始选择
一些用于设置选择的示例 AutoHotkey 代码:
q:: ;Notepad - set active position (caret) at right
PostMessage, 0xB1, 5, 10, Edit1, A ;EM_SETSEL := 0xB1
return
w:: ;Notepad - set active position (caret) at left
PostMessage, 0xB1, 10, 5, Edit1, A ;EM_SETSEL := 0xB1
return
一些用于获取/设置选择的 AutoHotkey 函数示例:
JEE_EditGetRange(hCtl, ByRef vPos1, ByRef vPos2)
{
VarSetCapacity(vPos1, 4), VarSetCapacity(vPos2, 4)
SendMessage, 0xB0, % &vPos1, % &vPos2,, % "ahk_id " hCtl ;EM_GETSEL := 0xB0 ;(left, right)
vPos1 := NumGet(&vPos1, 0, "UInt"), vPos2 := NumGet(&vPos2, 0, "UInt")
}
;==================================================
JEE_EditSetRange(hCtl, vPos1, vPos2, vDoScroll:=0)
{
SendMessage, 0xB1, % vPos1, % vPos2,, % "ahk_id " hCtl ;EM_SETSEL := 0xB1 ;(anchor, active)
if vDoScroll
SendMessage, 0xB7, 0, 0,, % "ahk_id " hCtl ;EM_SCROLLCARET := 0xB7
}
;==================================================
;note: although this involves deselecting and selecting it seems to happen invisibly
JEE_EditGetRangeAnchorActive(hCtl, ByRef vPos1, ByRef vPos2)
{
;get selection
VarSetCapacity(vPos1, 4), VarSetCapacity(vPos2, 4)
SendMessage, 0xB0, % &vPos1, % &vPos2,, % "ahk_id " hCtl ;EM_GETSEL := 0xB0
vPos1 := NumGet(&vPos1, 0, "UInt"), vPos2 := NumGet(&vPos2, 0, "UInt")
if (vPos1 = vPos2)
return
vPos1X := vPos1, vPos2X := vPos2
;set selection to 0 characters and get active position
SendMessage, 0xB1, -1, 0,, % "ahk_id " hCtl ;EM_SETSEL := 0xB1
VarSetCapacity(vPos2, 4)
SendMessage, 0xB0, % &vPos2, 0,, % "ahk_id " hCtl ;EM_GETSEL := 0xB0
vPos2 := NumGet(&vPos2, 0, "UInt")
;restore selection
vPos1 := (vPos2 = vPos2X) ? vPos1X : vPos2X
SendMessage, 0xB1, % vPos1, % vPos2,, % "ahk_id " hCtl ;EM_SETSEL := 0xB1 ;(anchor, active)
}
链接:
我最初在 AutoHotkey 论坛上发布的上述功能:
GUI 命令:完成重新思考 - AutoHotkey 社区
https://autohotkey.com/boards/viewtopic.php?f=5&t=25893&p=138292#p138292