继承或子类TextBox以禁用TextBox上的粘贴

时间:2017-09-27 00:33:56

标签: c# textbox paste

我使用一个TextBox和一个Button创建了一个ButtonEditor usercontrol。如何从右键菜单中禁用TextBox的粘贴操作"粘贴" ?现在,我的方法是创建一个名为" CustomMenuTextBox.cs" Subclassed msg" WM_INITMENU"和" WM_INITMENUPOPUP"调用Win32 API EnableMenuItem。但我不知道如何实现两个继承。

ButtonEditor.cs看起来像:

internal partial class ButtonEditor : UserControl
{  
   //add a textbox and a button from toolbox and some codes...
}   

CustomMenuTextBox.cs如下所示:

internal partial class CustomMenuTextBox : TextBox
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0093 /*WM_UAHINITMENU*/ || m.Msg == 0x0117 /*WM_INITMENUPOPUP*/ || m.Msg == 0x0116 /*WM_INITMENU*/)
        {
            IntPtr menuHandle = m.Msg == 0x0093 ? Marshal.ReadIntPtr(m.LParam) : m.WParam;

            // MF_BYPOSITION and MF_GRAYED
            mAPI.EnableMenuItem(menuHandle, 4, 0x00000400 | 0x00000001);
        }

        base.WndProc(ref m);
    }
}          

我收到了一个错误:

internal partial class ButtonEditor : CustomMenuTextBox, UserControl

我知道我可能会为TextBox右键菜单禁用粘贴操作完全错误的方法。请以正确的方式告诉我。

1 个答案:

答案 0 :(得分:0)

我已经在stackoverflow.com上测试了代码片段,它确实可以禁用文本框的“粘贴”菜单项。但是,我刚刚在Windows 10 32位上进行了测试。 Subclassed消息是WM_UAHINITMENU(0x0093),但我在MSDN上找不到有关Windows消息“WM_UAHINITMENU”的任何信息。

归功于@ demidov和@ CodeCaster并感谢Peter Duniho的正确实施。

将一些代码放在您控制的范围内,并可以修改您的xxx.designer.cs:

internal partial class CustomMenuTextBox : TextBox
    {
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x0093 /*WM_UAHINITMENU*/ || m.Msg == 0x0117 /*WM_INITMENUPOPUP*/ || m.Msg == 0x0116 /*WM_INITMENU*/)
            {
                IntPtr menuHandle = m.Msg == 0x0093 ? Marshal.ReadIntPtr(m.LParam) : m.WParam;

                // MF_BYPOSITION and MF_GRAYED
                mAPI.EnableMenuItem(menuHandle, 4, 0x00000400 | 0x00000001);
            }

            base.WndProc(ref m);
        }
    }