如何将焦点设置在列表视图项目上?

How to set focus on a List View item?

我正在尝试编写一个程序来选择并聚焦列表视图中的特定项目。

为什么调用 ListView_SetSelectionMark(或发送 LVM_SETSELECTIONMARK)无法将焦点设置在列表视图项上?调用ListView_SetSelectionMark后,焦点保持在原来的位置,而不是转移到新的位置;当我按下箭头键时,它会从之前聚焦的项目而不是我指定的项目移动。

这是我选择和聚焦项目的代码片段:

ListView_SetItemState(this->m_hwndChild, index, LVNI_SELECTED, LVNI_SELECTED);
ListView_SetSelectionMark(this->m_hwndChild, index);
ListView_EnsureVisible(this->m_hwndChild, index, false);
SetFocus(this->m_hwndChild);

Here is a full gist。每次按下 Ctrl-R 时,它都会选择列表视图中的一个随机项目。

SelectionMark 与焦点无关。它仅指示哪个项目开始多项选择。

您需要改用 LVIS_FOCUSED 项目状态:

ListView_SetItemState(this->m_hwndChild, index, LVNI_SELECTED | LVNI_FOCUSED, LVNI_SELECTED | LVNI_FOCUSED);
ListView_EnsureVisible(this->m_hwndChild, index, false);
SetFocus(this->m_hwndChild);