DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hfh9801
今日帖子: 0
在线用户: 1
导航: 论坛 -> Web应用开发 斑竹:bodies  
作者:
女 chfchf (chfchf) ★☆☆☆☆ -
普通会员
2015/1/14 23:35:43
标题:
问大家一个新知,望不吝赐教 浏览:4322
加入我的收藏
楼主: 千牛旺旺聊天窗口用spy++查看是,经查验是由webkit内核
构建的类似CHROME谷歌浏览器的一样的一个控件生成。

在这2014年以前的卖家旺旺版的聊天记录窗口
是由微软的IE控件生成的,可以直接通过以下
delphi源码直接获取:
type
  TObjectFromLResult = function(LRESULT: lResult; const IID: TGUID; WPARAM: wParam; out pObject): HRESULT; stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  MSG: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
  hInst := LoadLibrary('Oleacc.dll');
  @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then
  begin
    try
      MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
    finally
      FreeLibrary(hInst);
    end;
  end;
end;

function EnumChildProc(H: hwnd; LP: integer): boolean;  stdcall;
var
  p: pChar;
  ie: IWebbrowser2;
begin
  result := true;
  GetMem(p, 255);
  GetClassName(h, p, 255);
  try
    if p = 'Internet Explorer_Server' then
    begin
     // result := false;
      if GetIEFromHWND(h, ie) = s_OK then
      begin
        form1.mmo1.Lines.Add((ie.Document as IHTMLDocument2).body.outertext)
      end;
    end;
  finally  FreeMem(p, 255); end;

end;


procedure TForm1.tmr1Timer(Sender: TObject);
var
  h: hwnd;
  buffer: array[0..512] of char;
begin
  h := FindWindow('StandardFrame', '聊天窗口标题');
  if h <> 0 then
    EnumChildWindows(h, @EnumChildProc, LongInt(@ buffer[0]));
    //很奇怪,用 findwindowEx 传递 IE 的 ClassName 找不到结果,所以了窗口枚举

end;

那么我想请教大家,如何在新版的千牛上获得聊天记录?
对webkit实在是迷茫至极,一直不知所措,希望有哪位大侠给我略点一二,谢谢。
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/1/15 14:21:05
1楼: 用api接口,可以直接读取的.
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
女 chfchf (chfchf) ★☆☆☆☆ -
普通会员
2015/1/15 20:56:27
2楼: 乐天无极,你说的api是指win32底层api还是淘宝官网提供的api接口?如果是win32底层api,那么请指点一二,鄙人不才,很是迷茫。如果是指淘宝官网开放的api,那么我回头就去作下了解。谢谢
----------------------------------------------
-
作者:
女 chfchf (chfchf) ★☆☆☆☆ -
普通会员
2015/1/15 21:22:29
3楼: 刚测了一下,淘宝官网的api不行,是个增值包,不是免费调用的,需申请应用上线且付费使用。
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/1/16 3:51:14
4楼: 官方API不能读取的话,那就只剩句柄...
问题是,你会找句柄ID不???类似游戏外挂的那种方式,用vc下的spy++或其他类似工具

按此在新窗口浏览图片
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/1/16 3:54:39
5楼: 可以考虑用外挂的方式实现.
把聊天窗口在桌面上固定,再读取指定坐标的句柄,有些外挂就这么写的.....基于平民操作的实话,比如找茬.
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
女 chfchf (chfchf) ★☆☆☆☆ -
普通会员
2015/1/16 9:28:20
6楼: 是这样子的,用句柄的话,没有办法,因为不管是先前的旺旺版本上的IE控件,还是旺旺之后的千牛版本中的chrome控件,都属于一种无句柄状态下的情况,用SPY++是可以看到句柄,但那只是一种效果,IE和chrome的实际上是获取不到窗口句柄的。如果是IE的话,盒子上已有人实现了内容的抓取,方法就是载入olecaa.dll,将wm_html_getobject的消息发送到旺旺窗口,取得webbrowser的指针地址,就可以对旺旺窗口的聊天记录内录进行任意操作了,包括取其html源码。但是千牛是chrome,官网上说是内核是webkit的,webkit引擎它的作用就是对文档对进排版,但是它的排版机制不像IE那样,而是将生成的解析树内容直接以绘图的形式呈现出来。。。嗯,不好搞,除非对webkit的内核有深入的了解,然后看能不能也载入一个webkit提供的win32函数,再将webkit的底层消息发送到千牛窗口,获得webkit的地址,再进行操作,取得内容。
----------------------------------------------
-
作者:
女 chfchf (chfchf) ★☆☆☆☆ -
普通会员
2015/1/16 9:32:12
7楼: 外挂的方式是可以实现,就是像你说的那样,取得千牛的框架窗口句柄后,再取其相对于屏幕位置的坐标getwindowsrect这个函数,然后再确实上图红色区域的相对坐标位置,模拟按键的方法,复制和粘贴,由剪切板取数据供应用程序使用,,但这样的结果是,效率将是十分低下,如果同时了现多个千牛窗口,恐乱了方寸,且效率不说。
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/1/16 11:02:16
8楼: 用鼠标可以获取句柄的,直接就能获取文本..没那么麻烦,你没看我截图的那工具.
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
女 chfchf (chfchf) ★☆☆☆☆ -
普通会员
2015/1/16 13:29:25
9楼: 你是说通过上面的唯一标识获得句柄后,再用wm_gettxt这样的消息来获取文本域?
试过,不行。那如果是你说的采用外挂的形式来实现,仍然要用到唯一标识的话,我就不懂了。因为我所了解的外挂形式一般是认为在获取到句柄后,采用模拟按键的方法来完成。这个方法前面已叙述过。那如果是模拟按键,又何须那唯一标识,直取整个的千牛框架句柄即可。如不模拟按键,还望赐教。谢谢
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/1/16 15:18:45
10楼: 我知道为啥,不能读取了.
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/1/16 16:17:39
11楼: 问题出在:
一般的Windows控件,都有一个HWND,用与占据一块屏幕,捕获系统消息。
Chrome中的View只是保存控件相关信息和绘制控件,里面没有HWND句柄,因此不能够捕获系统消息。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/1/16 16:42:10
12楼: AEF_RenderWidgetHostHWND
这个里面的东西都是绘画出来的,而webkit控件无句柄.
所以,用句柄读取是没法获取文本内容的.

模拟外挂是可行的...但不知道,内存call的行不行..
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 ddgboy (痛也不哭) ★☆☆☆☆ -
盒子活跃会员
2016/7/25 0:26:20
13楼: 楼主好像最终解决了此问题,能说说大概是怎样解决的吗?多谢啦。
----------------------------------------------
时间不会冲淡一切,真爱永远~~~~~~
作者:
男 fky1989 (fky1989) ▲▲▲▲▲ -
普通会员
2016/7/25 11:42:12
14楼: 好叼的样子,看都看不懂。。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行99.60938毫秒 RSS