C# 在空闲状态下,无法访问RichTextControl,否则IME将无法工作

C# 在空闲状态下,无法访问RichTextControl,否则IME将无法工作,c#,.net,winforms,rtf,ime,C#,.net,Winforms,Rtf,Ime,当读取RichTextControl应用程序中的一些属性时,空闲的一些IME将无法工作 给出以下简单代码: _richTextControl = new RichTextControl(); Application.Idle += delegate(object sender, EventArgs e) { btnCopy.Enabled = _richTextControl.SelectionLength > 0; btnPaste.Enabled = _richText

当读取
RichTextControl
应用程序中的一些属性时,空闲的
一些IME将无法工作

给出以下简单代码:

_richTextControl = new RichTextControl();
Application.Idle += delegate(object sender, EventArgs e) {
    btnCopy.Enabled = _richTextControl.SelectionLength > 0;
    btnPaste.Enabled = _richTextControl.CanPaste();
};
我尝试过的大多数IME都可以正常工作,但至少对于中文(繁体,台湾)和Microsoft Chinese Traditional Array(6.0)以及Chinese Traditional DaYi(6.0),它会阻止IME正常工作(我只在Windows 7中尝试过英文和台语)。您可以开始键入,但当执行
Idle
代码时(读取
SelectionLength
属性并调用
CanPaste()
方法,我在这里写了这两个方法,但每一个都足以重现),它将停止工作(您键入,但弹出窗口立即关闭,并且没有任何内容发送到
RichTextControl

我查看了MSDN about
EM_GETSELTEXT
EM_CANPASTE
,但它没有说明这个问题。我还尝试用
SendMessage()
替换手动发送
EM_GETSELTEXT
SelectionLength
属性,但它并没有改变这种奇怪的行为(不过我检查了写字板,它使用富编辑器,即使(AFAIK)MFC命令使用空闲时间更新UI状态,它也能正常工作)


当然,我可以将一些代码移动到
SelectionChanged
事件中,并从
Idle
SelectionChanged
更新UI(这会起作用),或者我可以更新
SelectionChanged
中的一些标志,并在
Idle
中更改UI,但这将破坏现有代码,并将迫使UI库发生重大变化(所有命令都不知道
Idle
SelectionChanged
,当目标控件允许执行时,它们只是在
CanExecute()
方法中返回true)。如果没有其他可行的方法,那么我可以从
RichTextControl
派生一个类,使这些方法/属性可以在
Idle
中调用(使用其他地方更新的标志),但是(为了避免大的重构)我会知道这是一个已知问题,一个与IME本身有关的错误,还是我遗漏了其他东西。

你在这篇文章中引用了这个被引用的问题。不管怎样,你是否尝试过使用接口来访问此信息?我没有测试它的设置,所以我不知道它是否有效。如果你仍然是loo,可能值得一试king寻求解决方案。另一个想法可能与RTB使用旧的RichEdit20W类与RichEdit50W类有关。@Tn我不再做这方面的工作,但我应该尝试一下,我从来没有找到一个好的解决方案。谢谢!