如何抑制用户对 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_LBUTTONDOWN
、WM_KEYDOWN
和 WM_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 控件的操作的主要内容,如果未能解决你的问题,请参考以下文章