A程序如何得到B程序里控件的内容?重酬300分!!!!! 我想得到别人的程序(好像是用VB写的)里的类似vc里的CListCtrl里的鼠标选中的内容.该如何办啊?用FindWindow的到指针后如何遍历他的各个控件啊?我用GetWindow()GetNextWindow()好像不行啊.有没有其他办法?thx!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 向其他程序的ListView控件发送LVM_GETITEMTEXThttp://www.vckbase.com/document/viewdoc/?id=1223 试试WindowFromPoint获取窗口句柄,得到它的类名,以后可用类名直接查找hwnd = WindowFromPoint( POINT Point ); #define WIN32_LEAN_AND_MEAN#include <stdio.h>#include <windows.h>#include <commctrl.h>#include <process.h>#include <tchar.h>class CExtListCtrl{public: CExtListCtrl(HWNDhwndSysListView32):m_hwndSysListView32(hwndSysListView32),m_hProcess(NULL) { DWORD pid; GetWindowThreadProcessId(hwndSysListView32, &pid); m_hProcess=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid); } ~CExtListCtrl() { CloseHandle(m_hProcess); } int GetItemCount() { return (int)SendMessage(m_hwndSysListView32, LVM_GETITEMCOUNT, 0,0); } const TCHAR* GetItemText(int row,int subitemindex) { HANDLE process = m_hProcess; LVITEM lvi, *_lviExt; char *cExtItemTextBuf; _lviExt=(LVITEM*)VirtualAllocEx(m_hProcess, NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE); cExtItemTextBuf=(char*)VirtualAllocEx(m_hProcess, NULL, 512,MEM_COMMIT, PAGE_READWRITE); lvi.cchTextMax=512; lvi.iSubItem=subitemindex; lvi.pszText=cExtItemTextBuf; WriteProcessMemory(process, _lviExt, &lvi, sizeof(LVITEM), NULL); SendMessage(m_hwndSysListView32, LVM_GETITEMTEXT, (WPARAM)row,(LPARAM)cExtItemTextBuf); ReadProcessMemory(m_hProcess, cExtItemTextBuf, item, 512, NULL); VirtualFreeEx(m_hProcess, _lviExt, 0, MEM_RELEASE); VirtualFreeEx(m_hProcess, cExtItemTextBuf, 0, MEM_RELEASE); return item; }private: HWND m_hwndSysListView32; HANDLE m_hProcess; char item[512];};int CExtListCtrl_test(void) { HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView"); HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL);CExtListCtrl mylist(listview); int count=mylist.GetItemCount(); int i; char item[512], subitem[512]; for(i=0; i<count; i++) { strcpy(item,mylist.GetItemText(i,0)); strcpy(subitem,mylist.GetItemText(i,1)); printf("%s - %s\n", item, subitem); } return 0;}int main(void) { CExtListCtrl_test(); system("pause"); return 0; HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView"); HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL); int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0); 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; for(i=0; i<count; 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); printf("%s - %s\n", item, subitem); } VirtualFreeEx(process, _lvi, 0, MEM_RELEASE); VirtualFreeEx(process, _item, 0, MEM_RELEASE); VirtualFreeEx(process, _subitem, 0, MEM_RELEASE); return 0;} 怎么样得到listview的指针或者句柄呢?怎么样遍历窗口里的各个控件呢?我用GetWindow()GetNextWindow()好像不行,可能是vb里和vc不一样. API函数应该没有影响的,检察一下代码吧 得到一个指针后应该如何判断他是不是listview呢?在vc下可以这样做:pTmp = DYNAMIC_DOWNCAST(CListCtrl, pChild) ; if(NULL != pTmp){ ........}但是如果他的程序是vb写的,怎么样判断得到的这个指针是不是listview的呢? 要使用FindWindow好像是这个函数。我记得我在VCkbase里看到了一个人写了一个木马。它可以找到当前系统里,打开的QQ登录的对话框,找到这个对话框的一个密码输入框,然后记录下这个输入框里输入的内容。 最好通过WriteProcessMemory,ReadProcessMemory来读写别的进程 FindWindow()FromWindowPoint()GetWindowText() 如何获取自定义控件的ID号 【散分】周末愉快! 请教自绘TABCONTROL CListView 的第一列作为行标识,怎样锁定第一列,并且凸起,变灰色,就好像普通软件的表格一样? 向LISTCONTROL中读取文件数据 大家在楼道里喜欢做什么? 关于CEdit的KeyDown事件 菜鸟求教:关于vc中"退出"的代码是什么 绝对的VC、COM新手,求ATL DLL字符串传输的例子,还请高手指教 怎样在WINDOWS98上配置APACHE? 为什么我设置的全局鼠标钩子只能截获当前进程的鼠标事件? 这样在VC中调用DX9向导
http://www.vckbase.com/document/viewdoc/?id=1223
#include <stdio.h>
#include <windows.h>
#include <commctrl.h>
#include <process.h>
#include <tchar.h>
class CExtListCtrl
{
public:
CExtListCtrl(HWND
hwndSysListView32):m_hwndSysListView32(hwndSysListView32),m_hProcess(N
ULL)
{
DWORD pid;
GetWindowThreadProcessId(hwndSysListView32, &pid);
m_hProcess=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_
VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
}
~CExtListCtrl()
{
CloseHandle(m_hProcess);
}
int GetItemCount()
{
return (int)SendMessage(m_hwndSysListView32, LVM_GETITEMCOUNT, 0,
0);
}
const TCHAR* GetItemText(int row,int subitemindex)
{
HANDLE process = m_hProcess;
LVITEM lvi, *_lviExt;
char *cExtItemTextBuf;
_lviExt=(LVITEM*)VirtualAllocEx(m_hProcess, NULL, sizeof(LVITEM),
MEM_COMMIT, PAGE_READWRITE);
cExtItemTextBuf=(char*)VirtualAllocEx(m_hProcess, NULL, 512,
MEM_COMMIT, PAGE_READWRITE);
lvi.cchTextMax=512;
lvi.iSubItem=subitemindex;
lvi.pszText=cExtItemTextBuf;
WriteProcessMemory(process, _lviExt, &lvi, sizeof(LVITEM), NULL);
SendMessage(m_hwndSysListView32, LVM_GETITEMTEXT, (WPARAM)row,
(LPARAM)cExtItemTextBuf);
ReadProcessMemory(m_hProcess, cExtItemTextBuf, item, 512, NULL);
VirtualFreeEx(m_hProcess, _lviExt, 0, MEM_RELEASE);
VirtualFreeEx(m_hProcess, cExtItemTextBuf, 0, MEM_RELEASE);
return item;
}
private:
HWND m_hwndSysListView32;
HANDLE m_hProcess;
char item[512];
};int CExtListCtrl_test(void) {
HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL);
CExtListCtrl mylist(listview);
int count=mylist.GetItemCount();
int i; char item[512], subitem[512]; for(i=0; i<count; i++) {
strcpy(item,mylist.GetItemText(i,0));
strcpy(subitem,mylist.GetItemText(i,1)); printf("%s - %s\n", item, subitem);
} return 0;
}
int main(void) {
CExtListCtrl_test();
system("pause");
return 0;
HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL); int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
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_W
RITE|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; for(i=0; i<count; 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); printf("%s - %s\n", item, subitem);
} VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
VirtualFreeEx(process, _subitem, 0, MEM_RELEASE); return 0;
}
怎么样遍历窗口里的各个控件呢?我用GetWindow()GetNextWindow()好像不行,可能是vb里和vc不一样.
在vc下可以这样做:
pTmp = DYNAMIC_DOWNCAST(CListCtrl, pChild) ;
if(NULL != pTmp)
{
........
}
但是如果他的程序是vb写的,怎么样判断得到的这个指针是不是listview的呢?
FromWindowPoint()
GetWindowText()