systreeview32选中_读取sysTreeview32和SysListView32

这篇博客介绍了如何通过Windows API遍历并找到SysTreeView32和SysListView32控件,读取其选中项的文本内容。通过FindWindowEx函数定位窗口,然后使用SendMessage和ReadProcessMemory来获取和操作控件中的数据。示例代码分别展示了如何获取ListView的项目和TreeView的选定节点,并在发现特定文本时进行展开操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

#include

int main(void)

{

/* Run through the windows until we find our listview. */

HWND hwnd = NULL;

int count, i;

char item[512] = {0}, subitem[512] = {0};

LVITEM lvi, *_lvi;

char *_item, *_subitem;

DWORD pid;

HANDLE process;

hwnd = FindWindowEx(hwnd, NULL, TEXT("CabinetWClass"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("SHELLDLL_DefView"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("DUIViewWndClassName"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("DirectUIHWND"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("CtrlNotifySink"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("SysListView32"), NULL);

count=(int)SendMessage(hwnd, LVM_GETITEMCOUNT, 0, 0);

GetWindowThreadProcessId(hwnd, &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

lvi.iSubItem=0;

lvi.pszText=_item;

WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);

SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

lvi.iSubItem=1;

lvi.pszText=_subitem;

WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);

SendMessage(hwnd, 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;

}

//http://www.codeproject.com/Articles/5570/Stealing-Program-s-Memory

#include

#include

#include

#include

using namespace std;

int main()

{

HWND hwnd = NULL;

DWORD PID;

HANDLE process;

PVOID buffer;

const int bufferLength = 4000;

LPTVITEM item = (LPTVITEM)new BYTE[bufferLength];

CStringtext;

hwnd = FindWindowEx(hwnd, NULL, TEXT("CabinetWClass"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("BaseBar"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("ReBarWindow32"), NULL);

hwnd = FindWindowEx(hwnd, NULL, TEXT("SysTreeView32"), NULL);

if (hwnd == NULL)

{

return 0;

}

GetWindowThreadProcessId(hwnd, &PID);

process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

buffer = VirtualAllocEx(process,NULL,bufferLength,MEM_COMMIT,PAGE_READWRITE);

item->mask = TVIF_TEXT;

item->cchTextMax = 512;

item->pszText = LPTSTR((PBYTE)buffer+sizeof(TVITEM));

item->hItem = (HTREEITEM)SendMessage(hwnd,TVM_GETNEXTITEM,TVGN_ROOT,0);

while(item->hItem)

{

SendMessage(hwnd,TVM_SELECTITEM,TVGN_CARET,(long)item->hItem);

WriteProcessMemory(process,buffer,item,sizeof(TVITEM),NULL);

SendMessage(hwnd,TVM_GETITEM,0,(LPARAM)buffer);

ReadProcessMemory(process,buffer,item,bufferLength,NULL);

text = (LPTSTR)((PBYTE)item+sizeof(TVITEM));

if( -1 != text.Find("Download"))

{

SendMessage(hwnd,TVM_EXPAND,TVE_EXPAND,(long)item->hItem);

SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)item->hItem);

cout << (LPSTR)(LPCTSTR)text << endl;

break;

}

item->hItem = (HTREEITEM)SendMessage(hwnd,TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,(long)item->hItem);

}

VirtualFreeEx(process, item, 0, MEM_RELEASE);

CloseHandle(process);

return 0;

}

//http://bbs.youkuaiyun.com/topics/391818883

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值