最近在做一个上位机程序,要求跟一个delphi写的视频播放器作实时时间同步,也就是在程序里面要得到这个播放器的现在实时播放时间,如果这个播放时间是用label显示的,能不能用sendmessage函数发一个WM_GETTEXT给底下这个Tpanel控件,得到它里面子控件label上的播放时间,如果不能的话,还有没有其它的方式能得到这个播放时间?

解决方案 »

  1.   

    一定要用DELPHI写的那个视频播放器吗?有些播放器有接口的,专门有函数可以去读取这些东西的
      

  2.   

    太歪了。。试试KMPlayer吧,有接口。
      

  3.   

    老大写出来分享一下  个人用啊!   derboh  1027803281  我qq
      

  4.   

    你自己先试试发WM_GETTEXT消息能不能再说了
      

  5.   

    窗口类构件取文本轻而易举,非窗口类就难了。没有 handle,不知道抓哪儿。
      

  6.   

    试了一下,WM_GETEXT好像不能跨进程抓文本,所以要先将代码注入到播放器的那个进程后才能抓,现在更麻烦的是我用spy++只找到了Tpanel的句柄,还不知道Tpanel里面有没有子控件,如果播放时间不是用label之类的子控件显示的话,就不知道要怎么得到这个播放时间了。
      

  7.   

    先用OD之类的找出这个字串的地址,用dll注入这播放器进程,直接读取这个时间字串。
      

  8.   

    按楼上的思路,用CE手动搜索出了这个字串每个字在内存中的地址,但是问题是这些地址是动态地址,每次程序运行地址都不一样,没办法用ReadProcessMemory函数读取它的值,对汇编不熟,看那反编绎的代码看不太懂,请问要怎么样注入代码才能得到字串字址?
      

  9.   

    播放器发我试试看[email protected]
      

  10.   

    你地址没对,找对基址就行了。
    用OD跟了下,字串的地址是 $0c8a58c,注意这个字串是unicode的。
    你用 ReadProcessMemory 读取下看看取值是否正确。
      

  11.   

    谢谢sololie的帮忙,$0c8a58c这个地址是偏移吗?是不是要找到它的基址再跟这个偏移加一下才是真正的地址?用CE找能找到三个地址,按网上的教程试着跟踪了一下,找了一晚上还是没找到基址,字串的地址好像是在ESI寄存器里,到这就不知道要怎么跟了,后来下了OD看了一下,发现这东西还是有点专业,不知道怎么用,没办法,我是做单片机软件开发的,计算机软件这块确实不太懂,所以只能再上来请你帮忙了,不知道方不方便留个QQ号或其它的联系方式,我想再向请教一下。
      

  12.   

    0c8a58c是基址, 就是个这个字串地址的指针我不是把例子邮件发给你了么,能应付上面交差就行了。
    OD里找有个思路就行了,比如你CE能找出一个地址,不管它是不是基址,先在OD里转到这个地址,
    然后给它下个内存或者硬件读或写的断点,因为这个时长字串肯定会有个timer在反复读或写它,
    断点肯定马下能断下,然后你在栈列表里看,有多层地址在调用它,而且压栈的参数也能看到那个字串了,
    在调用处右键选择跟入调用处的地址,结合寄存器内值来往上返溯很快就能找到根源了的。
    大致如此,感觉你要问的东西越多,我初学者应付不过来啊,这贴就到这吧。
      

  13.   


    // 在窗体上放个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;
      

  14.   

    用调试工具比如OD,WINDBG等分析出时间变量的内存地址,读这块内存即可.和做游戏外挂差不多的