想通過windows API的SendMessage跨行程獲取另一個程式的表格中的資料。該表格為虛擬表格,表格的class為ListView20WndClass,父視窗為ThunderRT6FormDC。在SPY++中能捕獲到父視窗發送WM_NOTIFY,訊息為LVN_GETDISPINFOA。通過Window API,利用SendMessage發送WM_NOTIFY,獲取失敗,在SPY++中監測不到該信號。請高手幫忙debug下,謝謝。上代碼,具體資訊在代碼注釋中:
HWND form_hwnd = reinterpret_cast<HWND>(0x00101CF4); //父視窗ThunderRT6FormDC的句柄
HWND list_hwnd = reinterpret_cast<HWND>(0x001B2506); //父視窗ThunderRT6FormDC的句柄
char item[512], *_item;
HANDLE hProcess;
DWORD PID;
LV_DISPINFOA lvd, *_lvd;
//通過WM_GETTEXT獲取父視窗的title,可正常獲取,SPY++中監測到該信號。
int len = SendMessage(form_hwnd, WM_GETTEXTLENGTH, 0, 0);
char *buffer = new char[len+1];
SendMessage(form_hwnd, WM_GETTEXT, len+1, (lPARAM)buffer);
//獲取父視窗行程ID
GetWindowThreadProcessID(form_hwnd, &PID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
//在行程中開辟記憶體
_lvd = (LV_DISPINFOA*)VirtualAllocEx(hProcess, nullptr, sizeof(LV_DISPINFOA), MEM_COMMIT, PAGE_READWRITE);
_item = (char*)VirtualAllocEx(hProcess, nullptr, 512, MEM_COMMIT, PAGE_READWRITE);
//通過LVM_GETITEMCOUNT獲取表格的行數(可正常獲取到,也能在SPY++中監測到訊息)
long long rows = SendMessage(list_hwnd, LVM_GETITEMCOUNT, 0, 0);
//通過LVM_GETHEADER得到表頭的句柄(可以在SPY++中監測到該訊息)
HWND headers = (HWND)SendMessage(list_hwnd, LVM_GETHEADER, 0, 0);
//獲取列數(可正常獲取到)
int cols = Header_GetItemCount(headers);
//賦值給NMHDR,訊息為LVN_GETDISPINFOA,第一行第一列的text
lvd.hdr.hwndFrom = list_hwnd;
lvd.hdr.idForm = 0;
lvd.hdr.code = LVN_GETDISPINFOA;
lvd.item.mask = LVIF_TEXT;
lvd.item.cchTextMax = 512;
lvd.item.pszText = _item;
lvd.item.iSubItem = 0;
lvd.item.iItem = 0;
//將lvd寫入目標行程
WriteProcessMemory(hProcess, _lvd, &lvd, sizeof(LV_DISPINFOA));
//發送WM_NOTIFY訊息
//該訊息發送失敗,SPY++監測不到父視窗有該信號
SendMessage(form_hwnd, WM_NOTIFY, (WPARAM)0, (LPARAM)_lvd);
ReadProcessMemory(hProcess, _item, item, 512, 0);
CloseHandle(hwnd);
CloseHandle(hProcess);
VirtualFreeEx(hProcess, _lvd, 0, MME_RELEASE);
VirtualFreeEx(hProcess, _item, 0, MME_RELEASE);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/7308.html
標籤:API
上一篇:vb
