有没有办法测试控件是Edit还是RichEdit?

时间:2016-03-11 17:09:14

标签: c# newline edit unmanaged richedit

基本上,我在C#中编写了一个程序,它使用user32.dll从任何窗口句柄中获取文本和当前插入位置。在操作文本后,程序将控件的文本设置为新字符串,并重置插入位置。

我遇到的问题是{{1}}根据插入位置的CR + LF的数量返回RichEdit控件的插入位置。

编辑控件将它们视为两个字符,而RichEdit控件将它们视为一个"字符"。

无论如何,我可以通过Windows消息检测这两个控件中的哪一个?

或者有没有更好的方法可以检测非托管控件的插入位置?

2 个答案:

答案 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关闭,我们所要做的就是检查以下内容:

  1. 我们是否离开第一行(第0行)?
  2. 如果我们大于零线,请使用EM_LINEINDEX(我在这里使用循环来增加 wParam并且我将在一秒钟内解释为什么要获得子字符串 从字符0到EM_LINEINDEX
  3. 检查是否有子串 包含\ r \ n(如果没有,那么你在某个地方有一个wordwrap。这是 为什么我在步骤2)中使用循环
  4. 一旦找到子串\ r,就这样做 substring还包含\ n?
  5. 同样,这是有效的,因为即使EM_LINEINDEX在RichEdit中针对WM_GETTEXT关闭了1个字符,因此在第一个换行符之后的字符0到EM_LINEINDEX之后的子字符串将不包含\ n如果您的控件是RichEdit。