C# 在DomainUpDown控件中阻止粘贴事件

C# 在DomainUpDown控件中阻止粘贴事件,c#,winforms,C#,Winforms,我正在尝试创建一个自定义域UpDown。我需要阻止粘贴事件 我试图覆盖控件的WndProc,它在MaskedTextBox中工作正常,但在这里它不工作 protected override void WndProc(ref Message m) { if (m.Msg == 0x302) //PasteEvent { //base.WndProc(ref m); } else { base.WndProc(ref m);

我正在尝试创建一个自定义域UpDown。我需要阻止粘贴事件

我试图覆盖控件的
WndProc
,它在MaskedTextBox中工作正常,但在这里它不工作

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

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

这不适用于
DomainUpDown
控件:它不接收
WM\u粘贴
消息,只接收
WM\u命令
。将句柄引用设置为
IntPtr.Zero
无效,处理消息的控件是子控件
UpDownEdit
控件(
TextBox

可能的解决方案:
在鼠标右键向下移动时禁用
Control-V
Shift-Insert
ContextMenu

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);
}

使用
native窗口
可以处理内部
文本框
的消息,该文本框在
DomainUpDown
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();
        }
    }
}
如果您可能希望验证输入并将经过消毒的文本粘贴到控件,请查看以下帖子:


这要看情况而定。它适用于大多数控件。什么是
域updown
?你是说一个
NumericUpDown
?它几乎和NumericUpDown一样,在VisualStudio中,这两个控件都是正确的。您还可以使用UI自动化钩住
DomainUpDown
的底层编辑控件。那你可以用它做任何事。但是,您必须非常熟悉UI自动化,以便最终更改/调整某些内容(这里潜伏着令人头痛的问题)。您可能希望存储和重用
ContextMenu
,并在释放控件时释放它。@Reza Aghaei当然,谢谢。更新。问题是,我不太喜欢这种方法。OP应该选择你建议的,它更具教育意义。比如:)在UI自动化风格中,控件可以是
wh=new MyWindoHelper(Controls.OfType().FirstOrDefault(c=>c.AccessibilityObject.Role==accessibileRole.Text))我现在有VS IDE:)很抱歉回答晚了,它工作得很好,谢谢