我可以检测用户是否右键单击Winforms中的ListView列标题?

我不是指listview项的内部,而是指允许您调整列大小的列标题。

一个简单的UserControl覆盖ListViewOnMouseEnter OnMouseLeaveWndProc

 public partial class MyListView : ListView { public MyListView() { } public delegate void ColumnContextMenuHandler(object sender, ColumnHeader columnHeader); public event ColumnContextMenuHandler ColumnContextMenuClicked = null; bool _OnItemsArea = false; protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); _OnItemsArea = true; } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); _OnItemsArea = false; } const int WM_CONTEXTMENU = 0x007B; protected override void WndProc(ref Message m) { if (m.Msg == WM_CONTEXTMENU) { if (!_OnItemsArea) { Point p = base.PointToClient(MousePosition); int totalWidth = 0; foreach (ColumnHeader column in base.Columns) { totalWidth += column.Width; if (pX < totalWidth) { if (ColumnContextMenuClicked != null) ColumnContextMenuClicked(this, column); break; } } } } base.WndProc(ref m); } } 

和用法

  myListView1.ColumnContextMenuClicked += (sndr, col) => { this.Text = col.Text; }; 

OnMouseEnter / Leave解决方案有时甚至不会在标题上显示上下文菜单。 这是列标题的ListView ContextMenuStrip的更好解决方案