1. 程式人生 > >讀取其他程序的資料

讀取其他程序的資料

假設需要讀取的程序為Exe可執行程式A

1、根據A的實際開啟程式名:A.exe,來找到這個程式的視窗控制代碼(和程序控制代碼不同)

typedef struct tagWNDINFO
{
    DWORD dwProcessId;
    HWND hWnd;
} WNDINFO, *LPWNDINFO;

BOOL CALLBACK MyEnumProc(HWND hWnd,LPARAM lParam)//列舉所有程序
{
    DWORD dwProcId;
    GetWindowThreadProcessId(hWnd, &dwProcId);
    LPWNDINFO pInfo=(LPWNDINFO)lParam;
    if
(dwProcId==pInfo->dwProcessId) { // 在此新增更多限制條件 CString strTmp; GetClassName(hWnd, strTmp.GetBuffer(200), 200); strTmp.ReleaseBuffer(); if (!strTmp.Compare("LButton")) // 按鈕, 編輯框TEdit等, 具體可使用Spy++檢視 { pInfo->hWnd = hWnd; return
FALSE; } if (IsWindowVisible(hWnd)) // 當前視窗是否可見 { pInfo->hWnd = hWnd; // 獲取到第一個視窗控制代碼 return FALSE; } } return TRUE; } HWND GetProcessHwnd(DWORD proccessId) { WNDINFO wi; wi.dwProcessId = proccessId; wi.hWnd = NULL; EnumWindows(MyEnumProc,(LPARAM)&wi); EnumChildWindows(wi.hWnd
, MyEnumProc, (LPARAM)&wi); // 列舉視窗的子視窗控制代碼, MFC中的控作等 return wi.hWnd; } void GetProcessInfo(CString processName) { //建立程序快照(TH32CS_SNAPPROCESS表示建立所有程序的快照) HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //PROCESSENTRY32程序快照的結構體 PROCESSENTRY32 pe; //例項化後使用Process32First獲取第一個快照的程序前必做的初始化操作 pe.dwSize = sizeof(PROCESSENTRY32); //下面的IF效果同: //if(hProcessSnap == INVALID_HANDLE_VALUE) 無效的控制代碼 if(!Process32First(hSnapShot,&pe)) { return; } processName.MakeLower(); BOOL clearprocess = FALSE; //如果控制代碼有效 則一直獲取下一個控制代碼迴圈下去 while (Process32Next(hSnapShot,&pe)) { //pe.szExeFile獲取當前程序的可執行檔名稱 CString scTmp = pe.szExeFile; scTmp.MakeLower(); char modPath[MAX_PATH] = {0}; if(!scTmp.Compare(processName)) { //從快照程序中獲取該程序的PID(即工作管理員中的PID) DWORD dwProcessID = pe.th32ProcessID; //獲取程序的控制代碼 HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID); //獲取第一個可視視窗的控制代碼 HWND hWnd = GetProcessHwnd(dwProcessID); } } ::CloseHandle(hSnapShot); }

上面的這一段程式碼可以完美獲取程式的主視窗控制代碼和子視窗控制代碼!再一次強調不是程序控制代碼哦!

2、通過視窗控制代碼,獲取視窗的內容(主文件標題,編輯框內容,靜態框內容)。但是如果要獲取比較複雜的視窗的文字內容,就會麻煩一些。

//獲取簡單視窗的內容
GetWindowText(hWnd,strText.GetBuffer(256), 256);

比如獲取一個TreeView的內容,就比較麻煩。總體思路就是通過發訊息獲取。


//從快照程序中獲取該程序的PID(即工作管理員中的PID)
DWORD dwProcessID = pe.th32ProcessID;  

//獲取第一個可視視窗的控制代碼
HWND hWnd = GetProcessHwnd(dwProcessID);

//獲取程序的控制代碼
HANDLE hProcess = ::OpenProcess(PROCESS_VM_OPERATION |PROCESS_VM_READ | PROCESS_VM_WRITE |PROCESS_QUERY_INFORMATION,FALSE,dwProcessID);

//----------------
//給_lvi,_item分配程序級的虛擬記憶體空間
TVITEM tvi, *_tvi;
char *_item; 
char item[256];

CTreeCtrl* pTreeCtrl = ((CTreeCtrl*)CWnd::FromHandle((HWND)hWnd));
int nItemNum = pTreeCtrl->GetCount();
HTREEITEM Testitem1;
Testitem1=pTreeCtrl->GetRootItem();

long ret = (long)Testitem1;

_tvi=(TVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(TVITEM), MEM_COMMIT, PAGE_READWRITE); 
_item=(char*)VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE); 
tvi.cchTextMax=256;
tvi.hItem=(HTREEITEM)ret;
tvi.mask=TVIF_TEXT;
tvi.pszText=_item;
//把_lvi 寫入程序
WriteProcessMemory(hProcess, _tvi, &tvi, sizeof(TVITEM), NULL);

//發訊息得到資料
::SendMessage(hWnd, TVM_GETITEM, 0 , (LPARAM)_tvi); 
//從程序中讀出資料
BOOL bRead = ReadProcessMemory(hProcess, _item, item, 256, NULL);

char filestr[256];
//copy data
memcpy(filestr,item,256);

strTitle.Format("%s",filestr);


//free memory
VirtualFreeEx(hProcess, _tvi, 0, MEM_RELEASE); 
VirtualFreeEx(hProcess, _item, 0, MEM_RELEASE);

執行這段程式碼的前提是已經獲取了該程式程序的ID和對應視窗的控制代碼。網上也有很多這樣的內容,也可檢視其它文章,對照理解。

3、至此,就完成了從其他程序中讀取文字內容的方法。但是有個注意事項,本篇文章所給出的方法只針對於32位程式。如果你要讀取的程式是64位的,可將裡面的一些函式和變數換成64位的。可能替換過程還需要再進行一些查閱資料。但實現的整理思路是想通的。本文的實現也是經過驗證的。

4、spy++是對這種分析極為有效的工具。是微軟編譯工具的其中一個,善加利用。我的資源裡有下載,需要的可以去看看。

附spy++ 下載連結:
SPY++下載

相關推薦

讀取其他程序資料

假設需要讀取的程序為Exe可執行程式A 1、根據A的實際開啟程式名:A.exe,來找到這個程式的視窗控制代碼(和程序控制代碼不同) typedef struct tagWNDINFO { DWORD dwProcessId; HWND

04.實現讀取其他扇區資料顯示

簡介 上一節我們使用C語言實現了3.5寸虛擬軟盤檔案結構,作業系統檔案必須突破頭512位元組的限制,需要把資料寫入其他扇區,在頭512位元組中實現載入其他扇區檔案到記憶體。 目標 使用自制的C語言虛擬軟盤模組,把顯示的字串資料寫入1磁軌、0磁頭、2扇區,在核心載

查找網上關於C++讀取Excel表格資料後的心得

cst 批評 目錄 work 各路 網上 sse rate books 使用微軟提供的自帶COM組件來讀Excel 一、讀取Excel文件COM類的相關環境的搭建: 1、首先新建一個MFC對話框工程,可命名為ReadWriteExcel 2、在添加類選項中, 選擇MFC

php異步執行其他程序

user ajax linux pen ignore curl 設置 缺失 開啟 這裏的“其他程序”,可能是linux命令,可能是其他的php文件。 網上說法有四種。分別為: 1、通過加載頁面的時候通過ajax技術異步請求服務器 2、通過popen()函數 3、通過curl

Linux應用程序調用其他程序執行

pan 保存 執行 log spa blog 作用 csharp span 一、system 1、作用 在Linux應用程序中調用另一個程序; 2、用法 system("/sbin/ifconfig"); 二、popen 1、作用 調用另一個程序執行,同時保存執行的結果

動態生成ABAP程序-資料

style tro report spa err lan rate types program 參考程序: Tcode ABAPdocu--> BC - ABAP Programming--> The ABAP Programming Language--&g

串口程序.資料

ast RR 公司 tran 時間 編譯 object str 儀表 1、Win32下串口讀寫設置操作 - CSDN博客.html(http://blog.csdn.net/dahan_wangtao/article/details/1621212) 2、網頁內容拷貝:

c++中txt檔案的讀取以及在MFC中讀取txt座標資料並完成圖形繪製

主要介紹如何讀取txt檔案中的座標資料,並在MFC視窗中繪製出來,工程建立方法和繪圖方法與上一篇博文基本一致,這裡就不再詳贅述,可參考上一篇博文vs2010、MFC視窗中繪製點、線、面。 C++中讀取檔案的方法有兩種,一種是來自於C語言的“檔案指標”方法,另一種是C++中的“檔案流”思想。

android讀取csv檔案資料

csv檔案是一種表格形式的檔案,如果把檔案字尾名改為.txt,會發現同一行資料之間是用英文“,”隔開的。 如何讀取csv檔案以便把資料存入資料庫呢,特別是csv檔案中有些資料是空? csv檔案如下: 把檔案字尾名改為.txt後如下: 電錶id,電錶編號,模組地址,描述,所屬站點名稱,

GDAL庫讀取Envisat ASAR資料

GDAL庫讀取Envisat ASAR資料   GDAL庫本身就可以讀取Envisat的影象資料,具體連結為:http://www.gdal.org/frmt_various.html#Envisat。 但是對於ASAR感測器的資料來說,GDAL在處理的時候將入射角資料沒要進行

利用pyspark 讀取 S3上資料

spark = SparkSession.builder.master('local').appName("hxy_test_script").getOrCreate() sc = spark.sparkContext # s3環境 sc._jsc.hadoopC

Java 讀取較大資料的excel檔案

記錄一下使用poi讀取大資料excel檔案踩的坑 介紹 Java 有2個jar包可以操作excel檔案,分別是jxl和poi; jxl這個jar包只能讀取excel2003年的檔案(檔案字尾為.xls),而poi這個jar包excel2003(檔案字尾為.xls)和excel2007(檔

TensorFlow讀取二進位制檔案資料到佇列

       TensorFlow是一種符號程式設計框架(與theano類似),先構建資料流圖再輸入資料進行模型訓練。Tensorflow支援很多種樣例輸入的方式。最容易的是使用placeholder,但這需要手動傳遞numpy.array型別的資料。第二

java後端伺服器讀取excel將資料匯入資料庫

使用的是easypoi,官網文件:http://easypoi.mydoc.io/ 1 /** 2 * 匯入Excel檔案 3 */ 4 @PostMapping("/importTeacher") 5 @ResponseBody 6 publi

【日記】c# 讀取網頁json資料

例:讀取雙色球官網歷史開獎號碼資料 1.準備工作 web url:  http://www.cwl.gov.cn/kjxx/ssq/kjgg/ 按F12在網路面板得到如下資料 json url: http://www.cwl.go

控制其他程序上的控制元件

C#呼叫其他程式,比如控制別的程式上的按鈕 //步驟1: {------------------------------------------------------------------------------- 過程名: EnumChildWndProc 過程描述: 通

ABAP 如何暫停其他程序的處理 加速當前程式的處理速度

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

jxl讀取設定過資料有效性的xls檔案報錯

1 //在用jxl讀入excel時,一直報如下錯誤: 2 Warning: Cannot read drop down range Unrecognized token 43 3 Exception in thread "main" java.lang.NullPointerExceptionat j

利用POI外掛匯入excel 讀取合併行資料

 圖為要匯入的excel格式 分析一下: 前一部分資料是讀取 合併行 存入一張 “會見” 表 ,後面藍色的 非合併行 存入 “會見人資訊” 表。 先說後臺方法,(讀取本地檔案例子) public void importJsInfo() throws IOExceptio

從資料庫當中讀取Double型別資料,數值過大時會變成科學計數法問題解決方案

這是問題所在.. 解決方案 Double dabo = 12345678.88d; DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(2);//這裡是小數位 String format = df