基本上,我在C#中编写了一个程序,它使用user32.dll从任何窗口句柄中获取文本和当前插入位置。在操作文本后,程序将控件的文本设置为新字符串,并重置插入位置。
我遇到的问题是{{1}}根据插入位置的CR + LF的数量返回RichEdit控件的插入位置。
编辑控件将它们视为两个字符,而RichEdit控件将它们视为一个"字符"。
无论如何,我可以通过Windows消息检测这两个控件中的哪一个?
或者有没有更好的方法可以检测非托管控件的插入位置?
答案 0 :(得分:2)
你的观察是不精确的。
Rich Edit不会将CRLF计为1个字符,但它不会将CRLF(\ r \ n)用于换行符,而只使用LF(\ n)。当您检查Rich Edit的文本内容时,您将看到。换行符仅返回\ n,而不是\ r \ n。
您可以在.net Winforms RichEdit控件中看到相同的行为:
a
这将显示“Before:12 After:11”。当文本被分配给富编辑时,文本中的换行符\ r \ n将转换为\ n。
答案 1 :(得分:1)
大家好,谢谢你的帮助!这个解释稍微偏离了袖口,所以请耐心等待。
我今天取得了突破,我能够确定一种简单的方法来区分Edit或RichEdit控件。
由于我们知道WM_GETTEXT
会返回原始字符串,并且EM_GETSEL
对于每个换行都会被1关闭,我们所要做的就是检查以下内容:
EM_LINEINDEX
(我在这里使用循环来增加
wParam
并且我将在一秒钟内解释为什么要获得子字符串
从字符0到EM_LINEINDEX
同样,这是有效的,因为即使EM_LINEINDEX
在RichEdit中针对WM_GETTEXT
关闭了1个字符,因此在第一个换行符之后的字符0到EM_LINEINDEX
之后的子字符串将不包含\ n如果您的控件是RichEdit。