gpt4 book ai didi

c# - 检测粘贴事件是否发生在富文本框中

转载 作者:可可西里 更新时间:2023-11-01 08:21:34 26 4
gpt4 key购买 nike

有没有一种方法可以查明富文本框中是否发生了剪贴板粘贴事件?此事件将用于执行某些操作,以及粘贴的文本 block 。

谢谢

这是我的代码

 protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == WM_PASTE)
{
OnPasteOccurred();
MessageBox.Show("Pas");
}
if (m.Msg == 0x000F)
{
if (PaintControl)
{
base.WndProc(ref m);
}
else
{
m.Result = IntPtr.Zero;
}
}
else
{
base.WndProc(ref m);
}
}

编辑

我希望根据粘贴事件做一些语法高亮或缩进,这是特别的 code editor似乎做得很有效率。我不知道它是怎么做到的。在这个特定方向上需要帮助。我很确定一定有一些 native Win32 代码或类似的东西可以被拦截。我试过跟踪按键、鼠标事件,但效果不佳。

最佳答案

检测 RichTextBox 中的粘贴操作有点棘手。

第一个解决方案可能是检测覆盖 WndProcWM_PASTE 消息,但不幸的是,控件在执行粘贴操作时不会向自身发送该消息。

朴素检测

要检测键盘事件可能有效(您必须覆盖 OnKeyDown 函数)然后检查组合键 (CTRL+VSHIFT+INS)。像这样:

protected override OnKeyDown(KeyEventArgs e)
{
bool ctrlV = e.Modifiers == Keys.Control && e.KeyCode == Keys.V;
bool shiftIns = e.Modifiers == Keys.Shift && e.KeyCode == Keys.Insert;

if (ctrlV || shiftIns)
DoSomething();
}

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

更好的检测

假设:当用户在 RichTextBox 中键入时,他每次插入一个字符。你怎么用这个?嗯,当你检测到一个更大的变化时,你检测到一个粘贴操作,因为用户每次不能输入超过一个字符(好吧,你可以争辩说,由于 Unicode 代理,它并不总是正确的)。另见 VB.NET versionmore details about Unicode东西。

private int _previousLength = 0;

private void richTextBox_TextChanged(object sender, EventArgs e)
{
int currentLength = richTextBox.Text.Length;
if (Math.Abs(currentLength - _previousLength) > 1)
ProcessAllLines();

_previousLength = currentLength;
}

请注意,您不能(因为 IME 的工作方式不同)使用 OnKeyDown(或类似的)。这只适用于西方语言,但它对 Unicode 的东西有问题(因为,例如,当用户键入单个字符时,String.Length 属性可能会增加两个 Char . 另请参阅 this post 以了解更多详细信息(强烈建议阅读,即使 - 在这种情况下 - 你不关心它)。在那篇文章中你还会找到更好算法的代码确定字符串长度。简而言之,您必须替换:

   int currentLength = richTextBox.Text.Length;

有了这个:

   int currentLength = StringInfo.GetTextElementEnumerator(richTextBox.Text)
.Cast<string>()
.Count();

经过所有这些努力,您可能会意识到......用户甚至可以粘贴单个字符,而且它可能不会被检测到。你是对的,这就是为什么这是一个更好的检测而不是一个完美的解决方案

完美解决

完美的解决方案(如果您在 Windows 8 上运行)当然存在, native 丰富的编辑控件发送 EN_CLIPFORMAT 通知消息。它旨在通知 rich edit 控件的父窗口发生了特定剪贴板格式的粘贴。然后,您可以覆盖其父级的 WndProc 以检测此通知的 WM_NOTIFY 消息。不管怎样,这不是几行代码,检查这个 MSDN article了解详情。

关于c# - 检测粘贴事件是否发生在富文本框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5618162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com