clistctlr选中一个item?? 通过其他程序。 一个程序通过枚举窗口找到另外一个目标窗口, 又得到目标窗口上一个list的句柄, 向它发什么消息,才能选择其中的一个item。最好把信令名,和左右参数说一下。谢谢、 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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) 修正:item.state = LVIS_SELECTED; ::SendMessage(m_hWnd, LB_SETCURSEL, ::SendMessage(m_hWnd, LB_SETCURSEL,----------------------------------是clistctrl 不是listbox, 不行!! 修正:item.state = LVIS_SELECTED;-------------------------------不行。。 枚举子窗口,找到CListCtrl控件后得到它的指针,再用CListCtrl::SetItemState方法,该成员函数的用法见MSDN。 与楼上有同感,呵呵:)不过还是贴出完整代码,网上看到的: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;} 注意:iItem=-1表示全选(需要ListView风格支持全选才行)其它表示zero-based item index 枚举子窗口,找到CListCtrl控件后得到它的指针,再用CListCtrl::SetItemState方法,该成员函数的用法见MSDN。----------------------------------------------------------------------------------这个方法试了,不行。 我在b的程序里,能操作这个a程序中的地址吗?? 就是造型成指针也没用。 先写下面的函数: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.");}---------------------------------------------------------------------------------------另外,要自己多动手写程序,不要总想着要答案,这样是难以快速提高自己的。一点小小的建议。 上面的代码其实还有点小小的问题,留着你自己再完善一下,呵呵楼上frank朋友的代码你有没有认真研究过?!不用另给我分了,谢谢! 怎么样像UpdateWindow一样,直接把消息发到窗口过程? SetwindowsHookEx 参数问题! 在windows(不是wince下面),能否调用什么api来开出一片连续的物理内存呢? 完美国际 目前版本 1。8。3 的 封包采取的是什么种类的加密算法? ADO初始化的问题 请问怎样在程序中知道一个端口是否被占用 关于线程的通讯问题,我不想使用全局变量,分不够可以再加 如何把内存的位图存盘? 请问谁有列车时刻表的最新数据库,能发送一份给我么?可好? SOS!!!!!真正的高手一定要帮帮小弟!!!!! 主程序如何分成多个文档编译 窗口指针作DLL参数的问题
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)
item.state = LVIS_SELECTED;
----------------------------------是clistctrl 不是listbox, 不行!!
item.state = LVIS_SELECTED;
-------------------------------
不行。。
不过还是贴出完整代码,网上看到的: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;
}
iItem=-1表示全选(需要ListView风格支持全选才行)
其它表示zero-based item index
----------------------------------------------------------------------------------这个方法试了,不行。 我在b的程序里,能操作这个a程序中的地址吗?? 就是造型成指针也没用。
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.");
}
---------------------------------------------------------------------------------------
另外,要自己多动手写程序,不要总想着要答案,这样是难以快速提高自己的。一点小小的建议。
楼上frank朋友的代码你有没有认真研究过?!不用另给我分了,谢谢!