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