如何得到其他程序的Richedit中的RTF数据?

qiyuanxjy 2008-07-09 06:49:39
加精
如何得到其他程序的Richedit中的RTF数据?
...全文
819 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
回味一下 2009-08-09
  • 打赏
  • 举报
回复
这不是因为你提问提得好,而是因为大师回答得精彩,路过,呵呵
qiyuanxjy 2008-07-19
  • 打赏
  • 举报
回复
我提问的帖子被推荐了,^_^
  • 打赏
  • 举报
回复
学习
hgneng 2008-07-15
  • 打赏
  • 举报
回复
刚来,顶了再看,谢谢个先
Ackarlix 2008-07-15
  • 打赏
  • 举报
回复
^^ 徐诶下









挨踢网 【中文IT技术社区】

【主页地址】http://www.aitic.net
【论坛入口】http://www.aitic.net/bbs
我们的目标是:做开源的中文IT技术社区,为IT人提供最好的技术交流平台,发布最全面的IT技术资料!
我们的口号是:让IT人从此不挨踢!
aers123 2008-07-15
  • 打赏
  • 举报
回复
ding ding ding
wuchuanyuan 2008-07-15
  • 打赏
  • 举报
回复
路过...看完无语...强...
windysi 2008-07-15
  • 打赏
  • 举报
回复
强人,顶
pilicat 2008-07-14
  • 打赏
  • 举报
回复
学习。
wangbin19830731 2008-07-14
  • 打赏
  • 举报
回复
sdfdsfs
qxshcg 2008-07-14
  • 打赏
  • 举报
回复
DDDDDDDDDDDDDDDDDDDDDDDDDDDD
王集鹄 2008-07-13
  • 打赏
  • 举报
回复
研究过程参考我写的博文:关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例。

记得要结贴。[img=http://p.blog.csdn.net/images/p_blog_csdn_net/zswang/%E6%9D%A5%E7%82%B9.gif]图[/img]
王集鹄 2008-07-13
  • 打赏
  • 举报
回复
参考如下代码:
uses RichEdit;

{$WARN SYMBOL_DEPRECATED OFF}

type
TRichEditStreamReader = class
private
FStream: TStream;
FHandle: THandle;
protected
procedure WndProc(var Message: TMessage); virtual;
public
constructor Create(AStream: TStream);
destructor Destroy; override;
property Handle: THandle read FHandle;
end;

{ TRichEditStreamReader }

constructor TRichEditStreamReader.Create(AStream: TStream);
begin
FStream := AStream;
FHandle := AllocateHWnd(WndProc);
end;

destructor TRichEditStreamReader.Destroy;
begin
DeallocateHWnd(FHandle);
inherited;
end;

procedure TRichEditStreamReader.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_COPYDATA:
begin
if not Assigned(FStream) then Exit;
FStream.Write(PCopyDataStruct(Message.LParam)^.lpData^,
PCopyDataStruct(Message.LParam)^.cbData);
end;
end;
end;

function Process_ReadRichEditStream(
AHandle: THandle; AStream: TStream; AFormat: Longword): Boolean;
type
TVclApi = packed record //JMP DWORD PTR [$HHHHHHHH]
rJmp: Word; // FF 25
rAddress: PInteger; // API实际地址
end;
PVclApi = ^TVclApi;
const
EditStreamCallBackBytes =
#$55 + // PUSH EBP
#$8B#$EC + // MOV EBP,ESP
#$83#$C4#$F4 + // ADD ESP,$F4
#$8B#$45#$10 + // MOV EAX,DWORD PTR [EBP+$10]
#$8B#$55#$14 + // MOV EDX,DWORD PTR [EBP+$14]
#$89#$02 + // MOV DWORD PTR [EDX],EAX
#$33#$D2 + // XOR EDX,EDX
#$89#$55#$F4 + // MOV DWORD PTR [EBP-$0C],EDX
#$89#$45#$F8 + // MOV DWORD PTR [EBP-$08],EAX
#$8B#$45#$0C + // MOV EAX,DWORD PTR [EBP+$0C]
#$89#$45#$FC + // MOV DWORD PTR [EBP-$04],EAX
#$8D#$45#$F4 + // LEA EAX,DWORD PTR [EBP-$0C]
#$50 + // PUSH EAX
#$6A#$00 + // PUSH $00
#$6A#$4A + // PUSH $4A
#$8B#$45#$08 + // MOV EAX,DWORD PTR [EBP+$08]
#$50 + // PUSH EAX
#$FF#$15#$00#$00#$00#$00 + // CALL DWORD PTR [H] -- String Index:43
#$33#$C0 + // XOR EAX,EAX
#$8B#$E5 + // MOV ESP,EBP
#$5D + // POP EBP
#$C2#$10#$00 + // RET $0010
#$00#$00#$00#$00 + // Api Address -- String Index:55
#$00#$00#$00#$00 + // _editstream : dwCookie -- String Index:59
#$00#$00#$00#$00 + // _editstream : dwError
#$00#$00#$00#$00; // _editstream : pfnCallback
type
PEditStream = ^TEditStream;
var
vEditStreamCallBack: string;
vProcessId: DWORD;
vProcess: THandle;
vPointer: Pointer;
vNumberOfBytesRead: Cardinal;
vRichEditStreamReader: TRichEditStreamReader;
begin
Result := False;
if not Assigned(AStream) then Exit;
if not IsWindow(AHandle) then Exit;
GetWindowThreadProcessId(AHandle, @vProcessId);
vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, vProcessId);
try
vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
PAGE_READWRITE);
vRichEditStreamReader := TRichEditStreamReader.Create(AStream);
try
vEditStreamCallBack := EditStreamCallBackBytes;
PInteger(@vEditStreamCallBack[43])^ := Integer(vPointer) + 55 - 1;
PInteger(@vEditStreamCallBack[55])^ := PVclApi(@SendMessage)^.rAddress^;
PEditStream(@vEditStreamCallBack[59])^.dwCookie := vRichEditStreamReader.Handle;
PEditStream(@vEditStreamCallBack[59])^.pfnCallback := vPointer;
WriteProcessMemory(vProcess, vPointer, @vEditStreamCallBack[1],
Length(vEditStreamCallBack), vNumberOfBytesRead);
SendMessage(AHandle, EM_STREAMOUT, AFormat, Integer(Integer(vPointer) + 59 - 1));
finally
vRichEditStreamReader.Free;
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
end;
finally
CloseHandle(vProcess);
end;
end; { Process_ReadRichEditStream }

procedure TForm1.Button1Click(Sender: TObject);
var
vHandle: THandle;
vMemoryStream: TMemoryStream;
begin
vHandle := FindWindow('WordPadClass', nil);
if vHandle = 0 then Exit;
vHandle := FindWindowEx(vHandle, 0, 'RICHEDIT50W', nil);
if vHandle = 0 then Exit;
vMemoryStream := TMemoryStream.Create;
try
Process_ReadRichEditStream(vHandle, vMemoryStream, SF_RTF);
vMemoryStream.Position := 0;
RichEdit1.PlainText := False;
RichEdit1.Lines.LoadFromStream(vMemoryStream);
finally
vMemoryStream.Free;
end;
end;
qiyuanxjy 2008-07-13
  • 打赏
  • 举报
回复
补充下,大师这个代码可以在vista sp1下工作
qiyuanxjy 2008-07-13
  • 打赏
  • 举报
回复
大师,这个好象抓不了格式,只是文本?
qiyuanxjy 2008-07-13
  • 打赏
  • 举报
回复
刚来,顶了再看,谢谢个先
qiyuanxjy 2008-07-13
  • 打赏
  • 举报
回复
大师不帮忙了,郁闷ing......................
王集鹄 2008-07-13
  • 打赏
  • 举报
回复
试了一下,确实有这样的情况,特别是没有显示出来的GIF更容易静止掉。

估计是转化为RTF流的时候,优化资源出的问题。

这个已经超出我的控制范围。。。


楼主继续研究吧。。。我闪了。。。
qiyuanxjy 2008-07-13
  • 打赏
  • 举报
回复
这么说吧,我用rxrichedit作显示,获取qq聊天窗口文本(窗口ID 380 类名 RichEdit20A),获取的rtf文本中的gif在rxrichedit中可以正常显示动画,但是qq窗口中就不行了,就不动了,定格在第一帧,但也不是必然,我算了下,大概一半多的几率出现这个问题
王集鹄 2008-07-13
  • 打赏
  • 举报
回复
大师不敢当。。。[img=http://p.blog.csdn.net/images/p_blog_csdn_net/renrousousuo/17.gif]图[/img]

有什么影响?什么现象?什么软件?
加载更多回复(13)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧