C# 用C语言捕获键盘笔划#

C# 用C语言捕获键盘笔划#,c#,keyboard,capture,keydown,C#,Keyboard,Capture,Keydown,嗨 我有以下问题-以下文本位于富文本框中 今天的世界非常美好 如果用户在单词前后提供了两个括号(如wonderful),括号中的单词(在本例中为wonderful)将变为链接(绿色) 我在获取击键顺序时遇到了问题,即,我如何知道用户已输入[],以便我可以开始解析它后面的其余文本 我可以通过手动键、事件和列表来获得它,但它看起来一点也不优雅 请让我知道什么是正确的方法 谢谢, 苏杰我可以马上想到两种方法 一个是,正如你所建议的,用一个列表来保持当前状态。这个键是一个括号吗?最后一个键是一个括号吗

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

今天的世界非常美好

如果用户在单词前后提供了两个括号(如wonderful),括号中的单词(在本例中为wonderful)将变为链接(绿色)

我在获取击键顺序时遇到了问题,即,我如何知道用户已输入[],以便我可以开始解析它后面的其余文本

我可以通过手动键、事件和列表来获得它,但它看起来一点也不优雅

请让我知道什么是正确的方法

谢谢,
苏杰

我可以马上想到两种方法

一个是,正如你所建议的,用一个列表来保持当前状态。这个键是一个括号吗?最后一个键是一个括号吗

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


第一种方法需要更多的簿记,但对于较长的文本来说速度会快得多。第二种方法更简单,可能可以用一个合适的正则表达式来完成,但随着文本的变长,速度会变慢。如果你知道你有一些上限,比如256个字符,那么你可能就可以了。但是如果你想要小说,可能就不会这样了eat idea。

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


我认为最安全的方法是分析全文,并使用RegEx或其他技术从该上下文中执行应该执行的操作。

我会尝试处理KeyDown,并检查右括号“]”。一旦收到一个,您可以在文本框中检查第二个字符],如果有,只需替换掉最后几个字符


这消除了维护状态(即列表)的必要性。一旦第二个]被键入,块将立即变为链接。

我建议Google'ing:“richtextbox syntax highlighter”,有这么多人已经这样做了,幕后有很多人可以让它工作

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

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

(很抱歉,由于声誉不足,无法添加评论,因此必须添加新的答案).正如jeffamaphone所建议的,我会处理TextChanged事件并每次重新扫描文本-但为了保持成本不变,只需在当前光标位置前扫描几个字符,而不是读取整个文本


试图截获击键并保持内部状态是一种不好的方法-很容易让您了解发生了什么,从而与您正在监视的控件不同步,并导致奇怪的问题。(你如何处理点击?Alt tab?粘贴?箭头键?其他应用程序N抓取焦点?太多特殊情况需要担心…)

如果链接不能是多行的(通常情况下)如果你保存一个以行存储的字符串副本,你不需要扫描整个字符串。然后每行都可以单独解析,它不会按字符串的总大小进行缩放。我已经完成了KeyDown事件并捕获了括号,但我认为这不是一个好的编程。没有任何设计模式可以解决这个问题是问题。例如,我在想这句话,[[wonderful]]文本是一个对象。当我遇到大括号时,我将其委托给一个函数,比如SetFormatStyle(text),该函数执行所需的操作。