高分求解:获取外部程序MyList文本

dlx_gd727000 2008-11-04 05:21:46

有一个外部程序A中有2个MyLIst控件,一个数据不定时改变,一个没10秒更新一次,怎样合理取得这些数据写入一个文件,
后一个可用定时器,前一个在有变动的时候去读似乎更合理一些
问题一:用LVM_GETITEMCOUNT得不到行数,总是为0,

int nItemCount = ::SendMessage(hwnd, LVM_GETITEMCOUNT, 0 ,0);
更没办法用
SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
得到数据;
但最大最小化能起作用,估计LVM_GETITEMCOUNT消息被原窗口重载/拦截;
::SendMessage(hwnd, WM_SYSCOMMAND,SC_MINIMIZE ,0);
::SendMessage(hwnd, WM_SYSCOMMAND,SC_MAXIMIZE ,0);

问题二:在我的程序中用SendMessage得到数据会不会对程序A影响太大,速度会很慢;有没有办法直接在程序A读到这些数据;
分不够另外开贴再加分,请高手出手
如果有源码email给我也行
...全文
124 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlx_gd727000 2008-12-03
  • 打赏
  • 举报
回复
楼上的朋友:
有没有办法通过hook这个窗口的该组件的消息(更新消息)得到该组件的行列数据?
dlx_gd727000 2008-12-03
  • 打赏
  • 举报
回复
to 11楼的朋友:一个是我自己的程序,另外一个是商业程序,不是自己的程序,要用进程间通信也只能和自己注入的dll通信,现在的问题是抓住外部程序的数据,数据抓住了什么都好办了;
现在的问题是抓住外部程序的数据;


To 三楼jia_xiaoxin: 请将你的代码发给我改改试试看


有没有办法从程序文件中得到未知组件的原始定义?
dlx_gd727000 2008-11-30
  • 打赏
  • 举报
回复
To 三楼jia_xiaoxin和ccrun(老妖):
不管在自己的程序代码还是dll中,FindWindow()找到的A的窗体是正确的,可以从最大最小化这个MyLIst的反应中得证,得到的句柄和spy++查看的是一样的,但是在上述两个位置下面的代码结果都是0;
int nItemCount = ::SendMessage(hwnd, LVM_GETITEMCOUNT, 0 ,0);
所以用LVM_GETITEMCOUNT看来是行不通的;

lichengbin的“ Hook其他程序中的StringGrid的内容 ”中对已知组件有效,未知组件不知是否可行(比如不知道MyLIst的原始定义)


Gump_BlueSky 2008-11-30
  • 打赏
  • 举报
回复
就呆在云上 2008-11-30
  • 打赏
  • 举报
回复
两个程序通信应该可以用进程间通信来实现的
发送消息是一种实现方式
你再试试别的进程间通信的方式看看吧
dlx_gd727000 2008-11-11
  • 打赏
  • 举报
回复
参考ccrun(老妖)的几个帖子,在dll中用FindControl也不成功,
请高手指教!!!
dlx_gd727000 2008-11-10
  • 打赏
  • 举报
回复
网上下载的remotedll源码程序注入记事本成功,注入计算器程序失败;
改源码改成c++builder编译的话,注入所有的程序都弹出错误窗口,提示内存不能written 错误;
源码如下
BOOL RemoteFreeLibrary( DWORD dwProcessID, LPCSTR lpszDll )
{
// 打开目标进程
HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessID );
// 向目标进程地址空间写入DLL名称
DWORD dwSize, dwWritten;
dwSize = lstrlenA( lpszDll ) + 1;
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
if ( NULL == lpBuf )
{
CloseHandle( hProcess );
return FALSE;
}
if ( WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten ) )
{
// 要写入字节数与实际写入字节数不相等,仍属失败
if ( dwWritten != dwSize )
{
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hProcess );
return FALSE;
}
}
else
{
CloseHandle( hProcess );
return FALSE;
}
// 使目标进程调用GetModuleHandle,获得DLL在目标进程中的句柄
DWORD dwHandle, dwID;
LPVOID pFunc = GetModuleHandleA;
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );
// 等待GetModuleHandle运行完毕
//c++builder编译的程序在上一行运行后出错------------------------------------///////////////////

WaitForSingleObject( hThread, INFINITE );
// 获得GetModuleHandle的返回值
GetExitCodeThread( hThread, &dwHandle );
// 释放目标进程中申请的空间
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hThread );
// 使目标进程调用FreeLibrary,卸载DLL
pFunc = FreeLibrary;
hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)dwHandle, 0, &dwID );
// 等待FreeLibrary卸载完毕
WaitForSingleObject( hThread, INFINITE );
CloseHandle( hThread );
CloseHandle( hProcess );
return TRUE;
}

lzh9955 2008-11-09
  • 打赏
  • 举报
回复
期待中!!!
dlx_gd727000 2008-11-09
  • 打赏
  • 举报
回复
分不够再加
ccrun(老妖)有几个关于dll注入和FindControl的帖子,能给出关键代码吗?
请ccrun(老妖)指导
dlx_gd727000 2008-11-05
  • 打赏
  • 举报
回复
谢谢楼上各位,我就是按三楼的方法,只响应最大最小化消息,不响应
SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
"SysListView32"不是"MyLIst"
估计LVM_GETITEMCOUNT消息被原窗口重载/拦截;
帅得不敢出门 2008-11-04
  • 打赏
  • 举报
回复
除了最大最小化 其他的消息看看能不能响应
jia_xiaoxin 2008-11-04
  • 打赏
  • 举报
回复
从你的代码看,你使用FindWindow()找到的A的窗体是正确的,但是你的MyLIst控件的句柄使用FindWindowEx()查找到的我感觉不正确。
因为参数都设置对的话,下面这一句反回肯定不是0
int nItemCount = ::SendMessage(hwnd, LVM_GETITEMCOUNT, 0 ,0);

至于SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
这一句使用这样的方法是不行的,必须使用远程线程来取得MyLIst控件的内容。

下面是我实现的代码,已经调试通过,源代码需要的话,我可以给你发一分,但我觉的下面的已经足够了。
void CFindWindowDlg::findListCtrl() 
{
// TODO: Add extra validation here

CWnd * m_hWnd = FindWindow(NULL,"TestList");
HWND listview;
if(m_hWnd)
{
listview = FindWindowEx(m_hWnd->m_hWnd, NULL,"SysListView32",NULL);
if(listview == NULL)
return;
}
else
{
return;
}

int nItemCount=(int)::SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
CString m_Str;
m_Str.Format("%d", nItemCount);

int i;
LVITEM lvi, *_lvi;
char item[512], subitem[512];
char *_item, *_subitem;
unsigned long pid;
HANDLE process;

GetWindowThreadProcessId(listview, &pid);
process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
MEM_COMMIT, PAGE_READWRITE);
_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
PAGE_READWRITE);
_subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
PAGE_READWRITE);

lvi.cchTextMax=512;
m_list.DeleteAllItems();
for(i=0; i<nItemCount; i++) {
lvi.iSubItem=0;
lvi.pszText=_item;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

lvi.iSubItem=1;
lvi.pszText=_subitem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

ReadProcessMemory(process, _item, item, 512, NULL);
ReadProcessMemory(process, _subitem, subitem, 512, NULL);

m_list.InsertItem(i,item);
printf("%s - %s\n", item, subitem);
}

VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);


//m_hWnd->CloseWindow();

}
wudeshou82666 2008-11-04
  • 打赏
  • 举报
回复
考虑两个程序通信的多种方式吧
看看利用共享内存可不可以进行处理。
hhyttppd 2008-11-04
  • 打赏
  • 举报
回复
无法修改代码的程序?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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