一个delphi写的视频播放器,怎么在另一个程序里得到它的实时播放时间 最近在做一个上位机程序,要求跟一个delphi写的视频播放器作实时时间同步,也就是在程序里面要得到这个播放器的现在实时播放时间,如果这个播放时间是用label显示的,能不能用sendmessage函数发一个WM_GETTEXT给底下这个Tpanel控件,得到它里面子控件label上的播放时间,如果不能的话,还有没有其它的方式能得到这个播放时间? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一定要用DELPHI写的那个视频播放器吗?有些播放器有接口的,专门有函数可以去读取这些东西的 太歪了。。试试KMPlayer吧,有接口。 老大写出来分享一下 个人用啊! derboh 1027803281 我qq 你自己先试试发WM_GETTEXT消息能不能再说了 窗口类构件取文本轻而易举,非窗口类就难了。没有 handle,不知道抓哪儿。 试了一下,WM_GETEXT好像不能跨进程抓文本,所以要先将代码注入到播放器的那个进程后才能抓,现在更麻烦的是我用spy++只找到了Tpanel的句柄,还不知道Tpanel里面有没有子控件,如果播放时间不是用label之类的子控件显示的话,就不知道要怎么得到这个播放时间了。 先用OD之类的找出这个字串的地址,用dll注入这播放器进程,直接读取这个时间字串。 按楼上的思路,用CE手动搜索出了这个字串每个字在内存中的地址,但是问题是这些地址是动态地址,每次程序运行地址都不一样,没办法用ReadProcessMemory函数读取它的值,对汇编不熟,看那反编绎的代码看不太懂,请问要怎么样注入代码才能得到字串字址? 播放器发我试试看[email protected] 你地址没对,找对基址就行了。用OD跟了下,字串的地址是 $0c8a58c,注意这个字串是unicode的。你用 ReadProcessMemory 读取下看看取值是否正确。 谢谢sololie的帮忙,$0c8a58c这个地址是偏移吗?是不是要找到它的基址再跟这个偏移加一下才是真正的地址?用CE找能找到三个地址,按网上的教程试着跟踪了一下,找了一晚上还是没找到基址,字串的地址好像是在ESI寄存器里,到这就不知道要怎么跟了,后来下了OD看了一下,发现这东西还是有点专业,不知道怎么用,没办法,我是做单片机软件开发的,计算机软件这块确实不太懂,所以只能再上来请你帮忙了,不知道方不方便留个QQ号或其它的联系方式,我想再向请教一下。 0c8a58c是基址, 就是个这个字串地址的指针我不是把例子邮件发给你了么,能应付上面交差就行了。OD里找有个思路就行了,比如你CE能找出一个地址,不管它是不是基址,先在OD里转到这个地址,然后给它下个内存或者硬件读或写的断点,因为这个时长字串肯定会有个timer在反复读或写它,断点肯定马下能断下,然后你在栈列表里看,有多层地址在调用它,而且压栈的参数也能看到那个字串了,在调用处右键选择跟入调用处的地址,结合寄存器内值来往上返溯很快就能找到根源了的。大致如此,感觉你要问的东西越多,我初学者应付不过来啊,这贴就到这吧。 // 在窗体上放个timer,隔秒调用下面函数显示function GetMemStr(): PWideChar;var playerHwd: HWND; playerPId, PlayerPrc: THandle; resStrVal: array[0..31] of WideChar; resDworVal, readBytes: DWORD; addr: Pointer;begin Result := resStrVal; addr := Pointer($0C8A58C); // 基址 c8a58c playerHwd := FindWindow(nil, 'Stereoscopic Player'); if playerHwd > 0 then begin GetWindowThreadProcessId(playerHwd, playerPId); PlayerPrc := OpenProcess(PROCESS_ALL_ACCESS, False, playerPId); // 取出字串地址 ReadProcessMemory(PlayerPrc, addr, @resDworVal, 4, readBytes); if resDworVal > 0 then begin addr := Pointer(resDworVal); // du [c8a58c] // 取出字串内容 ReadProcessMemory(PlayerPrc, addr, @resStrVal, 48, readBytes); end; end;end; 用调试工具比如OD,WINDBG等分析出时间变量的内存地址,读这块内存即可.和做游戏外挂差不多的 如何写论文才能发表在期刊上,或者被EI引用? 请问大家 这个是 delphi里面的宏吗??? 如何用SQL表达这种查询!请大家赐教!谢谢 fastreport如何控制检索参数? 网络共享问题???急 如何实现indy9 UDPServer多线程? delphi中调用jar包的问题(现金求助) ADOQuery Sort stringGrid控件怎么设置当前选中的项目,比如让rows[5]被选中? 关于delphi数据库多用户操作问题 窗口关闭问题 怎么动态加载BPL
用OD跟了下,字串的地址是 $0c8a58c,注意这个字串是unicode的。
你用 ReadProcessMemory 读取下看看取值是否正确。
OD里找有个思路就行了,比如你CE能找出一个地址,不管它是不是基址,先在OD里转到这个地址,
然后给它下个内存或者硬件读或写的断点,因为这个时长字串肯定会有个timer在反复读或写它,
断点肯定马下能断下,然后你在栈列表里看,有多层地址在调用它,而且压栈的参数也能看到那个字串了,
在调用处右键选择跟入调用处的地址,结合寄存器内值来往上返溯很快就能找到根源了的。
大致如此,感觉你要问的东西越多,我初学者应付不过来啊,这贴就到这吧。
// 在窗体上放个timer,隔秒调用下面函数显示function GetMemStr(): PWideChar;
var
playerHwd: HWND;
playerPId, PlayerPrc: THandle;
resStrVal: array[0..31] of WideChar;
resDworVal, readBytes: DWORD;
addr: Pointer;
begin
Result := resStrVal;
addr := Pointer($0C8A58C); // 基址 c8a58c playerHwd := FindWindow(nil, 'Stereoscopic Player');
if playerHwd > 0 then
begin
GetWindowThreadProcessId(playerHwd, playerPId);
PlayerPrc := OpenProcess(PROCESS_ALL_ACCESS, False, playerPId);
// 取出字串地址
ReadProcessMemory(PlayerPrc, addr, @resDworVal, 4, readBytes); if resDworVal > 0 then
begin
addr := Pointer(resDworVal); // du [c8a58c]
// 取出字串内容
ReadProcessMemory(PlayerPrc, addr, @resStrVal, 48, readBytes);
end;
end;
end;