比如有个A。B两个程序
A有个label是用来显示的
B里有个文本框,一个按钮 点击按钮 文本框里的文字显示在B的label里
不借助本地文件和数据库我先取到A的句柄 然后遍历子窗口句柄 然后怎么改label的caption啊 setwindowtext不行
或者有什么其他控件更适合放文本内容 这些内容将来是不显示的
或者有其他方式的 只要能通信的就好先谢过了
A有个label是用来显示的
B里有个文本框,一个按钮 点击按钮 文本框里的文字显示在B的label里
不借助本地文件和数据库我先取到A的句柄 然后遍历子窗口句柄 然后怎么改label的caption啊 setwindowtext不行
或者有什么其他控件更适合放文本内容 这些内容将来是不显示的
或者有其他方式的 只要能通信的就好先谢过了
procedure SendMsg(AppName,Msg:string);
var
ds: TCopyDataStruct;
begin
ds.cbData:=Length(Msg)+1;
GetMem(ds.lpData,ds.cbData);
try
StrCopy(ds.lpData,PChar(Msg));
SendMessage(FindWindow(nil,Pchar(AppName)), WM_COPYDATA, 0, Integer(@ds));
finally
FreeMem(ds.lpData,ds.cbData);
end;
end;{调用:}SendMsg('你的程序名称','Hello World');{接收方:}
public
procedure WMCopyData(var Msg: TWMCOPYDATA); message WM_COPYDATA;procedure WMCopyData(var Msg: TWMCOPYDATA);
begin
showmessage(StrPas(Msg.CopyDataStruct^.lpData));
end;
目标程序ForHandle->ProcessID以及ThreadID->ProcessHandle->Form地址->注入或者根据Form地址读RTTI->Label地址->注入或者根据Label地址,修改Caption->发送刷新消息
能不能具体一下注释 ,有些地方还看不懂
Length(Msg)+1这里为什么要加1
GetMem(ds.lpData,ds.cbData);这个应该是分配内存的吧,如果是 为什么需要手动分配 还有分配内存为什么在ds.cbData:=Length(Msg)+1这个之后Integer(@ds))是把指针转成10进制吗?
初学delphi 问题比较弱 谢谢帅哥了
去看看TCopyDataStruct定义吧。可以发送任何数据。这个结构,几个参数你可以根据自己需要拿来用。不过使用这个 不能用postmessage
假如别人编写的,则要dll注入了
1、利用 Windows 消息通信
2、socket
3、管道
4、内存映射
随便一个都可以
越下面越复杂,不过会了以后也没什么难度。