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

向其他程序的ListView控件發送LVM_GETITEMTEXT

編輯:關於VC++

一:問題的由來與解決方法:

首先給大家介紹一個我編寫的小程序——CallFI(Call FileInfo),他與2K/XP中的taskmgr.exe(Windows TaskManager)程序配合使用。他能獲取指定進程的路徑並依此調用FileInfo(文件類型分析工具)程序,這樣你就能更加全面得了解這個進程了。

當你選中一個進程並運行CallFI後,CallFI首先向taskmgr.exe中的ListView控件發送LVM_GETNEXTITEM消息來確定你所選定的是哪個index,然後再發送LVM_GETITEMTEXT消息獲取相應的值(PID),以便根據該PID進行後面的一系列操作。index很順利得就得到了,但當我直接向ListView控件發送LVM_GETITEMTEXT消息時卻無法得到我想要的返回值!這就是本文所要解決的問題。

在GOOGLE上我找到了Cory Nelson寫的《Stealing Program''s Memory》一文,問題的關鍵在於:利用WriteProcessMemory()函數將LVITEM結構插入到目標進程中……

作為演示,下面的這段程序將顯示在TaskManager中指定進程的進程名。

二:具體實踐:

//////////////////////////////////////////////////////////////////////////////////
/*
* Send_LGT
* 版權所有 (C) 2004 趙春生
* 2004.08.08
* 本程序適用於:Win2KP+SP4[Windows TaskManager(5.0.2195.6620)]
*        WinXP+SP1[Windows TaskManager]
* 代碼在Win2000P+SP4 + VC6+SP5測試通過
*/
#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;
char ItemBuf[512],*pItem;
DWORD PID;
HANDLE hProcess;
hwnd=FindWindow("#32770","Windows 任務管理器");
hwnd=FindWindowEx(hwnd,0,"#32770",0);
hwnd=FindWindowEx(hwnd,0,"SysListView32",0);
if (!hwnd)
MessageBox(NULL,"[Windows 任務管理器] 尚未啟動!","錯誤!",NULL);
else
{
iItem=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_SELECTED);
if (iItem==-1)
MessageBox(NULL,"沒有指定目標進程 !","錯誤!",NULL);
else
{
//itoa(iItem,temp,10);
//MessageBox(NULL,temp,"iItem",NULL);
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);
pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
if ((!plvitem)||(!pItem))
MessageBox(NULL,"無法分配內存!","錯誤!",NULL);
else
{
lvitem.cchTextMax=512;
//lvitem.iSubItem=1;//PID
lvitem.iSubItem=0; //ProcessName
lvitem.pszText=pItem;
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
MessageBox(NULL,ItemBuf,"ItemBuf",NULL);
}
}
}
}
//釋放內存
CloseHandle(hwnd);
CloseHandle(hProcess);
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////

三:測試環境

以上代碼在Win2000P+SP4 + VC6+SP5測試通過。

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