如何抑制用户对 ListBox 控件的操作

Posted

技术标签:

【中文标题】如何抑制用户对 ListBox 控件的操作【英文标题】:How to supress user actions on a ListBox control 【发布时间】:2020-12-22 09:40:02 【问题描述】:

假设我们有一个控件(例如 ListBox)并且需要锁定它以防止鼠标单击和键盘操作。当然,有一个标准属性Enabled,但它会导致外观变化,在我的情况下是不可取的。

我找到了一个使用 Windows API 的简单解决方案,见下文。令人惊讶的是,我还没有找到完全适合我的任务的类似问题,所以让我与社区分享这个明显的解决方案。

感谢任何添加和 cmets。以防有人会提出更合适/更短/更好的答案。

【问题讨论】:

谢谢@MickyD,我同意你的观点并做了一些更正。 【参考方案1】:

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

首先我们应该找出哪些标准 WinAPI 消息在发布到控件时会被抑制。在我的 ListBox 控件的特殊情况下,我选择了 WM_LBUTTONDOWNWM_KEYDOWNWM_SETFOCUS 消息 (see docs),以锁定鼠标和键盘按钮按下并防止我的控件聚焦。

其次我们创建一个基于ListBox的派生控件类,为了方便,在同一个命名空间中:

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);
    

这里重写了控件的标准WndProc 方法,以根据Lock 标志状态停止发布选定的消息。

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

现在,当设置Lock 属性时,我们修改后的 ListBox 将免受用户操作(鼠标单击、键盘操作和聚焦)的影响。

【讨论】:

我想知道,[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 仍然 当您开始将邮件列入黑名单时,您就是在找麻烦。右键事件呢?还是剪切/粘贴?我建议通过处理WM_CTLCOLOR 消息来禁用该控件并更改视觉效果。

以上是关于如何抑制用户对 ListBox 控件的操作的主要内容,如果未能解决你的问题,请参考以下文章

VB listbox中list和text属性区别

vb里面listbox控件如何改变某一行的背景颜色

VB里如何逐行读取listbox中的数据

关于VC++ MFC ListBox控件显示数据的问题

vb comboBOx和listBox两个属性有啥不同?

如何将ListBox项绑定到用户控件上?