在C#中捕获键盘笔划

时间:2009-05-10 18:17:25

标签: c# keyboard capture keydown

HI,

我有以下问题 - 以下文字位于富文本框中。

今天世界[[精彩]]。

如果用户在之前和之后提供两个括号,如精彩的情况,括号中的单词,在这种情况下,精彩将变为链接,(绿色)。

我在获取击键序列方面遇到了问题,即。我如何知道用户已输入[[,所以我可以开始解析其后的文本的其余部分。

我可以通过手动KeyDown,事件和列表来获取它,但它看起来并不优雅。

请让我知道应该采用什么方法。

谢谢, Sujay

5 个答案:

答案 0 :(得分:5)

你有两种方法我可以想到。

正如您所建议的那样,一个是用列表维护当前状态 - 这个键是一个括号吗?最后一个关键是支架? - 并在运行中更新。

另一种方法是简单地处理TextChanged事件并重新扫描[[text-here]]模式的文本并根据需要进行更新。

第一个需要更多的簿记,但对于更长的文本会更快。第二种方法更容易,可以用一个像样的正则表达式完成,但随着文本变长,它会变慢。如果你知道你有一些上限,比如256个字符,那你就可以了。但如果你期待小说,可能不是一个好主意。

答案 1 :(得分:2)

我会推荐谷歌:“richtextbox语法荧光笔”,有很多人已经做到了这一点,并且幕后有很多工作要做。

我敢说,每一个简单的解决方案都有很大的缺点。正确的方法是使用一些已经执行此“语法突出显示”的控件并将其扩展到您的语法。它也很可能是最简单的方法。

您可以在Codeplex中搜索免费的.net控件。 link

答案 2 :(得分:1)

我会尝试处理KeyDown,并检查结束括号而不是“]”。一旦你收到一个,你可以检查文本框中的第二个字符,如果它在那里,只需替换掉最后几个字符。

这消除了维护状态的需要(即:列表)。一旦键入第二个],块就会立即变为链接。

答案 3 :(得分:0)

我认为保持清单会相当复杂。如果用户键入“[”字符,单击文本中的其他位置然后再次键入'['字符,该怎么办?然后,用户键入两个连续的'['字符,但在文本的完全不同的部分。此外,您可能希望能够处理从剪贴板插入的文本。

我认为最安全的方法是分析全文并使用RegEx或其他技术从该上下文中完成应该做的事情。

答案 4 :(得分:0)

(抱歉,还没有足够的声誉来添加评论,所以必须添加新答案)。正如jeffamaphone所建议的那样,我每次都会处理TextChanged事件并重新扫描文本 - 但为了保持成本不变,只需在当前光标位置之前扫描几个字符,而不是读取整个文本。

尝试拦截击键并保持内部状态是一种糟糕的方法 - 您可以很容易地了解发生的事情与您正在监控的控件不同步并导致奇怪的问题。 (以及如何处理点击?Alt-tab?粘贴?箭头键?其他应用程序抓住焦点?太多特殊情况需要担心......)