想写一个小工具,把任务管理器中的item逐个高亮了,用spy++获取任务管理器句柄以后,发什么消息呢?LBN_SELCHANGE怎么不行呢?

解决方案 »

  1.   

    void ListViewOperator::SetItemSelected(HWND taskHwnd, int nItemIndex ) 
                            //选中listview 类型taskHwnd上某一个ITEM 

    SetForegroundWindow(taskHwnd);//((HWND)0x000410C2);
    SetFocus(taskHwnd);//((HWND)0x000110CC); DWORD dwProcessId; 
    GetWindowThreadProcessId( taskHwnd, &dwProcessId ); //获取进程ID 
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcessId );
    // THROW_EXCEPTION( (m_hProcess == NULL), "Open process failed" ); 
    LVITEM   *pLVItem = (LVITEMA *)VirtualAllocEx( hProcess, NULL, sizeof(LVITEMA), MEM_COMMIT, PAGE_READWRITE ); //在目标进程空间中获得内存,允许读取和写入。 
    // THROW_EXCEPTION( (m_pLVItem == NULL), "Memory alloc failed" ); 
    char *pTextBuffer = (char *)VirtualAllocEx( hProcess, NULL, MAX_TEXT_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE ); 
    // THROW_EXCEPTION( (m_pTextBuffer == NULL), "Memory alloc failed" ); 
        
    LVITEMA lvitem; // 静态结构 
    int nCount=(int)SendMessage(taskHwnd, LVM_GETITEMCOUNT, 0, 0);
    for (int i=0;i<nCount;++i)
    {
    if (i==nItemIndex)
    {
                lvitem.state = LVIS_SELECTED;//LVIS_FOCUSED;
    lvitem.stateMask = LVIS_SELECTED;//LVIS_FOCUSED;
    int nRet = WriteProcessMemory( hProcess, pLVItem, &lvitem, sizeof(LVITEM), NULL ); // 将本地进程中的结构写入到目标进程 
    // HRESULT hRet = SendMessage( m_hwnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)m_pLVItem );//发送消息
         HRESULT hRet = SendMessage( m_taskHwnd, LVM_SETITEMSTATE, (WPARAM)i, (LPARAM)pLVItem );//发送消息
    }
    else
    {
    lvitem.state = !LVIS_SELECTED;//LVIS_FOCUSED;
    lvitem.stateMask = LVIS_SELECTED;//LVIS_FOCUSED;
    int nRet = WriteProcessMemory( hProcess, pLVItem, &lvitem, sizeof(LVITEM), NULL ); // 将本地进程中的结构写入到目标进程 
    // HRESULT hRet = SendMessage( m_hwnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)m_pLVItem );//发送消息
         HRESULT hRet = SendMessage( taskHwnd, LVM_SETITEMSTATE, (WPARAM)i, (LPARAM)pLVItem );
    //lvitem.state = 0;
                //lvitem.stateMask=0;
    }
    // lvitem.stateMask = LVIS_SELECTED;//|LVIS_FOCUSED; 

    }
    return ;