VC 枚举窗口及所有子窗口句柄、名称和类名并找出listview的内容

VC 枚举窗口及所有子窗口句柄、名称和类名并找出listview的内容

(2012-06-02 08:18:59)
标签:

it

分类: 软件_Software

#define WIN32_LEAN_AND_MEAN
#define _AFXDLL
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <afxwin.h>
#include <windows.h>
#include <commctrl.h>

int count;

FILE *fp = _wfopen(_T("D:/1.txt"),_T("w"));

void ShowListView(HWND listview)
{//显示SysListView32类的内容
 setlocale(LC_ALL,"chs");

 int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);//向listview发消息,返回item的个数

 printf("%d:ListView Item Count=%d\n",listview,count);//输出item的个数

 int i;

 LVITEM lvi, *_lvi;
 TCHAR item[512], subitem[512], ssubitem[512];
 TCHAR *_item, *_subitem, *_ssubitem;
 unsigned long pid;
 HANDLE process;

 GetWindowThreadProcessId(listview, &pid);//获得listview的线程句柄
 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=(TCHAR*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
        PAGE_READWRITE);
 _subitem=(TCHAR*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
        PAGE_READWRITE);
 _ssubitem=(TCHAR*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
        PAGE_READWRITE);

 lvi.cchTextMax=512;

 for(i=0; i<count; i++) {//枚举每一个item
  lvi.iSubItem=0;
  lvi.pszText=_item;
  WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);//发消息获得item分项1的text值

  lvi.iSubItem=1;
  lvi.pszText=_subitem;
  WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);//发消息获得item分项2的text值

  lvi.iSubItem=2;
  lvi.pszText=_ssubitem;
  WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);//发消息获得item分项3的text值

  ReadProcessMemory(process, _item, item, 512, NULL);
  ReadProcessMemory(process, _subitem, subitem, 512, NULL);
  ReadProcessMemory(process, _ssubitem, ssubitem, 512, NULL);
  if (!wcsicmp(item,L"GOLD"))//如果item的text是GOLD,表明是黄金价格,则输出
   wprintf(_T("%ws=%ws=%ws\n"), item, subitem, ssubitem);
 }
 
 //释放空间
 VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
 VirtualFreeEx(process, _item, 0, MEM_RELEASE);
 VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);
 VirtualFreeEx(process, _ssubitem, 0, MEM_RELEASE);
}

BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)  
{//枚举子窗口的回调函数
 setlocale(LC_ALL,"chs");
 count++;
 TCHAR lpWinTitle[256],lpClassName[256];  
 ::GetWindowTextW(hwnd,(LPWSTR)lpWinTitle,256-1); //获得窗口caption
 ::GetClassNameW(hwnd,(LPWSTR)lpClassName,256-1); //获得窗口类名
 if (wcsicmp((LPWSTR)lpWinTitle,L"")!=NULL && wcsicmp((LPWSTR)lpClassName,L"")!=NULL) //过滤掉没有名子和类名的窗口
 {
  fwprintf(fp,_T("\n"));
  for (int i=1;i<=count;i++) fprintf(fp," ");
  fwprintf(fp,_T("-0xX:'%ws':'%ws'"),hwnd,lpWinTitle,lpClassName);

  if(wcsicmp(lpClassName,L"SysListView32")==NULL)
   ShowListView(hwnd);
  
  EnumChildWindows(hwnd,EnumChildProc,0); //递归枚举子窗口
 }
 count--;
 return TRUE ; 
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam)
{//枚举窗口的回调函数
 setlocale(LC_ALL,"chs");
 count = 1;
 TCHAR lpWinTitle[256],lpClassName[256]; 
 ::GetWindowTextW(hwnd,lpWinTitle,256-1); //获得窗口caption
 ::GetClassNameW(hwnd,lpClassName,256-1); //获得窗口类名
 if (wcsicmp(lpWinTitle,L"")!=NULL && wcsicmp(lpClassName,L"")!=NULL) //过滤掉没有名子和类名的窗口
 {
  fwprintf(fp,_T("\n*-0xX:'%ws':'%ws'"),hwnd,lpWinTitle,lpClassName);
 
  EnumChildWindows(hwnd,EnumChildProc,0); //继续枚举子窗口,传递给回调函数该子窗口的句柄
 }
 return TRUE ;
}

int main()
{
 setlocale(LC_ALL,"chs");
 ::EnumWindows(EnumWindowsProc,0); //枚举桌面的窗口,每找到一个窗口,调用一次回调函数,传递给回调函数该窗口的句柄
 system("pause");
 return 0;
}

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值