我正在尝试创建自定义DomainUpDown。我需要阻止粘贴事件。
我尝试覆盖控件的WndProc
,它在MaskedTextBox中可以正常工作,但在这里不起作用。
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x302) //PasteEvent
{
//base.WndProc(ref m);
}
else
{
base.WndProc(ref m);
}
}
答案 0 :(得分:2)
通常,您可以将控件的句柄Message.hWnd
引用设置为IntPtr.Zero
:消息不会被传递。
这不适用于 DomainUpDown
控件:它不会收到WM_PASTE
消息,而只会收到WM_COMMAND
。将Handle引用设置为IntPtr.Zero
是没有用的,正在处理消息的控件是子 UpDownEdit
控件(派生TextBox
)。
可能的解决方案:
在Right-MouseDown上禁用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);
}
答案 1 :(得分:2)
使用NativeWindow
可以处理TextBox
和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();
}
}
}
如果您想验证输入并将经过清理的文本粘贴到控件,请看以下文章: