如何检测 RichTextBox 中的多行粘贴

2023-12-03

目前我正在开发一个简单的语法荧光笔,但有几个问题。你能帮我一下吗?

我有一个类库,其中有一个组件类。一切都在 VB.NET 中。这只是一个文件,所以你可以在这里看到它https://gist.github.com/2366507。第 92 行有 OnTextChanged Sub。我正在考虑将 ProcessAllLines() (如第 128 行)添加到该 Sub 的末尾,并且它起作用了。但是,当我在 RichTextBox 中输入代码时(我使用的源代码在这里https://gist.github.com/2366526)每次文本更改后,它都会检查并处理所有行。所以我删除了OnTextChanged Sub中的ProcessAllLines()。

我正在考虑当用户将某些内容粘贴到 SyntaksRichTextBox 时运行 ProcessAllLines() 。但我不知道该怎么做。我知道它应该是这样的:

If [CTRL Pressed] And [V Pressed] Then
ProcessAllLines()
End If

我还希望它位于类库中,而不是应用程序中(Syntaks Demo)。你能帮我一下吗?谢谢。

拉法尔·奇米尔,@RafalChmiel


简单检测

您可能想到的第一个解决方案是检测WM_PASTE消息覆盖WndProc但不幸的是,当控件执行粘贴操作时,它不会将该消息发送给自身。

检测键盘事件(您必须覆盖OnKeyDown函数)并检查组合键(CTRL+V 和 SHIFT+INS)是否是粘贴文本的组合键,您可以解决此问题。

Protected Sub OnKeyDown(ByVal e As KeyEventArgs)
    Dim ctrlV As Boolean = e.Modifiers = Keys.Control && e.KeyCode = Keys.V
    Dim shiftIns As Boolean = e.Modifiers = Keys.Shift && e.KeyCode = Keys.Insert

    If ctrlV Or shiftIns Then
        ProcessAllLines
    End If
End Sub

有用well但您无法捕获使用鼠标进行的粘贴操作(右键单击打开上下文菜单)和通过拖放进行的粘贴操作。如果您不需要它们,您可以使用此解决方案(至少它简单明了)。

更好的检测

假设:当用户在RichTextBox他每次插入一个字符。你如何使用这个?好吧,当您检测到较大的更改时,您检测到了粘贴操作,因为用户每次不能键入多个字符(由于 Unicode 代理,这并不总是正确的,但在本例中这不是问题)。

它不适用于每种 IME(例如,我没有尝试使用远东语言)和 Unicode 代理,但对于西方语言来说还可以(无论如何,即使它不起作用,您也只需重新处理所有行) 。另请阅读这个帖子 and 这个帖子有关 Unicode 的更多详细信息和this(双胞胎)C# 版本的答案。

Dim _previousLength As Int32 = 0

Protected Sub richTextBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
   Dim currentLength As Int32 = richTextBox.Text.Length
   If Math.Abs(currentLength - _previousLength) > 1 Then
      ProcessAllLines
   End If

   _previousLength = currentLength
End Sub

完美解决方案

当然存在完美的解决方案(在 Windows 8 或更高版本上),本机丰富的编辑控件发送EN_CLIPFORMAT通知消息。它的目的是通知丰富的编辑控件的父窗口发生了特定剪贴板格式的粘贴。然后您可以覆盖WndProc其父级来检测WM_NOTIFY此通知的消息。无论如何,这不是几行代码,请查看 MSDN 上的此链接以了解详细信息:http://msdn.microsoft.com/en-us/library/windows/desktop/hh768385(v=vs.85).aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测 RichTextBox 中的多行粘贴 的相关文章

  • 为什么即使当我尝试从工作线程更改 UI 时,同步上下文仍为空?为什么即使我不这样做,工作线程也会在 UI 线程上等待?

    我在表单上有一个按钮 点击它我调用FooAsync并在完成时阻止 UI 线程 下面是代码和我的问题 using System using System Diagnostics using System Threading using Sys
  • 使 .net web api 队列请求以“单线程”方式运行

    我们有一个 c net Web API 服务调用代码 该代码无法一次处理多个数据库请求 该系统适用于需求相对较小的账单在线支付 我们无法控制代码来进行可以解决问题的更改 另一个使用相同代码的小组使用 WCF API 和服务配置将并发请求限制
  • 项目:为了评估索引属性,该属性必须经过限定,并且参数必须由用户显式提供。

    我创建了多个组合框 从中我从创建的存储过程中提取了每个组合框的数据 所有这些框一直工作到今天早些时候 其中 2 个组合框停止工作 检查行的 立即窗口 和列 我得到了列的结果 但是当我检查列时 例如 dsContactTitles Table
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow
  • WPF画布性能-children.add调用多次

    我在长画布上绘制了很多线条 想想条形图 并对其性能进行了相当好的调整 使用低级几何类并冻结它们等 这极大地提高了性能 但仍然需要几秒钟将几千个项目加载到画布中 我对应用程序进行了性能分析 看起来每次调用都花费了很大一部分时间canvas c
  • .NET EXE 内存占用

    即使是一个简单的Notepad http en wikipedia org wiki Notepad 28software 29C 中的应用程序消耗兆字节的 RAM 如任务管理器中所示 最小化应用程序时 任务管理器中的内存大小会显着下降 并
  • 将下一个参数作为 String.Format 中的字段宽度

    在 C 中 我有一个想要用于某些字符串的宽度 但直到运行时我才知道该宽度 我正在做这样的事情 string Format 0 digits value prints 123 as 123 是否有一个字符串格式化指令可以让我指定它 而无需像这
  • 序列化和反序列化 HttpRequestMessage 对象

    有人有序列化 HttpRequestMessage 对象的经验吗 尝试使用 Json net 它部分有效 也就是说 JsonConvert DeserializeObject 由于 StringContent 构造问题而失败 无法找到用于类
  • 是否有 .NET 库或 API 可以与 IIS 配置数据库交互/编辑它?

    或者我是否坚持使用自己的 XML 切割 功能 我想创建一个小型任务托盘应用程序 以便我可以快速将虚拟目录重新指向硬盘上的几个文件夹之一 一点背景 我的开发机器上的代码库有 3 个不同的 svn 分支 Current Production B
  • 从架构上来说,我应该如何用更易于管理的内容替换非常大的 switch 语句?

    EDIT 1 忘记添加嵌套属性曲线球 UPDATE 我选择了 mtazva 的答案 因为这是我的具体案例的首选解决方案 回想起来 我用一个非常具体的例子提出了一个一般性问题 我相信这最终让每个人 或者也许只是我 对问题到底是什么感到困惑 我
  • 矩阵乘法 - 视图/投影、世界/投影等

    在 HLSL 中有很多矩阵乘法 虽然我了解如何以及在何处使用它们 但我不确定它们是如何导出的或它们的实际目标是什么 所以我想知道是否有在线资源可以解释这一点 我特别好奇将世界矩阵乘以视图矩阵以及世界 视图矩阵乘以投影矩阵背后的目的是什么 您
  • 尝试使用 VS 2012 打开我的 asp.net 4.5 MVC Web 应用程序时出错。Asp.net 尚未在服务器上注册

    我有一个Windows Server 2012 R2 Visual Studio 专业版 2012 现在我用来开发 ASP NET 4 5 MVC 4 Web 应用程序 没有任何问题 但现在当我尝试打开该项目时 我会收到此错误 如果我单击
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i

随机推荐

  • 用于启动应用程序的Appium-Activity不存在或无法启动!确保它存在并且是可启动的活动

    我正在尝试使用 appium 运行在 eclipse 上创建的测试文件 当我在连接到系统的真实 Android 设备上执行测试时 出现以下错误 运行命令时遇到内部错误 错误 启动应用程序时发生错误 原始错误 用于启动应用程序的 Activi
  • 从文档中检索单个属性

    今天是个好日子 假设我们有一个集合和一个文档 如下所示 test doc ID 123 a x y 2000 z 1000 x var y 3500 z
  • 如何使用 Swift 调试 SceneKit 中的自定义几何体

    我正在尝试学习如何在 SceneKit 中创建自定义几何体 但是 我尝试制作一个三角形 但它没有显示任何内容 我不知道如何调试这个 有没有办法判断三角形是否有效 我只是不知道从哪里开始 作为参考 相关的游乐场代码如下 请注意 它是针对 Sw
  • 代码中的 WCF 跟踪不遵循 MessageLogging 设置

    我需要在我的应用程序中使用 WCF 跟踪 但需要尽可能通过代码进行控制 建议我在 app config 文件中安装以下部分
  • 无法从 Angular ui-view 内部访问 JavaScript

    我有一个带有 Angular ui 视图的主模板 index html 在这个主模板中 我导入了一堆 Javascript 文件 我希望这些文件可用于将在 ui view 中加载的 html 模板内的内容 但 JS 函数似乎无法访问 sam
  • React.Component 和 Component 之间有什么区别?

    我见过两种访问方式Component import React from react class Foo extends React Component and import React Component from react class
  • 在页面加载时动画滚动到 ID

    我正在尝试在页面加载时将滚动动画设置为特定 ID 我做了很多研究并发现了这一点 html body animate scrollTop title1 height 1000 但这似乎是从ID开始并动画到页面顶部 HTML 位于页面的中间 很
  • JDialog 允许用户仅更改对话框的宽度

    有谁知道是否可以限制用户调整 JDialog 大小的方式 我知道我可以调用方法 setResizible boolean 并禁用或允许用户调整 JDialog 的大小 但是有没有办法限制用户更改窗口的高度但允许他更改宽度 如果我创建的对话框
  • 如何正确实现从 iOS 应用程序到 watchOS2 并发症的设置传输

    我想要实现的目标如下 并发症以 30 为间隔在后台更新 分钟 每当手表应用程序运行时 并发症都会更新 并且 接收自己的更新数据 并发症随时更新 iOS 应用程序运行并且用户更改了影响的设置 观察数据 例如天气观测位置的变化 或 显示单位 第
  • Nodejs AWS SDK S3 生成预​​签名 URL

    我正在使用 NodeJS AWS SDK 生成预签名的 S3 URL 该文档给出了生成预签名 URL 的示例 这是我的确切代码 省略了敏感信息 const AWS require aws sdk const s3 new AWS S3 AW
  • 使用变量设置 Dask Worker

    我想在工作人员加载时分发一个更大的对象 或从磁盘加载 并将其放入全局变量 例如calib data 这对 Dask 工作人员有用吗 好像是客户端方法注册工人回调在这种情况下可以做你想做的事 你仍然需要某处放置你的变量 因为在 python
  • 如何在Python中删除文件或文件夹?

    如何在Python中删除文件或文件夹 使用以下方法之一 pathlib Path unlink 删除文件或符号链接 pathlib Path rmdir 删除一个空目录 shutil rmtree 删除目录及其所有内容 在 Python 3
  • 在 Google Tasks API 中使用 Joda-Time 库将字符串转换为日期时间格式

    我有一个日期 时间字符串需要发送到 Google Tasks API 但我不知道如何转换乔达时间图书馆DateTime对象转换为 Java DateTime 对象 我使用 Android 作为平台 该字符串以 2012 07 19 22 0
  • 数组:每个键存储多个值

    我曾经尝试使用相同的键添加两个值 但它不起作用 它超越了旧的价值 是否可以使用相同的键添加多个值 并且在按键检索时 我会得到一个链接列表 我可以迭代该列表以获取所有不同的值 最简单的选择 无论您使用什么地方 array key 替换为 ar
  • Python:获取 URL 路径部分

    如何从 url 获取特定路径部分 例如 我想要一个对此进行操作的函数 http www mydomain com hithere image 2934 并返回 这里 或对此进行操作 http www mydomain com hithere
  • Azure 移动服务 Web Api 上的 SignalR CORS

    我有一个运行 Web Api 和 c 的 Azure 移动服务 并按照中的建议启用了 CORS在 Azure 移动服务 NET 后端启用 CORS然而我现在开始将 SignalR 添加到其中 SignalR 工作正常 但我无法找到如何启用
  • 触发器中的 pragmaautonomous_transaction

    我在一个表上编写了一个触发器 该触发器根据条件从其他表中删除数据 触发器具有 pragmaautonomous transaction 并且触发器按预期工作 但是 我确实想知道将来是否会出现任何问题 比如说数据是否由多个用户 源同时插入等等
  • 防止 D3 中的文本剪切(Javascript 图表)

    我正在 D3 中绘制饼图 但文 本剪辑本身遇到问题 这是我的绘图函数 pie function config var width config width 840 height config height 520 radius Math m
  • jQuery mobile:URL 查询字符串不改变

    我正在使用 jQuery Mobile 并遇到了一些 对我来说 奇怪的行为 我有一堆链接 每个链接都指向同一个 jQM 页面 otherpage 但 URL 查询字符串具有不同的值 例如 otherpage q foo otherpage
  • 如何检测 RichTextBox 中的多行粘贴

    目前我正在开发一个简单的语法荧光笔 但有几个问题 你能帮我一下吗 我有一个类库 其中有一个组件类 一切都在 VB NET 中 这只是一个文件 所以你可以在这里看到它https gist github com 2366507 第 92 行有