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

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

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

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

【问题讨论】:

  • 谢谢@MickyD,我同意你的观点并做了一些更正。

标签: c# winforms winapi controls mouseevent


【解决方案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 消息来禁用该控件并更改视觉效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多