程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何更改其它程序ListView控件中某個Item的內容

如何更改其它程序ListView控件中某個Item的內容

編輯:關於VC++

一:程序說明

這次我將介紹如何更改其他程序ListView控件中某個Item的內容,關於類似的拙文我已經寫了兩篇,這是第三篇,本篇和第一篇《如何向其他程序的 ListView 控件發送 LVM_GETITEMTEXT 消息》類似,區別在於:

  1. 發送的消息不同:前者是讀取pszText的內容——發送LVM_GETITEMTEXT;這次是設置pszText,應該發送LVM_SETITEMTEXT;
  2. 字符串緩沖區的作用不同:前者pItem用來接收ITEMTEXT,我們可以通過ReadProcessMemory函數來讀取其內容;而在本篇中p_MyItemText則用來存放我們要設置的ITEMTEXT,並用WriteProcessMemory函數將其寫入到目標程序中。

作為演示,下面的這段程序將更改TaskManager中第6個項目中第1列的內容。程序運行後的效果圖:

二:具體實踐

//////////////////////////////////////////////////////////////////////////////////
/*
*  Send LVM_SETITEMTEXT
*  版權所有 (C) 2005 天津 趙春生
*  2005.10.28
*  http://timw.yeah.net
*  http://timw.126.com
*  本程序適用於:Win2KP+SP4[Windows TaskManager(5.0.2195.6620)]
*         WinXP+SP1[Windows TaskManager]
*  代碼在Win2000P+SP4 + VC6+SP6測試通過
*/
//////////////////////////////////////////////////////////////////////////////////
#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;
}

三、以上代碼在Win2000P+SP4 + VC6+SP6測試通過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved