如何读取其他程序Listbox 里面的内容 现在一个程序,想得到另一个程序界面中listbox中的某一行的字符串实验了很多次次没有成功,敢问有做过的给讲解一下,失败方法: 知道listbox句柄直接发消息LB_GETTEXT失败,LB_GETCOUNT,和LB_GETTEXTLEN都可以得到值, 但是就是LB_GETTEXT得不到字符串;敢问做过的朋友是怎么做的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要写入远程进程的,提供一段代码给你,以下是远程获取远程进程clistctrl的每一项的文字的,listbox一样:CWnd *pHack = CWnd::FromHandle(hwnd); CListCtrl *listHack = (CListCtrl *)pHack; POSITION pos = listHack->GetFirstSelectedItemPosition(); int iItem = listHack->GetNextSelectedItem(pos); //房间索引号 if (iItem != oldItem) //如果房间索引号变了,则重新获取新的房间名,并重新获取新的房间项区域 { oldItem = iItem; //重置原房间索引 RECT *lpRect; LVITEM lvitem, *plvitem; char ItemBuf[512],*pItem; DWORD PID; HANDLE hProcess; GetWindowThreadProcessId(hwnd, &PID); hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID); if (!hProcess) { //获取进程句柄操作失败 } else { plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE); pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE); if ((!plvitem)||(!pItem)) { //无法分配内存 } else //获取房间名 { lvitem.cchTextMax=512; lvitem.iSubItem=0; //ProcessName lvitem.pszText=pItem; WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL); ::SendMessage(hwnd,LVM_GETITEMTEXT, (WPARAM)iItem,(LPARAM)plvitem); ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL); } CloseHandle(hProcess); VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE); VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);} 主要是这一段:lvitem.cchTextMax=512; lvitem.iSubItem=0; //ProcessName lvitem.pszText=pItem; WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL); ::SendMessage(hwnd,LVM_GETITEMTEXT, (WPARAM)iItem,(LPARAM)plvitem); ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL); HWND hWnd = ::FindWindow(NULL, _T("X")); if(hWnd) { HWND hListBox = ::FindWindowEx(hWnd, NULL, _T("ListBox"), NULL); if(hListBox) { LRESULT lRet = ::SendMessage(hListBox, LB_GETCOUNT, 0, 0); if(LB_ERR != lRet) { TCHAR szText[512] = {0}; for(int i=0; i<lRet; i++) { ::SendMessage(hListBox, LB_GETTEXT, i, (LPARAM)szText); AfxMessageBox(szText); } } } } 是啊,是非模态对话框,我没有说模态对话框啊,extern "C" __declspec (dllexport) void ShowDlg(){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1); dlg.ShowWindow(SW_NORMAL); MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }} 两个程序间这样发消息,最后一个消息得不到的,这就是我说的失败的原因!至少我在CE系统上没有得到!我来试试二楼的!Tank you still @ 不行啊,listbox和listview是不一样的,使用代码不行呀,修改了也有问题WriteProcessMemory两个写后的内存值不一样 文件传输问题 vc问题 -=[求救]=- JavaScript调用COM对象莫明出错。迷茫中。 想问一问一些软件工程常用词汇的具体涵义。 程序关闭时出现这个错误:Damage: after client block (#43) at 0x00781d90一般是什么原因? 请问,怎么添加UINT _ListenTcpThread(LPVOID lparam)到Globals文件夹下? gif 动画图片 什么是GPIB卡,主要用途是什么? sift提取特征值,, VC 单文档界面中怎么通过调用DLL嵌入一个对话框 哪里可以下载skinBuilder? 关于编码的疑问
CListCtrl *listHack = (CListCtrl *)pHack; POSITION pos = listHack->GetFirstSelectedItemPosition();
int iItem = listHack->GetNextSelectedItem(pos); //房间索引号 if (iItem != oldItem) //如果房间索引号变了,则重新获取新的房间名,并重新获取新的房间项区域
{
oldItem = iItem; //重置原房间索引 RECT *lpRect;
LVITEM lvitem, *plvitem;
char ItemBuf[512],*pItem;
DWORD PID;
HANDLE hProcess; GetWindowThreadProcessId(hwnd, &PID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
if (!hProcess)
{
//获取进程句柄操作失败
}
else
{
plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE); if ((!plvitem)||(!pItem))
{
//无法分配内存
}
else //获取房间名
{
lvitem.cchTextMax=512;
lvitem.iSubItem=0; //ProcessName
lvitem.pszText=pItem;
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
::SendMessage(hwnd,LVM_GETITEMTEXT, (WPARAM)iItem,(LPARAM)plvitem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
}
CloseHandle(hProcess);
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
}
lvitem.iSubItem=0; //ProcessName
lvitem.pszText=pItem;
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
::SendMessage(hwnd,LVM_GETITEMTEXT, (WPARAM)iItem,(LPARAM)plvitem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
HWND hWnd = ::FindWindow(NULL, _T("X"));
if(hWnd)
{
HWND hListBox = ::FindWindowEx(hWnd, NULL, _T("ListBox"), NULL);
if(hListBox)
{
LRESULT lRet = ::SendMessage(hListBox, LB_GETCOUNT, 0, 0);
if(LB_ERR != lRet)
{
TCHAR szText[512] = {0};
for(int i=0; i<lRet; i++)
{
::SendMessage(hListBox, LB_GETTEXT, i, (LPARAM)szText);
AfxMessageBox(szText);
}
}
}
}
extern "C" __declspec (dllexport) void ShowDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(SW_NORMAL); MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
至少我在CE系统上没有得到!
我来试试二楼的!
Tank you still @