我可以跨行程獲取listctrl的行數和列數,所有的內容。但是不能獲取標題欄的內容,有沒有高手知道?
下面的代碼可以獲取Listctrl的單元格內容,但是Header我照著寫,就是得不到.
WriteProcessMemory(hProcess, pHeaderItem, &HeaderItem, sizeof(HDITEM), NULL);
::SendMessage(pHeaderCtrl->GetSafeHwnd(), LVM_GETITEMTEXT, 0, (LPARAM)pHeaderItem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
uj5u.com熱心網友回復:
你Debug下除錯一下看看,資料都分配空間了沒?呼叫上面的ReadxxxMemory得到的資料正確嗎?uj5u.com熱心網友回復:
BOOL GetItem( int nPos, HDITEM* pHeaderItem ) const;uj5u.com熱心網友回復:
有分配的。
pHeaderItem = (HDITEM*)VirtualAllocEx(hProcess, NULL, sizeof(HDITEM), MEM_COMMIT, PAGE_READWRITE);
pItem = (char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
if ((!pHeaderItem) || (!pItem))
{
::MessageBox(NULL, "無法分配記憶體!", "錯誤!", NULL);
}
for (i=0; i<nHeaderCount; i++)
{
HeaderItem.cchTextMax = 512;
HeaderItem.pszText = pItem;
WriteProcessMemory(hProcess, pHeaderItem, &HeaderItem, sizeof(HDITEM), NULL);
::SendMessage(pHeaderCtrl->GetSafeHwnd(), LVM_GETITEMTEXT, 0, (LPARAM)pHeaderItem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
}
//釋放記憶體
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pHeaderItem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
uj5u.com熱心網友回復:
你好,這個只能用于自己的程式,不能跨行程讀別人的對話框
uj5u.com熱心網友回復:
ListCtrl 標題 可能先要 獲取標題欄視窗句柄 ListView_GetHeader然后 用 HDM_GETITEM 訊息讀取 內容
About Header Controls
uj5u.com熱心網友回復:
謝謝樓上的,不能跨行程uj5u.com熱心網友回復:
HeaderItem.mask = HDI_TEXT;
HeaderItem.cchTextMax = 512;
HeaderItem.pszText = pItem;
for (i=0; i<nHeaderCount; i++)
{
WriteProcessMemory(hProcess, pHeaderItem, &HeaderItem, sizeof(HDITEM), NULL);
::SendMessage(pHeaderCtrl->GetSafeHwnd(), HDM_GETITEM, 0, (LPARAM)pHeaderItem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
}
uj5u.com熱心網友回復:
HeaderItem.mask = HDI_TEXT;
HeaderItem.cchTextMax = 512;
HeaderItem.pszText = pItem;
for (i=0; i<nHeaderCount; i++)
{
WriteProcessMemory(hProcess, pHeaderItem, &HeaderItem, sizeof(HDITEM), NULL);
::SendMessage(pHeaderCtrl->GetSafeHwnd(), HDM_GETITEM, i, (LPARAM)pHeaderItem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
}
uj5u.com熱心網友回復:
void CRemoteListCtrlDlg::RemoteHeaderItem(HWND hWnd)
{
// GetItemCount
int nHeaderCount=::SendMessage(hWnd,HDM_GETITEMCOUNT,0,0);
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(hWnd,&pid);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//
HDITEM *pHeaderItem = (HDITEM*)VirtualAllocEx(hProcess, NULL, sizeof(HDITEM), MEM_COMMIT, PAGE_READWRITE);
char *pItem = (char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
if ((!pHeaderItem) || (!pItem))
{
::MessageBox(NULL, "無法分配記憶體!", "錯誤!", NULL);
CloseHandle(hProcess);
return;
}
//
HDITEM HeaderItem;
HeaderItem.cchTextMax = 512;
HeaderItem.mask = HDI_TEXT;
HeaderItem.pszText = pItem;
//
char ItemBuf[512];
for(int i=0; i<nHeaderCount; i++)
{
HeaderItem.iOrder=i;
WriteProcessMemory(hProcess, pHeaderItem, &HeaderItem, sizeof(HDITEM), NULL);
::SendMessage(hWnd, HDM_GETITEM, i, (LPARAM)pHeaderItem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
afxDump << ItemBuf << "\n";
}
//釋放記憶體
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pHeaderItem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
}
從 “HWND hWnd=::WindowFromPoint(point);” 得到 HeaderCtrl 的 hWnd !
uj5u.com熱心網友回復:
再給一個typedef struct tagMYLVCOLUMN
{
LVCOLUMNA oldCol;
char text[80];
} MYLVCOLUMN, FAR* LPMYLVCOLUMN;
、、、、、、、、、、、、、、、、、、、
//
LPMYLVCOLUMN CRemoteListCtrlDlg::RemoteLVGetColumn(HWND hLvWnd)
{// GetItemCount
m_hHdWnd=ListView_GetHeader(m_hLvWnd);
int nColumn=::SendMessage(m_hHdWnd,HDM_GETITEMCOUNT,0,0);
// afxDump << nColumn << "\n";//2
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(m_hLvWnd,&pid);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//
LPMYLVCOLUMN pRemoteCol = (LPMYLVCOLUMN)VirtualAllocEx(hProcess, NULL, nColumn*sizeof(MYLVCOLUMN), MEM_COMMIT, PAGE_READWRITE);
if (!pRemoteCol)
{
::MessageBox(NULL, "無法分配記憶體!", "錯誤!", NULL);
CloseHandle(hProcess);
return 0;
}
// local
LPMYLVCOLUMN pLocalCol=new MYLVCOLUMN[nColumn];
memset(pLocalCol,0,nColumn*sizeof(MYLVCOLUMN));
for(int i=0; i<nColumn; i++)
{
pLocalCol[i].oldCol.mask=LVCF_FMT | LVCF_TEXT | LVCF_WIDTH ;//| LVCF_SUBITEM;
pLocalCol[i].oldCol.cchTextMax=80;
pLocalCol[i].oldCol.pszText=pRemoteCol[i].text;// not pLocalCol[i].text
if(!WriteProcessMemory(hProcess, &pRemoteCol[i], &pLocalCol[i], sizeof(MYLVCOLUMN), NULL))
{
::MessageBox(NULL, "WriteProcessMemory!", "錯誤!", NULL);
CloseHandle(hProcess);
return 0;
}
ListView_GetColumn(m_hLvWnd,i,&pRemoteCol[i]);
// ::SendMessage(m_hLvWnd, LVM_GETCOLUMN, (WPARAM)i, (LPARAM)&pRemoteCol[i]);
if(!ReadProcessMemory(hProcess, &pRemoteCol[i], &pLocalCol[i], sizeof(MYLVCOLUMN), NULL))
{
::MessageBox(NULL, "ReadProcessMemory!", "錯誤!", NULL);
CloseHandle(hProcess);
return 0;
}
// !!!
pLocalCol[i].oldCol.pszText=pLocalCol[i].text;
afxDump << pLocalCol[i].text << "\n";
}
//釋放記憶體
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pRemoteCol , 0, MEM_RELEASE);
return pLocalCol;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/134123.html
標籤:界面
上一篇:C++關于程式運行框背景的問題
下一篇:vs2015安裝MFC不成功
