




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、向其他程序的ListView控件發(fā)送LVM_GETITEMTEXT一:?jiǎn)栴}的由來與解決方法:首先給大家介紹一個(gè)我編寫的小程序CallFI(Call FileInfo),他與2K/XP中的taskmgr.exe(Windows TaskManager)程序配合使用。他能獲取指定進(jìn)程的路徑并依此調(diào)用FileInfo(文件類型分析工具)程序,這樣你就能更加全面得了解這個(gè)進(jìn)程了。當(dāng)你選中一個(gè)進(jìn)程并運(yùn)行CallFI后,CallFI首先向taskmgr.exe中的ListView控件發(fā)送LVM_GETNEXTITEM消息來確定你所選定的是哪個(gè)index,然后再發(fā)送LVM_GETITEMTEXT消息獲取相應(yīng)
2、的值(PID),以便根據(jù)該P(yáng)ID進(jìn)行后面的一系列操作。index很順利得就得到了,但當(dāng)我直接向ListView控件發(fā)送LVM_GETITEMTEXT消息時(shí)卻無法得到我想要的返回值!這就是本文所要解決的問題。在GOOGLE上我找到了Cory Nelson寫的Stealing Program's Memory一文,問題的關(guān)鍵在于:利用WriteProcessMemory()函數(shù)將LVITEM結(jié)構(gòu)插入到目標(biāo)進(jìn)程中二:具體實(shí)踐:#include<windows.h>#include<commctrl.h>int APIENTRY WinMain(HINSTANCE hI
3、nstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)HWND hwnd;int iItem=0;LVITEM lvitem, *plvitem;char ItemBuf512,*pItem;DWORD PID;HANDLE hProcess;hwnd=FindWindow("#32770","Windows 任務(wù)管理器");hwnd=FindWindowEx(hwnd,0,"#32770",0);hwnd=FindWindowEx(hwnd,0,"SysL
4、istView32",0);if (!hwnd)MessageBox(NULL,"Windows 任務(wù)管理器 尚未啟動(dòng)!","錯(cuò)誤!",NULL);elseiItem=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_SELECTED);if (iItem=-1)MessageBox(NULL,"沒有指定目標(biāo)進(jìn)程 !","錯(cuò)誤!",NULL);else/itoa(iItem,temp,10);/MessageBox(NULL,temp,"iItem",N
5、ULL);GetWindowThreadProcessId(hwnd, &PID);hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);if (!hProcess)MessageBox(NULL,"獲取進(jìn)程句柄操作失敗!","錯(cuò)誤!",NULL);elseplvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);pItem=(char*)VirtualAllocEx(hPr
6、ocess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);if (!plvitem)|(!pItem)MessageBox(NULL,"無法分配內(nèi)存!","錯(cuò)誤!",NULL);elselvitem.cchTextMax=512;/lvitem.iSubItem=1;/PIDlvitem.iSubItem=0; /ProcessNamelvitem.pszText=pItem;WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
7、SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);MessageBox(NULL,ItemBuf,"ItemBuf",NULL);/釋放內(nèi)存CloseHandle(hwnd);CloseHandle(hProcess);VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);VirtualFreeEx(hProcess, pItem, 0,
8、MEM_RELEASE);return 0;一:程序說明:這次我將介紹如何更改其他程序ListView控件中某個(gè)Item的內(nèi)容,關(guān)于類似的拙文我已經(jīng)寫了兩篇,這是第三篇,本篇和第一篇如何向其他程序的ListView控件發(fā)送LVM_GETITEMTEXT消息類似,區(qū)別在于:1,發(fā)送的消息不同:前者是讀取pszText的內(nèi)容?D?D發(fā)送LVM_GETITEMTEXT;這次是設(shè)置pszText,應(yīng)該發(fā)送LVM_SETITEMTEXT。2,字符串緩沖區(qū)的作用不同:前者pItem用來接收ITEMTEXT,我們可以通過ReadProcessMemory函數(shù)來讀取其內(nèi)容;而在本篇中p_MyItemText則
9、用來存放我們要設(shè)置的ITEMTEXT,并用WriteProcessMemory函數(shù)將其寫入到目標(biāo)程序中。 作為演示,下面的這段程序?qū)⒏腡askManager中第6個(gè)項(xiàng)目中第1列的內(nèi)容。程序運(yùn)行后的效果圖:二:具體實(shí)踐:#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
10、;DWORD PID;HANDLE hProcess;char *p_MyItemText;/目標(biāo)程序中用來存放TEXT的地址/The pszText member is the pointer to a null-terminated/ string containing the new text; it can also be NULL./以上信息是從API手冊(cè)中獲得的,故在本例中字符串長度不能>=12,/以確保字符串后有NULL。char str_MyItemText12=0;strcpy(str_MyItemText,"天津 趙春生");hwnd=FindWi
11、ndow("#32770","Windows 任務(wù)管理器");hwnd=FindWindowEx(hwnd,0,"#32770",0);hwnd=FindWindowEx(hwnd,0,"SysListView32",0);if (!hwnd)MessageBox(NULL,"Windows 任務(wù)管理器 尚未啟動(dòng)!","錯(cuò)誤!",NULL);elseGetWindowThreadProcessId(hwnd, &PID);hProcess=OpenProcess(PR
12、OCESS_ALL_ACCESS,false,PID);if (!hProcess)MessageBox(NULL,"獲取進(jìn)程句柄操作失敗!","錯(cuò)誤!",NULL);elseplvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);p_MyItemText=(char*)VirtualAllocEx(hProcess, NULL, 12, MEM_COMMIT, PAGE_READWRITE);if (!plvitem)|(!p
13、_MyItemText)MessageBox(NULL,"無法分配內(nèi)存!","錯(cuò)誤!",NULL);elseMessageBox(NULL,"本演示程序?qū)⒏腡askManager中第6個(gè)項(xiàng)目中第1列的內(nèi)容。","提示",NULL);iItem=5;/5在這里是第六個(gè)(從零開始)lvitem.iSubItem=0;/同上lvitem.pszText=p_MyItemText;WriteProcessMemory(hProcess, p_MyItemText, &str_MyItemText, 12, NUL
14、L);WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);/向目標(biāo)程序發(fā)送LVM_SETITEMTEXT消息SendMessage(hwnd, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);/釋放內(nèi)存CloseHandle(hwnd);CloseHandle(hProcess);VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);VirtualFreeEx(hProcess, p_MyItemText,
15、0, MEM_RELEASE);return 0;一:程序說明:題目是一位網(wǎng)友在我留言板上的留言,不知道大家看沒看過我曾經(jīng)寫過的如何向其他程序的ListView控件發(fā)送LVM_GETITEMTEXT消息一文?在那篇拙文中,我的目的是得到某一Item的TEXT。于是我將LVITEM結(jié)構(gòu)插入到了目標(biāo)進(jìn)程中,才使得目標(biāo)進(jìn)程正確響應(yīng)LVM_GETITEMTEXT消息。要得到某一Item的TEXT,需要發(fā)送LVM_GETITEMTEXT消息,而要選中某個(gè)Item則要發(fā)送LVM_SETITEMSTATE消息:LVM_GETITEMTEXTwParam = (WPARAM) (int) iItem;lPar
16、am = (LPARAM) (LV_ITEM FAR *) pitem;LVM_SETITEMSTATEwParam = (WPARAM) (int) i;lParam = (LPARAM) (LV_ITEM FAR *) pitem;看到了嗎??jī)蓚€(gè)消息的參數(shù)一模一樣!再來看看LV_ITEM結(jié)構(gòu)的設(shè)置:只需將state和stateMask設(shè)置成LVIS_SELECTED,并指定iItem即可。直接修改上篇拙文中的代碼就能輕松搞定本篇要解決的問題。二:具體實(shí)踐:#include<windows.h>#include<commctrl.h>int APIENTRY WinM
17、ain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)HWND hwnd;int iItem=0;LVITEM lvitem, *plvitem;DWORD PID;HANDLE hProcess;hwnd=FindWindow("#32770","Windows 任務(wù)管理器");hwnd=FindWindowEx(hwnd,0,"#32770",0);hwnd=FindWindowEx(hwnd,0,"SysListView
18、32",0);if (!hwnd)MessageBox(NULL,"Windows 任務(wù)管理器 尚未啟動(dòng)!","錯(cuò)誤!",NULL);elseGetWindowThreadProcessId(hwnd, &PID);hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);if (!hProcess)MessageBox(NULL,"獲取進(jìn)程句柄操作失敗!","錯(cuò)誤!",NULL);elseplvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);if (!plvitem)MessageBox(NULL,"無法分配內(nèi)存!","錯(cuò)誤!",NULL);elseMessageBox(NULL,"本演示程序?qū)⑦x中TaskManager中的第6個(gè)項(xiàng)目。","提示",NULL);iItem=5;/5在這里是第六個(gè)(從零開始)lvitem
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年小學(xué)生語文學(xué)習(xí)鼓勵(lì)試題及答案
- 2024年汽車維修工考試職業(yè)前景
- 2024年寵物營養(yǎng)師專業(yè)知識(shí)考核試題及答案
- 小學(xué)一年級(jí)語文知識(shí)拓展試題及答案
- 美容師考試相關(guān)職業(yè)影響分析與公務(wù)員省考試題及答案
- 2024年統(tǒng)計(jì)學(xué)考試復(fù)習(xí)講義與試題答案
- 2024-2025公司及項(xiàng)目部安全培訓(xùn)考試試題(4A)
- 古代文學(xué)中對(duì)生命的思考試題及答案
- 2025新版車間安全培訓(xùn)考試試題(ab卷)
- 2024-2025員工三級(jí)安全培訓(xùn)考試試題及1套參考答案
- 壓裂施工安全操作規(guī)定(正式)
- 生理衛(wèi)生教學(xué)【青春期男生性教育】走向成熟課件
- 人工呼吸的三種方式和操作方法課件
- 項(xiàng)目基坑坍塌事故專項(xiàng)應(yīng)急預(yù)案桌面演練腳本
- 無創(chuàng)通氣常用模式與參數(shù)調(diào)節(jié)
- 清遠(yuǎn)市城市樹木修剪技術(shù)指引(試行)
- GB∕T 8427-2019 紡織品 色牢度試驗(yàn) 耐人造光色牢度:氙弧
- 退休人員實(shí)行社區(qū)管理申請(qǐng)書
- 全國同等學(xué)力工商管理大綱重點(diǎn)整理
- 機(jī)耕道監(jiān)理實(shí)施細(xì)則完整
評(píng)論
0/150
提交評(píng)論