BOOL LoadDesktopViewFuckItems(void)
{
HWND   hDeskTop;   
hDeskTop = ::FindWindow("progman",NULL);   
hDeskTop = ::FindWindowEx(hDeskTop,0,"shelldll_defview",NULL);   
hDeskTop = ::FindWindowEx(hDeskTop,0,"syslistview32",NULL);    int TotalNum = ListView_GetItemCount( hDeskTop );
int iNumSt = 5; DWORD dwProcessId;
GetWindowThreadProcessId(hDeskTop,&dwProcessId);  /* 取explorer.exe句柄. */   HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);  
if(hProcess != NULL)
{
char acBuffer[MAX_PATH] = {0};
for(int i = 0; i < TotalNum; i ++)
{
memset(acBuffer, 0, sizeof(acBuffer));
ListView_GetItemText(hDeskTop,i,0,acBuffer,MAX_PATH - 2);
}
CloseHandle(hProcess);  
} return TRUE;
}

解决方案 »

  1.   

    是这样的吧,不能获取其它进程的填到自己进程的内存块里;可以通过 VirtualAllocEx() 在对方进程里分配块内存,用来存放获取的内容,然后 ReadProcessMemory() 再从那里复制到自己进程里来。
    网上有很多示例的,如 http://bbs.csdn.net/topics/360118263
      

  2.   

    BOOL LoadDesktopViewFuckItems(void)
    {
    CoInitialize(NULL);
    InitCommonControls();
    HWND   hDeskTop;   
    hDeskTop = ::FindWindow("progman",NULL);   
    hDeskTop = ::FindWindowEx(hDeskTop,0,"shelldll_defview",NULL);   
    hDeskTop = ::FindWindowEx(hDeskTop,0,"syslistview32",NULL);    int TotalNum = ListView_GetItemCount( hDeskTop );
    int iNumSt = 5;
    DWORD   dwProcessId;    GetWindowThreadProcessId(hDeskTop,&dwProcessId);  /* 取explorer.exe句柄. */  
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);   char acBuffer[MAX_PATH] = {0};
    LVITEM* pkLvitem = (LVITEM*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE); SIZE_T kSize;
    for(int i = 0 ; i < TotalNum ; ++i)
    {
    _TCHAR *pkAcBuffer =  (_TCHAR *)VirtualAllocEx(hProcess,NULL,sizeof(_TCHAR)*512,MEM_COMMIT,PAGE_READWRITE);
    LVITEM _macro_lvi;
    ::memset(&_macro_lvi,0,sizeof(LVITEM));
    _macro_lvi.iItem = i;
    _macro_lvi.iSubItem = 1;
    _macro_lvi.cchTextMax = sizeof(_TCHAR)*512;
    _macro_lvi.pszText = (pkAcBuffer); DWORD dwWriteBytes = 0;
    ::WriteProcessMemory(hProcess,pkLvitem,&_macro_lvi,sizeof(LVITEM),&dwWriteBytes);
    ::SendMessage((hDeskTop), LVM_GETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)pkLvitem); ::memset(acBuffer,0,sizeof(acBuffer));
    ReadProcessMemory(hProcess,pkAcBuffer,acBuffer,256,&kSize); int iValue = 100;
    iValue += 100;
    ::VirtualFreeEx(hProcess,pkAcBuffer,0,MEM_RELEASE);
    } ::VirtualFreeEx(hProcess,pkLvitem,0,MEM_RELEASE); CloseHandle(hProcess);  
    CoUninitialize();
    return TRUE;
    }//我更改了代码发现还是无法读取里面的内容
      

  3.   

    #include <Windows.h>
    #include <objbase.h>
    #include <shlwapi.h>
    #include <shlobj.h>
    #include <shellapi.h>
    #include <stdint.h>
    #include <set>
    #pragma comment(lib, "uuid.lib")
    #pragma comment(lib, "ole32.lib")
    #pragma comment(lib, "shell32.lib")
    #pragma comment(lib, "shlwapi.lib")#include <Commctrl.h>
    #pragma comment(lib,"Comctl32.lib")
    #include <commoncontrols.h>#include <assert.h>void LoadFuckSmaple(void)
    {
    HWND hwnd;
    int iItem=0;
    char ItemBuf[512];
    DWORD PID;
    HANDLE hProcess = NULL;
    LVITEM lvitem = {0}; 
    LVITEM *plvitem = NULL; hwnd=::FindWindow("#32770","Windows 任务管理器");
    hwnd=::FindWindowEx(hwnd,0,"#32770",0);
    hwnd=::FindWindowEx(hwnd,0,"SysListView32",0);
    char *pItem = NULL; iItem = ListView_GetItemCount(hwnd); if (!hwnd)
    {
    ::MessageBox(NULL,"[Windows 任务管理器] 尚未启动!","错误!",NULL);
    return;
    } GetWindowThreadProcessId(hwnd, &PID); hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if (hProcess != NULL)
    {
    plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
    pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
    if (plvitem && pItem)
    {
    for(int i=0;i<iItem;i++)
    {
    lvitem.cchTextMax=512;
    lvitem.iSubItem=1; //这个其实是项id
    lvitem.pszText=pItem;
    WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
    ::SendMessage(hwnd, LVM_GETITEMTEXT, i, (LPARAM)plvitem);
    ReadProcessMemory(hProcess, pItem, ItemBuf,256, NULL);
    }
    }
    } //释放内存
    CloseHandle(hProcess);
    VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
    VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
    }int _tmain(int argc, _TCHAR* argv[])
    {
    LoadFuckSmaple();
    return 0;
    }
    还是木有办法读取这个是网上的,听说已经读取了,是不是和我的系统有关,WINDOWS7
      

  4.   

    非管理员级的不同用户间的进程,这个代码也是不行的,CreateProcess() 会被拒绝,因为没有 debug 权限;通常只有管理员的才可以获取其他用户的进程的内容。你 3# 的这个代码,xp 下是不行的吧,win7 应该可以的;因为默认地,vc 好像将 PROCESS_ALL_ACCESS 整成了 0x1FFFFF,但对 xp 来说,这个值得是 0x1F0FFF 。
      

  5.   

    #include <windows.h>
    #include <commctrl.h>
    #pragma comment(lib, "comctl32")
    #include <stdio.h>
    #include <string>
    #include <sstream>
    #include <iostream>
    #include <stddef.h>
    #include <stdlib.h>
    #include <cstdlib>
    #include <cstddef>
    using namespace std;
    HWND hwnd0,hwnd1,hwnd2,hwnd3;
    int total;
    int a=0;
    int b=0;
    TCHAR* ClassName = TEXT("MyWindow");
    TCHAR* TitleName = TEXT("任务管理器测试");
    CHAR szText[100] = TEXT("总任务数:");LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine,int nCmdShow)
    {    HWND hwnd;
        MSG msg;
        WNDCLASS wndclass;
        wndclass.hbrBackground =(HBRUSH)COLOR_WINDOW;    //窗口背景
        wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);        //鼠标
        wndclass.hIcon = LoadIcon(NULL,IDI_QUESTION);    //图标
        wndclass.lpszClassName = ClassName;
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;    wndclass.lpszMenuName = NULL;
        wndclass.style = CS_HREDRAW | CS_VREDRAW;    //窗口风格
        wndclass.lpfnWndProc = WndProc;
        wndclass.hInstance = hInstance;    if( !RegisterClass(&wndclass) )
            return 0;
        hwnd = CreateWindow(
                    ClassName, // 窗口类名
                    TitleName, //窗口标题
                    WS_OVERLAPPEDWINDOW,    //窗口风格
                    CW_USEDEFAULT,            //初始的x坐标
                    CW_USEDEFAULT,
                    400,            //初始的宽度
                    600,
                    NULL,
                    NULL,
                    hInstance,
                    NULL
                    );
        //窗口居中
        RECT rect;
        int xLeft,yTop;
        GetWindowRect(hwnd,&rect);
    xLeft = (GetSystemMetrics(SM_CXFULLSCREEN)-(rect.right-rect.left))/2;
    yTop = (GetSystemMetrics(SM_CYFULLSCREEN)-(rect.bottom-rect.top))/2;
        SetWindowPos(hwnd, HWND_TOPMOST, xLeft,yTop,-1,-1, SWP_NOSIZE | SWP_NOZORDER);
        ShowWindow( hwnd,nCmdShow );
        UpdateWindow( hwnd );
        while( GetMessage(&msg,NULL,0,0) )
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }        return msg.wParam;
    }DWORD WINAPI PBThreadProc( LPVOID lpParameter )
    {    HWND hwndPB = (HWND) lpParameter;    //进度条的窗口句柄
        PBRANGE range;                        //进度条的范围
        hwnd1 = FindWindowEx(0,0,"#32770","Windows 任务管理器");
        hwnd2 = FindWindowEx(hwnd1,NULL,"#32770","Processes");
        hwnd3 = FindWindowEx(hwnd2,NULL,"SysListView32","进程");
        /*
        hwnd0 = FindWindowEx(0,0,"AfxMDIFrame42s","");
        hwnd1 = FindWindowEx(hwnd0,NULL,"#32770","");
        hwnd2 = FindWindowEx(hwnd1,NULL,"#32770","");
        hwnd3 = FindWindowEx(hwnd2,NULL,"SysListView32","List1");
        */
        if(!hwnd3)
        {
            HWND hwnd_box = FindWindowEx(0,0,ClassName,TitleName);
            MessageBox(hwnd_box,"程序未启动!","友情提示",MB_ICONEXCLAMATION);
        }    //获取总条数
        total = SendMessage(hwnd3, LVM_GETITEMCOUNT, 0, 0);    SendMessage( hwndPB, PBM_SETRANGE ,
            (WPARAM)0, (LPARAM)(MAKELPARAM(0,total)) );//设置进度条的范围    SendMessage( hwndPB, PBM_GETRANGE,
            (WPARAM)TRUE,
            (LPARAM)&range );
        while(TRUE)
        {
            SendMessage( hwndPB, PBM_DELTAPOS, //设置进度条的新位置为当前位置加上范围的1/20
                (WPARAM)1, (LPARAM)0 );//((range.iHigh-range.iLow)/20)
            if( SendMessage( hwndPB, PBM_GETPOS, (WPARAM)0, (LPARAM)0 ) //取得进度条当前位置
                    == range.iHigh )
            {
                break;
            }    }
        //int number = ListView_GetItemCount(hwnd3);
    }DWORD WINAPI BeingCount()
    {}LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
    {
        HDC hdc;
        PAINTSTRUCT ps;
        HFONT hFont;
        static HWND hwndPB;
        switch( message )
        {    case WM_CREATE:
            {
                InitCommonControls(); //确保已注册了进度条类PROGRESS_CLASS
                hwndPB = CreateWindowEx(
                    0,
                    PROGRESS_CLASS,
                    NULL,
                    WS_CHILD | WS_VISIBLE,
                    0,0,0,0,            //位置和大小在WM_SIZE中设置
                    hwnd,
                    (HMENU)0,
                    ((LPCREATESTRUCT)lParam)->hInstance,
                    NULL);
                CreateThread(            //操作进度条的线程
                    NULL,
                    0,
                    (LPTHREAD_START_ROUTINE)PBThreadProc,
                    hwndPB,
                    0,
                    0
                    );
                CreateThread(            //循环对比线程
                    NULL,
                    0,
                    (LPTHREAD_START_ROUTINE)BeingCount,
                    hwndPB,
                    0,
                    0
                    );
                return 0;
            }    case WM_SIZE:
            {
                RECT rc;
                GetClientRect(hwnd, &rc);
                MoveWindow(
                    hwndPB,
                    10,//rc.left 距离左边距
                    35,//(rc.bottom - rc.top )/9 距离上边距
                    (rc.right - rc.left)-20,// 进度条长度
                    25,//(rc.bottom - rc.top )/12  进度条高度
                    TRUE
                    );
                return 0;
            }
            case WM_PAINT:
            {
                CHAR hint[10];
                //开始绘图并返回环境句柄
                hdc = BeginPaint (hwnd, &ps);
                hFont=CreateFont(20,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,TEXT("微软雅黑"));
                SetBkMode(hdc,TRANSPARENT);//字体背景不变
                (HFONT)SelectObject(hdc,hFont);
                TextOut(hdc, 10, 10, szText, lstrlen(szText));
                TextOut(hdc, 80, 10, _itoa(total,hint,10), lstrlen(_itoa(total,hint,10)));
                CHAR h[50] = TEXT("SYSTEM :");
                TextOut(hdc, 10, 70, h, lstrlen(h));
                CHAR h1[50] = TEXT("w_zhanghf :");
                TextOut(hdc, 10, 95, h1, lstrlen(h1));            //if...else if...else
                TCHAR szBuf[1024];
                int i=0;
                CHAR hint1[100] = TEXT("总任务数:");
                CHAR system[100] = TEXT("SYSTEM");
                DWORD PID ;
                int iItem=0;
                LV_ITEM lvitem, *plvitem;
                char itemText[512],*pItem;
                DWORD dword = GetWindowThreadProcessId(hwnd,&PID);
                HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);            if(hProcess != NULL)
                {
                    for(i=0; i < total; i++)
                    {                      lvitem.iItem = i;
                          lvitem.iSubItem = 1;
                          lvitem.pszText = szBuf;
                          lvitem.cchTextMax = 1024;
                          if(hwnd3 != NULL)
                          {
                              ListView_GetItem(hwnd3,&lvitem);
                          }else
                          {
                              HWND hwnd_box = FindWindowEx(0,0,ClassName,TitleName);
                              MessageBox(hwnd_box,"无法获取目标程序句柄!","友情提示",MB_ICONEXCLAMATION);
                          }
                          string str = szBuf;
                          printf("%s",szBuf);
                          /**
                          memset(itemText, 0, sizeof(itemText));
                          ListView_GetItemText(hwnd3,i,1,itemText,1024);
                          //string str = itemText;
                          printf("%s\n",itemText);
                          **/                      //char比较是否相等
                          if (strcmp(szBuf,system)==0)
                          {
                             b+=1;
                          }
                          //判断char字符串是否包含
                          if (strstr(szText,hint1) != NULL)
                          {
                             a+=1;
                          }
                      }
                CloseHandle(hProcess);
                }            /**
                if(!hProcess)
                {
                   HWND hwnd_box = FindWindowEx(0,0,ClassName,TitleName);
                   MessageBox(hwnd_box,"操作失败!","友情提示",MB_ICONEXCLAMATION);
                }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))
                   {
                        HWND hwnd_box = FindWindowEx(0,0,ClassName,TitleName);
                        MessageBox(hwnd_box,"无法分配内存!","友情提示",MB_ICONEXCLAMATION);
                   }else{
                        lvitem.cchTextMax=512;
                        lvitem.iItem=1;
                        //lvitem.iSubItem=1;//PID
                        lvitem.iSubItem=1; //ProcessName
                        lvitem.pszText=pItem;
                        WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
                        //SendMessage(hwnd3, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
                        ListView_GetItem(hwnd3,&lvitem);
                        ReadProcessMemory(hProcess, pItem, itemText, 512, NULL);
                        MessageBox(NULL,itemText,"itemText",NULL);
                   }
                    //释放内存
                    CloseHandle(hwnd3);
                    CloseHandle(hProcess);
                    VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
                    VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
                }
                **/
                TextOut(hdc, 82, 70,_itoa(b,hint,10), lstrlen(_itoa(b,hint,10)));
                TextOut(hdc, 102, 95,_itoa(a,hint,10), lstrlen(_itoa(a,hint,10)));
                EndPaint (hwnd, &ps) ;
                return 0 ;
            }    case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
       }
        return DefWindowProc( hwnd,message,wParam,lParam );
    }
    麻烦问一下大神这段代码为什么获取不到SysListView32的item内容呢?
      

  6.   

    DWORD PID ;
                int iItem=0;
                LV_ITEM lvitem, *plvitem;
                char itemText[512],*pItem;
                DWORD dword = GetWindowThreadProcessId(hwnd,&PID);
                HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
     
                if(hProcess != NULL)
                {
                    for(i=0; i < total; i++)
                    {
     
                          lvitem.iItem = i;
                          lvitem.iSubItem = 1;
                          lvitem.pszText = szBuf;
                          lvitem.cchTextMax = 1024;
                          if(hwnd3 != NULL)
                          {
                              ListView_GetItem(hwnd3,&lvitem);
                          }else
                          {
                              HWND hwnd_box = FindWindowEx(0,0,ClassName,TitleName);
                              MessageBox(hwnd_box,"无法获取目标程序句柄!","友情提示",MB_ICONEXCLAMATION);
                          }
                          string str = szBuf;
                          printf("%s",szBuf);
                          /**
                          memset(itemText, 0, sizeof(itemText));
                          ListView_GetItemText(hwnd3,i,1,itemText,1024);
                          //string str = itemText;
                          printf("%s\n",itemText);
                          **/
     
                          //char比较是否相等
                          if (strcmp(szBuf,system)==0)
                          {
                             b+=1;
                          }
                          //判断char字符串是否包含
                          if (strstr(szText,hint1) != NULL)
                          {
                             a+=1;
                          }
                      }
                CloseHandle(hProcess);
                }
    为什么获取不到内容呢?
      

  7.   

    DWORD PID ;
                int iItem=0;
                LV_ITEM lvitem, *plvitem;
                char itemText[512],*pItem;
                DWORD dword = GetWindowThreadProcessId(hwnd,&PID);
                HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
     
                if(hProcess != NULL)
                {
                    for(i=0; i < total; i++)
                    {
     
                          lvitem.iItem = i;
                          lvitem.iSubItem = 1;
                          lvitem.pszText = szBuf;
                          lvitem.cchTextMax = 1024;
                          if(hwnd3 != NULL)
                          {
                              ListView_GetItem(hwnd3,&lvitem);
                          }else
                          {
                              HWND hwnd_box = FindWindowEx(0,0,ClassName,TitleName);
                              MessageBox(hwnd_box,"无法获取目标程序句柄!","友情提示",MB_ICONEXCLAMATION);
                          }
                          string str = szBuf;
                          printf("%s",szBuf);
                          /**
                          memset(itemText, 0, sizeof(itemText));
                          ListView_GetItemText(hwnd3,i,1,itemText,1024);
                          //string str = itemText;
                          printf("%s\n",itemText);
                          **/
     
                          //char比较是否相等
                          if (strcmp(szBuf,system)==0)
                          {
                             b+=1;
                          }
                          //判断char字符串是否包含
                          if (strstr(szText,hint1) != NULL)
                          {
                             a+=1;
                          }
                      }
                CloseHandle(hProcess);
                }
    为什么获取不到内容呢?
      

  8.   

    你这好像是想直接从其它进程的 LV控件里读取啊,当然不行了,上面已经解释过的。
    可以参考上面也提及的下面的这个帖子里的具体的操作方法;网上搜索下也行,有不少这方面内容的。
    http://bbs.csdn.net/topics/360118263