如何在64位系统上用sendmessage发送消息获得listview控件的item信息?

mariowjf 2007-04-16 01:30:25
我用一下方法来获得另一个进程中的listview控件的item文本,
Dim hProc, lpText, lpExText, lpItem, lpExItem As IntPtr
Dim nProcId As Integer = Process.GetProcessesByName(APP_NAME)(0).Id
hProc = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, nProcId)
' write string in external process's memory
Dim strText As String = " "
lpText = Marshal.StringToHGlobalAnsi(strText)
Dim nSizeText As Integer = strText.Length * Marshal.SizeOf("a"c)
lpExText = VirtualAllocEx(hProc, 0, nSizeText, MEM_COMMIT, PAGE_READWRITE)
Dim nResult As Integer '= WriteProcessMemory(hProc, lpExText, lpText, nSizeText, 0&)
' write LVITEM structure in external process's memory
Dim item As LVITEM
item.mask = LVIF_TEXT
item.iItem = nIndex
item.pszText = lpExText
item.cchTextMax = nSizeText
Dim nSizeItem As Integer = Marshal.SizeOf(item)
lpItem = Marshal.AllocHGlobal(nSizeItem)
Marshal.StructureToPtr(item, lpItem, True)
lpExItem = VirtualAllocEx(hProc, 0, nSizeItem, MEM_COMMIT, PAGE_READWRITE)
nResult = WriteProcessMemory(hProc, lpExItem, lpItem, nSizeItem, 0&)
' get list view item text
Dim nLength As Integer = SendMessage(hctrl, LVM_GETITEMTEXTA, nIndex, lpExItem)
' read the list view item text from external process's momery
nResult = ReadProcessMemory(hProc, lpExText, lpText, nSizeText, 0&)
strText = Marshal.PtrToStringAnsi(lpText)
' clean momery
nResult = VirtualFreeEx(hProc, lpExText, 0, MEM_RELEASE)
lpExText = IntPtr.Zero
nResult = VirtualFreeEx(hProc, lpExItem, 0, MEM_RELEASE)
lpExItem = IntPtr.Zero
Marshal.FreeHGlobal(lpText)
lpText = IntPtr.Zero
Marshal.FreeHGlobal(lpItem)
lpItem = IntPtr.Zero
CloseHandle(hProc)
hProc = IntPtr.Zero
Return strText

以上代码在32位系统上可以正常运行,但换到64位系统上就不行,sendmessage函数总是返回0,我试过用sendmessage发送LVM_GETITEMRECT消息在64位系统上是可以成功的,所以我觉得也许是字符串格式造成的问题,但我把LVM_GETITEMTEXTA改为LVM_GETITEMTEXTW还是不行,恳请哪位大虾指点迷津,最好说具体些,给分100,谢谢啊~~
...全文
578 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mariowjf 2008-08-21
  • 打赏
  • 举报
回复
具体是应该怎么处理?应该注意什么方面?谢谢
北京的雾霾天 2007-04-17
  • 打赏
  • 举报
回复
在64位机上,你可能要正确的处理消息Message中的两个参数高低位的问题,如果处理的不正确就不会得到正确的结果,这就像从16位到32位一样.
Red_angelX 2007-04-17
  • 打赏
  • 举报
回复
不晓得。。。64bit下很多工具失效
public class MainActivity extends Activity { ListView list; LazyAdapter adapter; private static String HOST = "http://121.199.65.88/tpcms/"; String url = "http://121.199.65.88//tpcms/index.php?s=home/Index/goods/type/1/sort/price_asc/page/2"; LazyAdapter eshopListAdapter = null; ArrayList arraylist = new ArrayList(); Handler h = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); //获得数据 ArrayList list1=productInfo((String)msg.obj); showInfoImage(list1); } }; @Override public void onCreate(Bundle savedInstanceState) { System.out.println("sdjklajsdklfj"); super.onCreate(savedInstanceState); setContentView(R.layout.main); list=(ListView)findViewById(R.id.list); new Thread() { @Override public void run() { super.run(); String str = new GetDataFromJson(MainActivity.this).getData(url); Message m = new Message(); m.obj = str; h.sendMessage(m); } }.start(); } /** * 显示商品图片 */ private void showInfoImage(final ArrayList arr) { eshopListAdapter = new LazyAdapter(this, arr) { @Override public View layoutView(ArrayList list, int position, View view) { View vi = view; if (view == null) //将布局做成一个view vi = LayoutInflater.from(MainActivity.this).inflate(R.layout.item3, null); //实例化控件 final ImageView iv = (ImageView) vi.findViewById(R.id.iv); final TextView text = (TextView) vi.findViewById(R.id.textview); final ProgressBar shopLoadBox = (ProgressBar) vi.findViewById(R.id.goods_load_box); vi.setTag(list.get(position));// 設計所有商店信息 imageLoader.DisplayImage(HOST+ arr.get(position).getImage(), iv); text.setText(arr.get(position).getTitle()); return vi; } }; list.setAdapter(eshopListAdapter); } /** * 封装商品信息 */ public ArrayList productInfo(String json) { try { JSONObject jsonObj = new JSONObject(json); int reponse = jsonObj.getInt("reponse"); String message = jsonObj.getString("messages"); String count = jsonObj.getString("count"); JSONArray arr = jsonObj.getJSONArray("goodslist"); for(int i=0;i

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧