我有一个组合框,我需要拦截选择的更改,同时用户通过鼠标悬停而不用点击来更改选择。这用于显示有关用户悬停的项目的补充信息。
CBN_SELCHANGE
无法完成这项工作,因为只有当用户实际通过点击其中一个组合框项目或当按下向上/向下键。
当用户将鼠标悬停在组合框上时,显然不会触发任何消息。
插图
例如:我需要知道用户何时将鼠标从条目2
移动到条目33
。
答案 0 :(得分:1)
这是基于你提到的c# article的c ++子类:
LRESULT CALLBACK ComboProc(HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam, UINT_PTR uIdSubClass, DWORD_PTR)
{
if (msg == WM_CTLCOLORLISTBOX)
{
COMBOBOXINFO ci = { sizeof(COMBOBOXINFO) };
GetComboBoxInfo(hwnd, &ci);
if (HWND(lParam) == ci.hwndList)
{
int pos = SendMessage(ci.hwndList, LB_GETCURSEL, 0, 0);
OutputDebugStringA(std::to_string(pos).c_str());
OutputDebugStringA("\n");
}
}
if (msg == WM_NCDESTROY)
{
RemoveWindowSubclass(hwnd, ComboProc, uIdSubClass);
}
return DefSubclassProc(hwnd, msg, wParam, lParam);
}
...
SetWindowSubclass(hComboBox, ComboProc, 0, 0);
这是在Windows 10上测试的。
这只能在下拉列表中报告悬停选择,它无法更改选择。