ComboBox在下拉时如何捕获鼠标?

我试图模拟ComboBox下拉列表的行为(或其他下拉菜单的行为,包括上下文菜单),当你点击其他任何地方时,下拉关闭,即使在无法聚焦的事情上也是如此。

我已经尝试订阅MouseCaptureChanged,LostFocus和Leave等事件。 我有一个自定义UserControl作为下拉列表,我只想在用户点击其他任何地方时将其关闭。

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

到目前为止,我可以提出的过于复杂的方法是使用pinvoke和SetCapture()函数,或者创建一个MessageFilter。 如果这些是唯一的选择,我不确定哪个更好。

ComboBox由2个控件构成。

  • 基础 – 未激活时可见(控制)
  • DropDownList – 在编辑模式或列表选择模式(窗口或表单)期间可见

通常情况下,基地是可见的。 当用户单击ComboBox时,Base控件将隐藏并显示DropDownList控件。 此切换在后台完成,因此对于用户来说,控件似乎只是扩展了。

您要捕获的事件是通过DropDownList窗口完成的。 如果单击某个位置到客户区域,DropDownList窗口将通过它的WndProc(Message%m)方法接收WM_KILLFOCUS事件。 然后使用WParam = 526318HIWORD( WParam )= 8 )向父窗口(Base控件)发送WM_COMMANDOCM_COMMAND )消息,并且Base控件知道他应该隐藏DropDownList窗口。

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

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

ComboBox模板示例