请问不用sendinput怎么获取选中的文字?

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

Moderators: tmplinshi, arcticir

wo52616111
Posts: 47
Joined: 21 Aug 2014, 04:46

请问不用sendinput怎么获取选中的文字?

06 Oct 2015, 12:38

很多IDE都会Ctrl+C复制整行,所以sendinput, ^{c}没办法在这些窗口检测文字选中。请问有什么办法可以不用sendinput就可以获取到选中的文字。
目前查到的方法是:

Code: Select all

#z::
ControlGet, ctget, Hwnd , , , A
SendMessage, 0x301, , , ,ahk_id %ctget%
MsgBox, % Clipboard
return
这样在个别窗口可以复制到选中的文字,但是只限于"notepad"等个别窗口,这些窗口都有个特征:

Code: Select all

ControlGetFocus, control, A
if(control!="")
{
  ;SendMessage有效,复制到了选中的文字
}
else
{
  ;复制不了
}

目前想的就是用SendMessage或者Dllcall,但是SendMessage试了好多种获取窗口的方法(ControlGetFocus,ControlGet,WinGet,WinExist,WinGetClass)都没能让它正确发送WM_COPY到所有窗口。Dllcall就不太清楚有什么函数可以用,正打算查。
谢谢。
wo52616111
Posts: 47
Joined: 21 Aug 2014, 04:46

Re: 请问不用sendinput怎么获取选中的文字?

23 Jan 2016, 11:41

up,这个问题搁置了好久都没解决,顶上来看有没朋友知道方法。
再说下问题,一般ahk获取选中文字,都是利用send, ^{c},也就是发送一个复制的快捷键来复制,然后去检查Clipboard。
但是有使用编程工具的朋友都知道,很多编程工具下,不选中任何文字,按下ctrl+c,会复制光标所在的整行文字。所以要用ahk检测文字,在这些编辑器里使用send, ^{c},就算没有选中文字,也会复制到一些文字进去clipboard,所以就无法做到100%正确地检测到用户到底有没高亮一些文字。
想请问有什么方法可以做到在所有编辑窗口都能正确检测用户有没高亮文字,高亮的是什么文字?
aamii
Posts: 47
Joined: 23 May 2014, 03:50

Re: 请问不用sendinput怎么获取选中的文字?

26 Jan 2016, 00:02

帮顶
--------------------------------------------------------
我觉得没有这样一个比^c更通适的方法,
你说的情况,我了解,但是编程工具接触不多,但是一般而言应该可以定制,比如EmEditor默认“^c是复制选中或者整行”,但是本身提供了改键的方法。
wo52616111
Posts: 47
Joined: 21 Aug 2014, 04:46

Re: 请问不用sendinput怎么获取选中的文字?

26 Jan 2016, 01:09

aamii wrote:帮顶
--------------------------------------------------------
我觉得没有这样一个比^c更通适的方法,
你说的情况,我了解,但是编程工具接触不多,但是一般而言应该可以定制,比如EmEditor默认“^c是复制选中或者整行”,但是本身提供了改键的方法。
谢谢,确实,我找了几个月,dllcall,postmessage,controlget,winget等等这些ahk方法翻来覆去,也还没找到比^c更通用的,
你说的改键方面的话,一些编程工具可能是可以,但总有的是不行的,哪怕行,也不可能要使用者把所有工具都改一遍来去适应。
xuezhe
Posts: 91
Joined: 06 Jan 2016, 11:02

Re: 请问不用sendinput怎么获取选中的文字?

10 Feb 2016, 09:56

ControlGet,string,Selected,,Edit1,ahk_class Notepad ;记事本编辑框里选择的文本赋予string

你要举个窗口的例子,这样我们好处理。也可以运行。
artikyo

Re: 请问不用sendinput怎么获取选中的文字?

29 Aug 2021, 02:02

解决方案:If (RegExMatch( Clipboard,"`r`n$")==1)
正则表达式判断复制的内容结尾是否是换行,在题主所说的那部分IDE中,如果我们未选中文本而触发Ctrl+C则会复制当前行的内容,则其结尾是换行,遇到这种情况忽略掉就可以了
User avatar
miozus
Posts: 15
Joined: 08 Sep 2021, 21:53

Re: 请问不用sendinput怎么获取选中的文字?

08 Sep 2021, 22:47

现在是2021年9月,回头看七年前的问题,(上面网络掘墓人)。 :wtf:

首先,IDE(vscode、idea) 中:

- 如果选中文字,按 ^c 可以直接复制当前选中的内容;
* 题主的问题不存在了,所以不理解这个问题的痛点;
* 如果还存在,考虑修改 IDE 软件自带的快捷键

- 如果未选中文字,才复制当前行。

其次,提供另一种思路,按键选择文字,再按 ^c 复制:

Code: Select all

copySelectWord() {
    send, ^{left} 
    send, ^+{right} 
    send, ^c
}

最后,推荐 IDE 的 vim 插件,多条路,更好走。

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

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

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 /前进键 ,触发复制,但这和不添加冗余按键的区别不大,不如砍掉

Return to “请求帮助”

Who is online

Users browsing this forum: Bing [Bot] and 23 guests