情况是:调用外部程序,要选中这个程序的syslistview(listbox)里其中一项,但这个LISTBOX在它的每一项的开头都添加了一个checkbox,现在我想选中一项,应该怎么做?::SendMessage(hwnd, LVM_SETITEMSTATE, Index, (LPARAM)buffer)这个只能选中其中一项,不能单击checkbox。

解决方案 »

  1.   

    如果是ListBox,我估计它的CheckBox的Create出来,然后设置为ListBox的子窗口的,因为ListBox本身不具有提供CheckBox的功能。你可以尝试通过ListBox的窗口句柄然后调用GetWindow(GW_CHILD)的方法来获取子窗口句柄
      

  2.   

    好主意,获得了它的句柄后能直接用sendmessage(hwnd,BM_CLICK,0,0)选中吗?
      

  3.   

    获取CHECKBOX的句柄后,发送BM_GETCHECK消息获取状态,发生BM_SETCHECK消息改变CHECKBOX的状态
      

  4.   

    还不行,LISTBOX里面有很多ITEM,如何找到其中一条ITEM的句柄呢?
      

  5.   

    你找ITEM的句柄干什么,它是没有句柄的,你用LISTBOX句柄调用GetWindow是要寻找CHECKBOX句柄
      

  6.   

    用LISTBOX句柄调用GETWINDOW可以找到checkbox的句柄,但应该怎么控制它点击哪一个CHECKBOX呢?LISTBOX中有多条ITEM,每条ITEM前都有一个CHECKBOX
      

  7.   

    bool SelectLvItemCheck(HWND Lv, int Index, BOOL Check)
    {
        bool result = false;
        DWORD processId = NULL;
        GetWindowThreadProcessId(Lv, &processId);
        if (processId == NULL) return false;
        HANDLE process = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE, FALSE, processId);
        if (process == NULL) return false;
        PVOID buffer = VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
        if (buffer != NULL)
        {
            LVITEM item;
            item.mask = LVIF_STATE;
            if (Check)
                    item.state = 0x0200;
            else
                    item.state = 0x0100;
            item.stateMask = LVIS_STATEIMAGEMASK;
            WriteProcessMemory(process, buffer, &item, sizeof(LVITEM), NULL);
            if (SendMessage(Lv, LVM_SETITEMSTATE, Index, (LPARAM)buffer) != 0) result = true;
            VirtualFreeEx(process, buffer, sizeof(LVITEM), MEM_DECOMMIT);
        }
        CloseHandle(process);
        return result;
    }
      

  8.   


    楼主的目标控件是ListBox,不是ListCtrl或者ListView
      

  9.   

    cnzdgs兄的函数是对的,不过结果是那个checkbox框的状态没有被打勾,而是完全不见了,这是什么原因?
      

  10.   

    我明白了,不见了就是被选中了,谢谢你啊大哥,真牛,也谢谢laiyiling兄
      

  11.   

    item.state = 0x2000;
    应该这样写,手误,写错了。
      

  12.   

    item.state = 0x1000;
    这个也要改。