选中另一个进程的syslistview32中的其中一项前面的checkbox! 情况是:调用外部程序,要选中这个程序的syslistview(listbox)里其中一项,但这个LISTBOX在它的每一项的开头都添加了一个checkbox,现在我想选中一项,应该怎么做?::SendMessage(hwnd, LVM_SETITEMSTATE, Index, (LPARAM)buffer)这个只能选中其中一项,不能单击checkbox。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是ListBox,我估计它的CheckBox的Create出来,然后设置为ListBox的子窗口的,因为ListBox本身不具有提供CheckBox的功能。你可以尝试通过ListBox的窗口句柄然后调用GetWindow(GW_CHILD)的方法来获取子窗口句柄 好主意,获得了它的句柄后能直接用sendmessage(hwnd,BM_CLICK,0,0)选中吗? 获取CHECKBOX的句柄后,发送BM_GETCHECK消息获取状态,发生BM_SETCHECK消息改变CHECKBOX的状态 还不行,LISTBOX里面有很多ITEM,如何找到其中一条ITEM的句柄呢? 你找ITEM的句柄干什么,它是没有句柄的,你用LISTBOX句柄调用GetWindow是要寻找CHECKBOX句柄 用LISTBOX句柄调用GETWINDOW可以找到checkbox的句柄,但应该怎么控制它点击哪一个CHECKBOX呢?LISTBOX中有多条ITEM,每条ITEM前都有一个CHECKBOX 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;} 楼主的目标控件是ListBox,不是ListCtrl或者ListView cnzdgs兄的函数是对的,不过结果是那个checkbox框的状态没有被打勾,而是完全不见了,这是什么原因? 我明白了,不见了就是被选中了,谢谢你啊大哥,真牛,也谢谢laiyiling兄 item.state = 0x2000;应该这样写,手误,写错了。 item.state = 0x1000;这个也要改。 CSDN博客的新功能请教 黑龙江生猪患甲流 砖家称吃猪肉不会感染 添加菜单为什么出错? 为什么我写的Direct3d程序很占CPU资源 如何解决两个子对话框与两个按钮的对应关系 在程序中怎样识别系统中MADC的版本? 我想获得对话框的HWND为何总是NULL 那里可以下载 more effective c++ ?中英文版都可以。送10分 求一简易的CAM程序 一个简单API例程:为什么不执行消息循环?请高手相助 安装VC++6.0后,新建的projects里面没有MFC选项? 串口通讯的一个问题,谢谢
{
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;
}
楼主的目标控件是ListBox,不是ListCtrl或者ListView
应该这样写,手误,写错了。
这个也要改。