如何读取其他程序Listbox 里面的内容

bingxuebage 2011-01-06 02:23:43
现在一个程序,想得到另一个程序界面中listbox中的某一行的字符串

实验了很多次次没有成功,敢问有做过的给讲解一下,

失败方法:

知道listbox句柄直接发消息LB_GETTEXT失败,LB_GETCOUNT,和LB_GETTEXTLEN都可以得到值,

但是就是LB_GETTEXT得不到字符串;

敢问做过的朋友是怎么做的?

...全文
254 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingxuebage 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tragicguy 的回复:]

主要是这一段:
C/C++ code

lvitem.cchTextMax=512;
lvitem.iSubItem=0; //ProcessName
lvitem.pszText=pItem;
Wri……
[/Quote]


不行啊,

listbox和listview是不一样的,使用代码不行呀,修改了也有问题

WriteProcessMemory两个写后的内存值不一样
bingxuebage 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 king_hhuang 的回复:]

两个进程间通信啊,有很多方法的啊
[/Quote]

so what~~
bingxuebage 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visualeleven 的回复:]

C/C++ code

HWND hWnd = ::FindWindow(NULL, _T("X"));
if(hWnd)
{
HWND hListBox = ::FindWindowEx(hWnd, NULL, _T("ListBox"), NULL);
if(hListBox)
{
LRESULT lR……
[/Quote]


两个程序间这样发消息,最后一个消息得不到的,这就是我说的失败的原因!
至少我在CE系统上没有得到!


我来试试二楼的!


Tank you still @
Eleven 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kingsollyu 的回复:]
不是的啊.不是模态的.这是dll中的ShowDlg函数

C/C++ code

extern "C" __declspec (dllexport) void ShowDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1);
d……
[/Quote]
是啊,是非模态对话框,我没有说模态对话框啊,
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);
}
}
Eleven 2011-01-06
  • 打赏
  • 举报
回复

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);
}
}
}
}
King_hhuang 2011-01-06
  • 打赏
  • 举报
回复
两个进程间通信啊,有很多方法的啊
大蓝头 2011-01-06
  • 打赏
  • 举报
回复
主要是这一段:

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);


大蓝头 2011-01-06
  • 打赏
  • 举报
回复
需要写入远程进程的,提供一段代码给你,以下是远程获取远程进程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);
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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