C# 当鼠标落下时,组合框如何捕获鼠标?

C# 当鼠标落下时,组合框如何捕获鼠标?,c#,.net,combobox,mouse,capture,C#,.net,Combobox,Mouse,Capture,我试图模拟一个组合框下拉菜单(或其他下拉菜单,包括上下文菜单)的行为,当你点击其他地方时,下拉菜单关闭,即使是在无法聚焦的地方 我尝试过订阅MouseCaptureChanged、LostFocus和Leave等事件。我有一个自定义的UserControl,它充当下拉菜单,我只想在用户单击其他任何地方时将其关闭 这似乎是在许多控件中完成的,所以如果没有一种简单的方法,我会感到惊讶 到目前为止,我能想到的超复杂方法是使用pinvoke和SetCapture()函数,或者创建MessageFilte

我试图模拟一个组合框下拉菜单(或其他下拉菜单,包括上下文菜单)的行为,当你点击其他地方时,下拉菜单关闭,即使是在无法聚焦的地方

我尝试过订阅MouseCaptureChanged、LostFocus和Leave等事件。我有一个自定义的UserControl,它充当下拉菜单,我只想在用户单击其他任何地方时将其关闭

这似乎是在许多控件中完成的,所以如果没有一种简单的方法,我会感到惊讶


到目前为止,我能想到的超复杂方法是使用pinvoke和SetCapture()函数,或者创建MessageFilter。如果这些是唯一的选项,我不确定哪一个更好。

组合框由两个控件构成

  • 基本-未激活时可见(控制)
  • 下拉列表-在编辑模式或列表选择模式(窗口或窗体)期间可见
通常,底座是可见的。当用户单击组合框时,基本控件隐藏,DropDownList控件显示。这个切换是在后台完成的,因此对于用户来说,控件似乎刚刚扩展

要捕获的事件通过DropDownList窗口完成。如果单击客户端区域的某个位置,DropDownList窗口将通过其WndProc(消息%m)方法接收WM_KILLFOCUS事件。然后向父窗口(基本控件)发送WParam=526318(HIWORD(WParam)=8)的WM_命令(OCM_命令)消息,基本控件知道他应该隐藏DropDownList窗口


因此,您需要实现额外的下拉窗口并捕获WM_KILLFOCUS事件。

您提到的控件模板用于下拉列表,将弹出窗口作为容器,StaysOpen属性设置为false(我认为这是默认设置)


实现下拉式控件的简单方法是使用ToolStripControlHost和ToolStripDropDown。就像一个组合框。请看,我正在尝试ToolStripControlHost。我无法消除弹出窗口顶部的难看边框,或者每当打开下拉列表时组合框的闪烁。请确保将ToolStripContorlHost的边距和ToolStripDropDown的填充设置为0。控件上的闪烁是另一个问题-是否尝试使用带有自定义下拉列表的组合框?是。我重写OnDropDown并重置IntegralHeight属性以强制关闭它。它使它不会出现,但仍会闪烁。@Moozhe,您使用的是Windows窗体还是WPF?