我使用一个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右键菜单禁用粘贴操作完全错误的方法。请以正确的方式告诉我。
答案 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);
}
}