一个程序通过枚举窗口找到另外一个目标窗口, 又得到目标窗口上一个list的句柄, 向它发什么消息,才能选择其中的一个item。
最好把信令名,和左右参数说一下。
谢谢、

解决方案 »

  1.   

    send the LVM_SETITEMSTATE message:LVITEM item;
    item.mask = LVIF_STATE;
    item.state = TRUE;
    item.stateMask = LVIS_SELECTED;SendMessage(ListView1.hwnd, 
                        LVM_SETITEMSTATE, 
                         (WPARAM)iItem, // Index of the list view item, -1: all 
                         (LPARAM)&item)
      

  2.   

    修正:
    item.state = LVIS_SELECTED;
      

  3.   

    ::SendMessage(m_hWnd, LB_SETCURSEL,
      

  4.   

    ::SendMessage(m_hWnd, LB_SETCURSEL,
    ----------------------------------是clistctrl 不是listbox, 不行!!
      

  5.   

    修正:
    item.state = LVIS_SELECTED;
    -------------------------------
    不行。。
      

  6.   

    枚举子窗口,找到CListCtrl控件后得到它的指针,再用CListCtrl::SetItemState方法,该成员函数的用法见MSDN。
      

  7.   

    与楼上有同感,呵呵:)
    不过还是贴出完整代码,网上看到的:int LVSelectTest()
    {

    HWND hwnd;
    int iItem=0;
    LVITEM lvitem, *plvitem;
    DWORD PID;
    HANDLE hProcess;


    hwnd=FindWindow("#32770","Windows 任务管理器");
    hwnd=FindWindowEx(hwnd,0,"#32770",0);
    hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

    if (!hwnd)
    {
    MessageBox(NULL,"[Windows 任务管理器] 尚未启动!","错误!",NULL);
    }
    else
    {

    GetWindowThreadProcessId(hwnd, &PID);

    hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if (!hProcess)
    {
    MessageBox(NULL,"获取进程句柄操作失败!","错误!",NULL);
    }
    else
    {
    plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);

    if (!plvitem)
    {
    MessageBox(NULL,"无法分配内存!","错误!",NULL);
    }
    else
    {
    MessageBox(NULL,"本演示程序将选中TaskManager中的第6个项目。","提示",NULL);

    iItem=-1; //5在这里是第六个(从零开始)
    lvitem.mask = LVIF_STATE;
    lvitem.state = LVIS_SELECTED; //lvitem.state=LVIS_SELECTED;
    lvitem.stateMask=LVIS_SELECTED;
    WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
    SendMessage(hwnd, LVM_SETITEMSTATE, (WPARAM)iItem, (LPARAM)plvitem);

    }
    }
    }


    //释放内存
    CloseHandle(hProcess);
    VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
    //CloseHandle(hwnd);

    return 0;
    }
      

  8.   

    注意:
    iItem=-1表示全选(需要ListView风格支持全选才行)
    其它表示zero-based item index
      

  9.   

    枚举子窗口,找到CListCtrl控件后得到它的指针,再用CListCtrl::SetItemState方法,该成员函数的用法见MSDN。
    ----------------------------------------------------------------------------------这个方法试了,不行。  我在b的程序里,能操作这个a程序中的地址吗?? 就是造型成指针也没用。
      

  10.   

    先写下面的函数:
    BOOL CALLBACK EnumProc( HWND hWnd, LPARAM )
    {
    TCHAR   szClass[128];       
    do 
    {
    GetClassName(hWnd, szClass, sizeof(szClass)); 
    if(lstrcmp(szClass, "SysListView32") == 0)
    {
    CListCtrl *temp=(CListCtrl *)CWnd::FromHandle(hWnd);
    //下面假如我想选定第三个Item
    temp->SetItemState(2,LVIS_SELECTED, LVIS_SELECTED);
    break;                   
    }
    hWnd=::GetNextWindow(hWnd,GW_HWNDNEXT);                
    } while(NULL!=hWnd);                                      
        return FALSE;
    }
    再自己试试:
    void CTransparentControlDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    //假如你要找的窗口为标题“ListCtrlDemo”
    HWND Handle=::FindWindow(0,"ListCtrlDemo");
    if (Handle) 
    {
    EnumChildWindows(Handle,EnumProc,0);
    }
    else
    AfxMessageBox("Can't find the window.");
    }
    ---------------------------------------------------------------------------------------
    另外,要自己多动手写程序,不要总想着要答案,这样是难以快速提高自己的。一点小小的建议。
      

  11.   

    上面的代码其实还有点小小的问题,留着你自己再完善一下,呵呵
    楼上frank朋友的代码你有没有认真研究过?!不用另给我分了,谢谢!