C# 在DomainUpDown控件中阻止粘贴事件
我正在尝试创建一个自定义域UpDown。我需要阻止粘贴事件 我试图覆盖控件的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);
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:)很抱歉回答晚了,它工作得很好,谢谢