перехватить по умолчанию событие "Вставить" элемента управления WinForms TextBox - PullRequest
8 голосов
/ 10 августа 2010

Мне нужно «изменить» весь вставленный в TextBox текст, чтобы он отображался каким-либо структурированным способом.Я могу сделать это с помощью drag-n-drop, ctrl-v, но как это сделать с помощью контекстного меню по умолчанию «Вставить»?

1 Ответ

18 голосов
/ 10 августа 2010

Хотя я бы обычно не предлагал переходить на низкоуровневый Windows API, и это может быть не единственный способ сделать это, но он делает свое дело:

using System;
using System.Windows.Forms;

public class ClipboardEventArgs : EventArgs
{
    public string ClipboardText { get; set; }
    public ClipboardEventArgs(string clipboardText)
    {
        ClipboardText = clipboardText;
    }
}

class MyTextBox : TextBox
{
    public event EventHandler<ClipboardEventArgs> Pasted;

    private const int WM_PASTE = 0x0302;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_PASTE)
        {
            var evt = Pasted;
            if (evt != null)
            {
                evt(this, new ClipboardEventArgs(Clipboard.GetText()));
                // don't let the base control handle the event again
                return;
            }
        }

        base.WndProc(ref m);
    }
}

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        var tb = new MyTextBox();
        tb.Pasted += (sender, args) => MessageBox.Show("Pasted: " + args.ClipboardText);

        var form = new Form();
        form.Controls.Add(tb);

        Application.Run(form);
    }
}

В конечном итоге инструментарий WinForms не очень хорош. Это тонкая оболочка для Win32 и Common Controls. Он раскрывает 80% API, который является наиболее полезным. Остальные 20% часто отсутствуют или не выставляются таким образом, который очевиден. Я бы порекомендовал отойти от WinForms и WPF, если это возможно, так как WPF кажется лучшей архитектурой для .NET GUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...