如何在不使用剪贴板的情况下,获取当前选中的文本呢?

遇到了问题?请先进行搜索(中文和英文),然后在此提问

Moderators: tmplinshi, arcticir

jklop000
Posts: 4
Joined: 04 Apr 2021, 03:21
Contact:

如何在不使用剪贴板的情况下,获取当前选中的文本呢?

Post by jklop000 » 04 Apr 2021, 03:27

查看了一下帮助文档里,没有找到如何获取当前选中文本的方法,请问有人知道吗?
User avatar
miozus
Posts: 15
Joined: 08 Sep 2021, 21:53

Re: 如何在不使用剪贴板的情况下,获取当前选中的文本呢?

Post by miozus » 08 Sep 2021, 23:37

格局小了。

或者说,为什么简单的方法你不用呢?你遇到了什么困难?

既然已选中了文本 🤔

按下 ^c 后选中文字就进了粘贴板,在 AHK 能直接调用粘贴板的变量 %Clipboard% 然后可以传递他用。

Code: Select all

getSelectString() {
    send, ^c
    return %clipboard%
}

; 使用方法
CapsLock & 8::
    a := getSelectString()
    MsgBox, %a%
    send, getSelectString()
return

---------------------------------------------------

更新:今天调试一个新功能,发现这个问题的价值:

Code: Select all

; 移动光标选中文字松开(涂色,而非拖拽到其他窗口): 复制
copyCursorSelect(){
    DRAG_MOVE_TRESHOLD := 20 ; pixels
    MouseGetPos, pos_x1, pos_y1
    win1 := WinActive("A")
    KeyWait, LButton, ,t1
    if ErrorLevel
    {
    MouseGetPos, pos_x2, pos_y2
    win2 := WinActive("A")
    WinGetClass _class, A
        if(((abs(pos_x2 - pos_x1) > DRAG_MOVE_TRESHOLD
            or abs(pos_y2 - pos_y1) > DRAG_MOVE_TRESHOLD)) 
            and win1 = win2 and _class != "ConsoleWindowClass")
        {
            SendInput ^c
        }
    }
}
使用左键按键抬起的位移距离,和时间间隔,来判断是否选中文字;

实际测试结果:

1)vscode 和 屏幕截图: 在时间间隔内(1秒),时间一到,无论它选中多少内容,就被 ^c 输入按键阻断了选中操作。
2)idea、notion:按键多线程,不受 ^c 阻断,但复制了整行/整个区域。
3)即使未选中,只是多处单击鼠标,也会触发这个函数,挤掉粘贴板原本的内容,浪费储存空间,视觉污染。




更令人无语的是,AHK 找不到任何方法能检测到 “选中文本(高亮)” 这个行为。



这个新功能,成了负优化。

所以,放弃幻想,砍掉这个功能吧。

---------------------------------------------------

老实用 ^c 来操作;

或者添加附加延迟效果的冗余按键(Keywait),比如按选中,再按 c /前进键 ,触发复制,但这和不添加冗余按键的区别不大,不如砍掉
Last edited by miozus on 11 Sep 2021, 01:08, edited 4 times in total.
henrynyu
Posts: 5
Joined: 07 Jul 2021, 06:13

Re: 如何在不使用剪贴板的情况下,获取当前选中的文本呢?

Post by henrynyu » 09 Sep 2021, 10:12

我格局也小,也想知道如何绕过剪贴板。
没有找到如何获取当前选中文本的方法,请问有人知道吗?
据我所知只有剪贴板一种稳定简单的方法。我之前尝试过 OCR, 但是输出不如剪贴稳定。
doge
Posts: 1
Joined: 30 Nov 2021, 00:06

Re: 如何在不使用剪贴板的情况下,获取当前选中的文本呢?

Post by doge » 05 Dec 2021, 09:45

可以试试这个,用到了剪贴板,但不更改当前剪贴板内容:

Code: Select all

; █ 获取选中文本 █
f2::
{
	ClipSaved := ClipboardAll
	Clipboard := ""
	send ^c
	ClipWait
	Select_Text := Clipboard
	Clipboard := ClipSaved
	ClipSaved := ""
	MsgBox , %Select_Text%
	return
}
Guest

Re: 如何在不使用剪贴板的情况下,获取当前选中的文本呢?

Post by Guest » 15 Oct 2023, 02:34

剪贴板一个不好的地方就是如果没选中一定要等超时之后才能返回结果
WKen
Posts: 181
Joined: 21 Feb 2023, 00:01

Re: 如何在不使用剪贴板的情况下,获取当前选中的文本呢?

Post by WKen » 15 Oct 2023, 08:53

或者使用EditGetSelectedText,可以使用ControlGetFocus或者MouseGetPos等获得聚焦的控件名称

Code: Select all

#Requires AutoHotkey v2.0
F3::
{
    ToolTip EditGetSelectedText("RichEditD2DPT1" , "A")
}
Post Reply

Return to “请求帮助”