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

Tre*_*ott 7 .net c# mouse combobox capture

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

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

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

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

Zol*_*nda 1

ComboBox 由 2 个控件构成。

  • 底座 - 不活动时可见(控制)
  • DropDownList - 在编辑模式或列表选择模式(窗口或表单)期间可见

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

您想要捕获的事件是通过 DropDownList 窗口完成的。如果您单击客户区域上的某处,DropDownList 窗口将通过其WndProc(Message% m)方法接收WM_KILLFOCUS事件。然后向父窗口(Base 控件)发送一条带有WParam=526318 ( HIWORD(WParam)=8 ) 的WM_COMMAND ( OCM_COMMAND ) 消息,并且 Base 控件知道他应该隐藏 DropDownList 窗口。

因此,您需要做的是实现附加的下拉窗口并捕获 WM_KILLFOCUS 事件。