DomainUpDown控件中的“阻止粘贴”事件

时间:2019-01-27 22:03:13

标签: c# winforms

我正在尝试创建自定义DomainUpDown。我需要阻止粘贴事件。

我尝试覆盖控件的WndProc,它在MaskedTextBox中可以正常工作,但在这里不起作用。

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x302)  //PasteEvent
    {
        //base.WndProc(ref m);
    }
    else
    {
        base.WndProc(ref m);
    }
}

2 个答案:

答案 0 :(得分:2)

通常,您可以将控件的句柄Message.hWnd引用设置为IntPtr.Zero:消息不会被传递。

这不适用于 DomainUpDown 控件:它不会收到WM_PASTE消息,而只会收到WM_COMMAND。将Handle引用设置为IntPtr.Zero是没有用的,正在处理消息的控件是子 UpDownEdit 控件(派生TextBox)。

可能的解决方案:
在Right-MouseDown上禁用Control-VShift-InsertContextMenu

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{
    if ((keyData == (Keys.Control | Keys.V)) || (keyData == (Keys.Shift | Keys.Insert))) {
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

ContextMenu emptyMenu = new ContextMenu();

protected override void OnMouseDown(MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right) {
        this.ContextMenu = emptyMenu;
        return;
    }
    base.OnMouseDown(e);
}

protected override void Dispose(bool disposing)
{
    if (disposing && this.emptyMenu != null) {
        this.emptyMenu.Dispose();
    }
    base.Dispose(disposing);
}

答案 1 :(得分:2)

使用NativeWindow可以处理TextBoxDomainUpDown控件中使用的内部NumericUpDown的消息。

在下面的代码中,我已经处理过WM_PASTE方法,并且只发出了哔声作为响应:

using System;
using System.Windows.Forms;
public class MyDomainUpDown : DomainUpDown
{
    MyWindoHelper wh;
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        wh = new MyWindoHelper(Controls[1]);
    }
    protected override void Dispose(bool disposing)
    {
        if (wh != null)
            wh.DestroyHandle();
        base.Dispose(disposing);
    }
    class MyWindoHelper : NativeWindow
    {
        Control c; //For future reference if needed.
        public MyWindoHelper(Control control)
        {
            c = control;
            this.AssignHandle(c.Handle);
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg != 0x0302 /*WM_PASTE*/)
                base.WndProc(ref m);
            else
                System.Media.SystemSounds.Beep.Play();
        }
    }
}

如果您想验证输入并将经过清理的文本粘贴到控件,请看以下文章: