更改其它程序ListView控件中某个Item内容

转载自:http://www.vckbase.com/index.php/wv/1639

这次我将介绍如何更改其他程序ListView控件中某个Item的内容,关于类似的拙文我已经写了两篇,这是第三篇,本篇和第一篇《如何向其他程序的 ListView 控件发送 LVM_GETITEMTEXT 消息》类似,区别在于:

1.发送的消息不同:前者是读取pszText的内容——发送LVM_GETITEMTEXT;这次是设置pszText,应该发送LVM_SETITEMTEXT;

2.字 符串缓冲区的作用不同:前者pItem用来接收ITEMTEXT,我们可以通过ReadProcessMemory函数来读取其内容;而在本篇中 p_MyItemText则用来存放我们要设置的ITEMTEXT,并用WriteProcessMemory函数将其写入到目标程序中。

下面的这段程序将更改TaskManager中第6个项目中第1列的内容。

#include< windows.h >
#include< commctrl.h >

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
                     
{
    HWND hwnd;
    int iItem=0;
    LVITEM lvitem, *plvitem;
    DWORD PID;
    HANDLE hProcess;
    char *p_MyItemText;//目标程序中用来存放TEXT的地址

    //The pszText member is the pointer to a null-terminated
    //  string containing the new text; it can also be NULL.
    //以上信息是从API手册中获得的,故在本例中字符串长度不能>=12,
    //以确保字符串后有NULL。
    char str_MyItemText[12]={0};
    strcpy(str_MyItemText,"天津 赵春生");
    
    
    hwnd=FindWindow("#32770","Windows 任务管理器");
    hwnd=FindWindowEx(hwnd,0,"#32770",0);
    hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

    if (!hwnd)
        MessageBox(NULL,"[Windows 任务管理器] 尚未启动!","错误!",NULL);
    else
    {
        GetWindowThreadProcessId(hwnd, &PID);
            
        hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
        if (!hProcess)
            MessageBox(NULL,"获取进程句柄操作失败!","错误!",NULL);
        else
        {
            plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
            p_MyItemText=(char*)VirtualAllocEx(hProcess, NULL, 12, MEM_COMMIT, PAGE_READWRITE);

            if ((!plvitem)||(!p_MyItemText))
                MessageBox(NULL,"无法分配内存!","错误!",NULL);
            else
            {
                MessageBox(NULL,"本演示程序将更改TaskManager中第6个项目中第1列的内容。","提示",NULL);
                
                iItem=5;//5在这里是第六个(从零开始)
                lvitem.iSubItem=0;//同上
                lvitem.pszText=p_MyItemText;
                
                WriteProcessMemory(hProcess, p_MyItemText, &str_MyItemText, 12, NULL);
                WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
                //向目标程序发送LVM_SETITEMTEXT消息
                SendMessage(hwnd, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
            }
        }
    }
    
    //释放内存
    CloseHandle(hwnd);
    CloseHandle(hProcess);
    VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
    VirtualFreeEx(hProcess, p_MyItemText, 0, MEM_RELEASE);
    
    return 0;
}

 

posted @ 2014-02-11 13:49  GUOBBS  阅读(191)  评论(0)    收藏  举报