最新问答 更多

关注我们

关注我们

了解我们的产品和服务,有任何疑问、意见或合作需求,可关注本微博与我们在线沟通。

盒子问答悬赏微博

[单人中标] 大大们,这段代码能帮忙转成Delphi代码吗

分享任务:
问题已结束!
20
发布者 luckyso
浏览量
回答数 1

任务详情

以下代码来自彗星小助手里的"获取窗口内容"功能

CString CWinSpyCentent::GetListViewCentent(BOOL bReport)

{

CString strCon_tent=_T("");

CString str=_T("");

DWORD PID=0;

HWND hWnd=g_hWndSpy;//目标ListView句柄

GetWindowThreadProcessId(hWnd,&PID);

HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);

if(!hProcess){

TRACE(_T("获取进程句柄操作失败hWnd=%dPID=%d"),hWnd,PID);

return strContent;

}

LVITEMA* pLVITEM=(LVITEMA*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);

char* pItem=(char*)VirtualAllocEx(hProcess,NULL,16,MEM_COMMIT,PAGE_READWRITE);

if(!pLVITEM){

TRACE(_T("无法分配内存!"));

return strContent;

}

LVITEMA LVITEM;

LVITEM.mask=LVIF_TEXT;

LVITEM.cchTextMax=512;

LVITEM.pszText=pItem;

char ItemBuf[512];

int nCount=::SendMessage(hWnd,LVM_GETITEMCOUNT,0,0);

int nColCount=1;

DWORD dwStyle=::GetWindowLong(hWnd,GWL_STYLE);

if(bReport){

HWND header=(HWND)::SendMessage(hWnd,LVM_GETHEADER,0,0);

if(header){

nColCount=::SendMessage(header,HDM_GETITEMCOUNT,0,0);

if(nColCount<1)nColCount=1;

}

}

for(int iItem=0;iItem

for(int iSubItem=0;iSubItem

LVITEM.iItem=iItem;

LVITEM.iSubItem=iSubItem;

//将设置好的结构插入目标进程

WriteProcessMemory(hProcess,pLVITEM,&LVITEM,sizeof(LVITEM),NULL);

//发送LVM_GETITEM消息

::SendMessage(hWnd,LVM_GETITEMA,0,(LPARAM)pLVITEM);

//获取pszText

ReadProcessMemory(hProcess,pItem,ItemBuf,512,NULL);

str=CString(ItemBuf);

if(iSubItem)strCon_tent=strContent+_T("\t\t");

strCon_tent=strContent+str;

}

strCon_tent=strContent+_T("\r\n");

}

//释放内存

VirtualFreeEx(hProcess,pItem,0,MEM_RELEASE);

VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);

CloseHandle(hProcess);

return strContent;

}

  • 梦想闪光:  uses
    
    CommCtrl;
    var
    g_hWndSpy: HWND;
    strContent: string;
    function GetListViewCentent(bReport: BOOL): string;
    var
    strCon_tent, str: string;
    PID, lpNumberOfBytesWritten: DWORD;
    hWnd, header:Windows.HWND;
    hProcess: THandle;
    pLVITEM: ^TLVItem;
    pItem: PChar;
    LVITEM: TLVItem;
    ItemBuf: array[0..511] of AnsiChar;
    nCount, nColCount, iItem, iSubItem: Integer;
    begin
    hWnd := g_hWndSpy; //目标ListView句柄;
    GetWindowThreadProcessId(hWnd, @PID);
    hProcess := OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if hProcess = 0 then
    begin
    OutputDebugString(PAnsiChar(Format('获取进程句柄操作失败hWnd=%dPID=%d', [hWnd,PID])));
    Result := strContent;
    Exit;
    end;
    pLVITEM := VirtualAllocEx(hProcess, nil,sizeof(TLVItem),MEM_COMMIT,PAGE_READWRITE);
    pItem := VirtualAllocEx(hProcess, nil,16,MEM_COMMIT,PAGE_READWRITE);
    if pLVITEM = nil then
    begin
    OutputDebugString(PAnsiChar(Format('无法分配内存!', [])));
    Result := strContent;
    Exit;
    end;
    LVITEM.mask := LVIF_TEXT;
    LVITEM.cchTextMax := 512;
    LVITEM.pszText := pItem;
    nCount := SendMessage(hWnd,LVM_GETITEMCOUNT,0,0);
    nColCount := 1;
    if bReport then
    begin
    header := SendMessage(hWnd,LVM_GETHEADER,0,0);
    if header <> 0 then
    begin
    nColCount := SendMessage(header,HDM_GETITEMCOUNT,0,0);
    if nColCount < 1 then nColCount := 1;
    end;
    end;
    for iItem := 0 to nCount-1 do
    begin
    for iSubItem := 0 to nColCount - 1 do
    begin
    LVITEM.iItem := iItem;
    LVITEM.iSubItem := iSubItem;
    //将设置好的结构插入目标进程
    WriteProcessMemory(hProcess, pLVITEM, @LVITEM, sizeof(TLVItem), lpNumberOfBytesWritten);
    //发送LVM_GETITEM消息
    SendMessage(hWnd,LVM_GETITEMA,0, LPARAM(pLVITEM));
    //获取pszText
    ReadProcessMemory(hProcess, pItem, @ItemBuf[0], 512, lpNumberOfBytesWritten);
    str := ItemBuf;
    if iSubItem <> 0 then
    strCon_tent := strContent + #9#9;
    end;
    strCon_tent := strContent + sLineBreak;
    end;
    //释放内存
    VirtualFreeEx(hProcess,pItem,0,MEM_RELEASE);
    VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);
    CloseHandle(hProcess);
    Result := strContent;
    end;

      回答于:2015/10/17 21:13:58      #1楼 奖励火柴:0
    用户头像
刷新 首页 上一页 下一页 末页 页次1/1页 共 1 条记录  转到:
x
您的任务被发布者审核为不合格

原因

详细说明

关于盒子问答
盒子问答为广大程序员提供一个迅速解决问题的好途径,帮助有编程疑惑的程序员轻松发问答。同时授业解惑的人,可以得到相应的收入。帮人解答并赚钱就来盒子问答。
联系我们
我们的服务支持邮件:webmaster@2ccc.com,支持qq:161945
如有建议或意见,可通过右侧“用户反馈”告诉我们
收藏本站
用户反馈