c# - 是否可以通过鼠标右键触发 ListView 上的 DoubleClicked 事件?
问题描述
此处的表格演示了当用户在 a或DoubleClick
上双击鼠标左键或右键时引发事件;我只希望在鼠标左键双击时触发此事件。这里的备注说明是之前提出的,所以没有办法取消或者短路。TreeView
ListView
DoubleClick
MouseDoubleClick
DoubleClicked
从逻辑上讲,正确的解决方案似乎是使用MouseDoubleClick
and not DoubleClick
,但对前一种状态的注释:
DoubleClick 事件在逻辑上是控件的更高级别事件。它们可能由其他用户操作引发,例如快捷键组合。
...这似乎暗示我实际上应该使用DoubleClick
,但我又不能,因为这不允许我忽略或取消鼠标右键双击。
是否有任何相对简单的方法可以防止DoubleClick
鼠标右键双击触发,或者我是否需要弄脏并手动处理 Windows 消息?
解决方案
更新
事情发生在void WndProc(ref Message m)
. 我试图用不同的控件(PictureBox
)重现问题。左键双击给出:
protected virtual void WndProc(ref Message m)
{
// ...
switch (m.Msg)
{
// ...
case 514:
WmMouseUp(ref m, MouseButtons.Left, 1);
return;
// ...
}
// ...
}
右键双击导致调用:
protected virtual void WndProc(ref Message m)
{
// ...
switch (m.Msg)
{
// ...
case 517:
WmMouseUp(ref m, MouseButtons.Right, 1);
return;
// ...
}
// ...
}
哪里void WmMouseUp(ref Message m, MouseButtons button, int clicks)
看起来像:
private void WmMouseUp(ref Message m, MouseButtons button, int clicks)
{
// ...
OnDoubleClick(new MouseEventArgs(button, 2, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0));
OnMouseDoubleClick(new MouseEventArgs(button, 2, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0));
// ...
}
两者都OnDoubleClick
和OnMouseDoubleClick
火一起MouseEventArgs
。这就是该解决方案有效的原因。
private void control_DoubleClick(object sender, EventArgs e)
{
if ((e as MouseEventArgs)?.Button == MouseButtons.Right)
return;
// do your stuff
}
但情况有所不同ListView
:
protected virtual void WndProc(ref Message m)
{
// ...
switch (m.Msg)
{
// ...
case 514:
case 517: // m.Msg value
case 520:
{
NativeMethods.LVHITTESTINFO lvhi = new NativeMethods.LVHITTESTINFO();
int indexOfClickedItem = GetIndexOfClickedItem(lvhi);
if (!base.ValidationCancelled && listViewState[262144] && indexOfClickedItem != -1)
{
listViewState[262144] = false;
OnDoubleClick(EventArgs.Empty);
OnMouseDoubleClick(new MouseEventArgs(downButton, 2, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0));
}
if (!listViewState[524288])
{
OnMouseUp(new MouseEventArgs(downButton, 1, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0));
listViewState[1048576] = false;
}
ItemCollectionChangedInMouseDown = false;
listViewState[524288] = true;
base.CaptureInternal = false;
return;
}
// ...
}
// ...
}
它OnDoubleClick
与EventArgs.Empty
. 所以第一个解决方案不起作用。
解决方法可能是使用已修补的ListView
:
public class PatchedListView : ListView
{
protected override void WndProc(ref Message m)
{
var suppress = m.Msg == 517 &&
Enum.TryParse(typeof(ListView).GetField("downButton", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this).ToString(),
out MouseButtons mouseButtons) &&
mouseButtons == MouseButtons.Right;
if (suppress)
return;
base.WndProc(ref m);
}
}
推荐阅读
- xcode - 如何在调试 Xcode 时隐藏此窗口?
- excel - 从 ssrs 更改 excel 中选项卡的名称
- django - 需要知道批量导入的问题在哪里以及如何解决它
- django - 姜戈。“python manage.py 运行服务器
: “获取”资源( ) 在线,但没有响应连接尝试。”在 chrome 上 - qt - QT socket无法连接,但是hercules app可以连接
- python - 使用 Paramiko 或其他 Python 库通过 SSH 跳转服务器远程登录网络设备
- mysql - 比较两个 mysql-database 转储的内容并生成补丁 sql 文件
- r - Shiny 如何将文本放在页面底部
- reactjs - 在 React 样式的组件中使用 SVG 作为输入范围拇指背景
- angularjs - 容器上下文中的 Angular 使用函数