从列表视图中选择并突出显示项目

Posted

技术标签:

【中文标题】从列表视图中选择并突出显示项目【英文标题】:Selecting and Highlighting an Item from List View 【发布时间】:2013-09-03 10:27:59 【问题描述】:

我想从列表视图控件中选择并突出显示一个项目,并且正在使用以下代码

#include <Windows.h>
#include <commctrl.h>


int main() 
    //Hardcoded Handle to the ListView Windows of Add Printer Dialog
    HWND hwndListView = (HWND)0x000206D6; 
    DWORD dwProcessID;
    ::GetWindowThreadProcessId( hwndListView, &dwProcessID );
    HANDLE process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, dwProcessID); 

    LVITEM lvi;

    LVITEM* _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE); 

    lvi.state = LVIS_FOCUSED | LVIS_SELECTED ;
    lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ;
    lvi.mask = LVIF_STATE;

    WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); 
    ::SendMessage(hwndListView, LVM_SETITEMSTATE, (WPARAM)0, (LPARAM)_lvi); 
    VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);

我得到的结果是

而不是选择并突出显示项目

请告诉我可能出了什么问题

【问题讨论】:

为什么不用 ListView 编写测试应用程序并尝试在其中选择项目?这样你就可以调试你的代码出了什么问题。 可能 ListView 不在焦点上? @marcin_j:你能详细说明一下用 ListView 写 App 是什么意思吗? @AlexFarber:我尝试添加另一行 ::SetFocus(hwndListView) 但这没有帮助 如果您在窗口中手动将焦点设置为 ListView - 使用鼠标或 Tab 键会发生什么? 【参考方案1】:

对于哪些进程可以在窗口上设置焦点是有限制的,当对话框处于活动状态时,选择 ListView 项目的应用程序可能不满足这些限制。例如,被聚焦的 HWND 必须附加到调用线程的消息队列。因此,高亮显示应用必须先使用AttachThreadInput(),然后才能在另一个应用的窗口上调用SetFocus()

【讨论】:

以上是关于从列表视图中选择并突出显示项目的主要内容,如果未能解决你的问题,请参考以下文章

ListView 项目在滚动后保持突出显示

Android:将列表视图项设置为“选定”(突出显示)

突出显示可展开列表中的选定项目

在 ListView 中默认选择一行并突出显示所选行 Android

列表视图覆盖和突出显示列表视图项目

突出显示和取消突出显示在 jquery 中选择的项目