C# 如何抑制ListBox控件上的用户操作

C# 如何抑制ListBox控件上的用户操作,c#,winforms,winapi,controls,mouseevent,C#,Winforms,Winapi,Controls,Mouseevent,假设我们有一个控件(例如ListBox),需要通过鼠标单击和键盘操作将其锁定。当然,有一个标准属性已启用,但它会导致外观更改,这在我的情况下是不可取的 我发现了一个使用Windows API的简单解决方案,请参见下文。令人惊讶的是,我还没有为我的任务找到一个完全相同的问题,所以让我与社区分享这个显而易见的解决方案 如有任何补充和意见,我们将不胜感激。以防有人提出更合适/更短/更好的答案。我们可以使用Windows API锁定我们对用户操作的控制 首先,我们应该了解在发布到控件时将禁止哪些标准Wi

假设我们有一个控件(例如ListBox),需要通过鼠标单击和键盘操作将其锁定。当然,有一个标准属性
已启用
,但它会导致外观更改,这在我的情况下是不可取的

我发现了一个使用Windows API的简单解决方案,请参见下文。令人惊讶的是,我还没有为我的任务找到一个完全相同的问题,所以让我与社区分享这个显而易见的解决方案


如有任何补充和意见,我们将不胜感激。以防有人提出更合适/更短/更好的答案。

我们可以使用Windows API锁定我们对用户操作的控制

首先,我们应该了解在发布到控件时将禁止哪些标准WinAPI消息。在列表框控件的特殊情况下,我选择了
WM_LBUTTONDOWN
WM_KEYDOWN
WM_SETFOCUS
messages(),以锁定鼠标和键盘按键,防止控件对焦

其次,为了方便起见,我们基于
列表框
,在同一名称空间中创建一个派生控件类:

public class LockableListbox : ListBox
{
    public bool Locked { get; set; }

    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_SETFOCUS = 0x0007;
    const int WM_KEYDOWN = 0x0100;

    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
        if (Locked)
            switch (m.Msg)
            {                
                case WM_LBUTTONDOWN:
                case WM_KEYDOWN:
                case WM_SETFOCUS:
                    return;
            }

        base.WndProc(ref m);
    }
}
此处,根据
Lock
标志状态,覆盖控件的标准
WndProc
方法,以停止所选邮件的发布

第三,我们只是将表单类设计器部分中的
ListBox
更改为
LockableListBox


现在,当设置了
锁定
属性时,我们修改的列表框将不会受到用户操作(鼠标单击、键盘操作和聚焦)的影响。

我想知道,
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,Name=“FullTrust”)
行有用吗,在我找到一些信息并回答自己之前,我一直在询问社区。你应该有:
[SecurityPermission(SecurityAction.LinkDemand,Flags=SecurityPermissionFlag.UnmanagedCode)]
[SecurityCritical,SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.UnmanagedCode)]
(在WndProc上)。但是这里(在覆盖上)不需要它。这取决于你在哪里工作:)没问题+1 Netherts当您开始黑名单消息时,您正在寻找麻烦。右键事件呢?还是剪切/粘贴?我建议禁用该控件,并通过处理
WM_CTLCOLOR
消息来更改视觉效果。谢谢你,@MickyD,我同意你的意见,并做了一些更正。