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

标签 c# .net combobox mouse capture

我正在尝试对 ComboBox 下拉菜单(或与此相关的其他下拉菜单,包括上下文菜单)的行为进行建模,当您点击其他任何地方时,即使点击无法聚焦的内容,下拉菜单也会关闭。

p>

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

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

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

最佳答案

ComboBox 由 2 个控件构成。

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

通常基地是可见的。当用户单击 ComboBox 时,Base 控件会隐藏而 DropDownList 控件会出现。此切换是在后台完成的,因此对于用户来说,控件似乎只是展开了。

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

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

关于c# - ComboBox在下拉时如何捕获鼠标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9280096/

相关文章:

c# - 将字节数组转换为 C# 中的枚举集合

c# - 如何打破 BoundField 的 HeaderText

c# - 使用 MediaPlayer 控件自动播放下一个文件(AxWindowsMediaPlayer)

c# - Windows 中公钥和私钥容器的位置?

ExtJS 4 组合框自动完成

c# - 如何链接2个组合框

c# - 合并两个数据库表的 LINQ 代码?

c# - TestDriven.net,右击,运行测试,不重建

.net - 将空参数传递给 WCF 服务

vb.net - 进行绑定(bind)组合框选择时 Windows 窗体卡住