我正在尝试对 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/