在vc环境下。
已获得一TListView类的句柄,想把其某行(列)的内容读取出来,应当如何实现啊?若能读出某行列焦点的数据则更好。具体步骤如下:1) 获得句柄:HWND hwandTListView = FindWindowEx(hwndInboxList, NULL, "TListView", NULL);已成功;
2)获得hwandTListView 的长度,并读取某行(列):网上看了下代码,经过修改如下:
TListView ListView1 =(TListView)hwandTListView;//自己加的;error C2065: 'TListView' : undeclared identifier
int i;
For i:=0 to ListView1.Items.Count-1 Do
If ListView1.Items[i].Selected then //i=ListView1.Selected.index
begin
/读某行某列的操作:
Edit1.Text := listview1.Items[i].Caption; //读第i行第1列
Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列
Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列
//以次类推,可以用循环读出整列。
end;
//将焦点上移一行:
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移 问题如下:
查了下,TListView 是delphi的概念,但对delphi只是了解。在应用TListView 前应该导入一些头文件或类吧,具体应该是哪些啊?
或是可否转换成其他的List类型,然后再应用。现在只有这些思路,请高手指点,最好能写出关键代码,谢谢~把所有的分都拿出来了啊~~~~,在线等~~~~
已获得一TListView类的句柄,想把其某行(列)的内容读取出来,应当如何实现啊?若能读出某行列焦点的数据则更好。具体步骤如下:1) 获得句柄:HWND hwandTListView = FindWindowEx(hwndInboxList, NULL, "TListView", NULL);已成功;
2)获得hwandTListView 的长度,并读取某行(列):网上看了下代码,经过修改如下:
TListView ListView1 =(TListView)hwandTListView;//自己加的;error C2065: 'TListView' : undeclared identifier
int i;
For i:=0 to ListView1.Items.Count-1 Do
If ListView1.Items[i].Selected then //i=ListView1.Selected.index
begin
/读某行某列的操作:
Edit1.Text := listview1.Items[i].Caption; //读第i行第1列
Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列
Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列
//以次类推,可以用循环读出整列。
end;
//将焦点上移一行:
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移 问题如下:
查了下,TListView 是delphi的概念,但对delphi只是了解。在应用TListView 前应该导入一些头文件或类吧,具体应该是哪些啊?
或是可否转换成其他的List类型,然后再应用。现在只有这些思路,请高手指点,最好能写出关键代码,谢谢~把所有的分都拿出来了啊~~~~,在线等~~~~
可以对句柄发送消息LVM_GETITEMTEXT 来获得
if(iItem != -1) //找到句柄
SendMessage(hwandTListView, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem); 是这样吗?此时plvitem得到的内容是什么?
可否给出具体的代码?
补充下:
主要想实现以下几步:
1)获得句柄:HWND hwandTListView = FindWindowEx(hwndInboxList, NULL, "TListView", NULL);已成功;
2)对应ListView表,自动选择某行(如第一行)
3)选中某行后,点击“阅读”按钮,可实现: ::SendMessage(hwndRead,BM_CLICK,0,0);
问题关键是第二步,网上查了下,有以下两中方法:方法1:(经测试不可行)
::SendMessage(hSelectBox,LB_SETCURSEL,i,0); //单选
::SendMessage(hSelectBox,LB_SETSEL,1,i); //多选 方法2:(原帖说是可行)
//自动选中第一行m_UserList.SetItemState( 0,LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
m_UserList.EnsureVisible( 0,FALSE); LVIS_FOCUSED);
方法2中,m_UserList应该为CListCtrl类实例,但这个实例如何与句柄hwandTListView 关联起来?
若能解决了这步,基本就解决了,望高手帮助~方法2原帖具体见:
http://topic.csdn.net/u/20091117/10/e9714ead-d9ec-4698-a489-d1a603db8201.html
你可以用FromHandle 从句柄来获取 CListCtrl*static CWnd* PASCAL FromHandle(
HWND hWnd
);
CListCtrl 是CWnd的继承类,做一下向下类型转换ok
LVITEM lvitem, *plvitem;
NMHDR nmhdr,*pnmhdr; HANDLE hProcess;
DWORD PID;
WPARAM ListViewID = GetWindowLong(hwandTListView,GWL_ID); // 获取窗口PID、打开进程
GetWindowThreadProcessId(hwandTListView, &PID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
if (!hProcess)
{
return;
}
else
{
DWORD dwOldProtect;
/***************************单击*********************************************/
// 申请内存空间
plvitem = (LVITEM*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
lvitem.state=LVIS_SELECTED|LVIS_FOCUSED|LVIS_ACTIVATING;
lvitem.stateMask=LVIS_SELECTED;
//设置进程属性,并写进程
VirtualProtectEx(hProcess, plvitem, sizeof(LVITEM), PAGE_READWRITE,&dwOldProtect);
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM),NULL);
//发送消息
::SendMessage(hwandTListView,LVM_SETITEMSTATE,(WPARAM)0,(LPARAM)plvitem);
/***************************双击*********************************************/
// 申请内存空间,双击
pnmhdr = (NMHDR*)VirtualAllocEx(hProcess,NULL,sizeof(NMHDR),MEM_COMMIT,PAGE_READWRITE);
nmhdr.code = NM_DBLCLK;
nmhdr.hwndFrom = hwandTListView;
nmhdr.idFrom = ListViewID;
//设置进程属性,并写进程
VirtualProtectEx(hProcess, pnmhdr, sizeof(NMHDR), PAGE_READWRITE,&dwOldProtect);
WriteProcessMemory(hProcess, pnmhdr, &nmhdr, sizeof(NMHDR), NULL); //发送消息
::PostMessage(::GetParent(hwandTListView),WM_NOTIFY,(WPARAM)ListViewID,(LPARAM)pnmhdr);
/******************************************************************************/
// 释放内存空间
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
注,调试双击时我把单击部分全部屏蔽了还是不行