1

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

#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);
}

我得到的结果是

在此处输入图像描述

而不是项目被选中并突出显示

在此处输入图像描述

请让我知道可能出了什么问题

4

1 回答 1

2

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

于 2013-09-12T18:42:43.593 回答