Delphi 怎么 Hook 指定句柄窗体的消息

video999 2017-02-15 04:54:13
目前做个小程序, 需要监控 PPT的播放翻页情况, 也就是 ppt翻页后 通知主程序, 我用spy++ 看了下,ppt 翻页的时候 有消息, 请问下,如何拦截这个消息? (我目前用的方法 是用线程读取内存数据, 但是 powerpoint是32位的还好,地址都找到了, 如果是64位的 地址还没抓到, 并且不稳定, 所有想从拦截 消息方面入手,) 学习了几个 hook的例子, 都不成功
...全文
2217 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
JPEXE 2017-12-19
  • 打赏
  • 举报
回复
http://download.csdn.net/download/sololie/6271981
video999 2017-02-18
  • 打赏
  • 举报
回复
引用 9 楼 nebula845026 的回复:
或者你在Powerpoint里编写一段VB代码,直接把消息传出来也可以的吧
因为是用户环境不同, ppt版本和文件不用, 无法再ppt中插入vba脚本,
lyhoo163 2017-02-18
  • 打赏
  • 举报
回复
PPT翻页,窗口不变更,仅更换内容(页面)。
nebula845026 2017-02-17
  • 打赏
  • 举报
回复
或者你在Powerpoint里编写一段VB代码,直接把消息传出来也可以的吧
nebula845026 2017-02-17
  • 打赏
  • 举报
回复
如果只是监控翻页情况的话,我觉得你可以换个思路,使用OLE编程,直接调用PowerPoint的相应API不就可以了吗,只搞过EXCEL的,对于Powerpoint的操作没搞过
不得闲 2017-02-17
  • 打赏
  • 举报
回复
Hook窗口过程,WH_CALLWNDPROC这个钩子会勾掉所有消息的处理过程 你也可以直接替换掉窗口过程,拿到处理权限,然后SetWindowLong替换掉窗口过程
video999 2017-02-16
  • 打赏
  • 举报
回复
用 spy++ 抓取的 消息是
video999 2017-02-16
  • 打赏
  • 举报
回复
dll 代码 ,, 求大神指点下, 不进入回调函数

function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
 {
  case wParam of
    WM_MOUSEMOVE   : info := '鼠标位置';
    WM_LBUTTONDOWN : info := '按下';
    WM_LBUTTONUp   : info := '放开';
  end;
  info := Format('%s: %d,%d', [info, PMouseHookStruct(lParam)^.pt.X, PMouseHookStruct(lParam)^.pt.Y]);
  }
  {通过消息把数据传递给指定窗口}
  info:=IntToStr(wParam);
  PostMessage(h, WM_MyMessage, 0, Integer(PChar(info)));

  Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;

function SetHook: Boolean; stdcall;
const
  WH_MOUSE_LL =14;
  var h:HWND; id:Cardinal;
begin
//查找到powrpointView窗体句柄
   h:=FindWindow('PPTFrameClass',nil);
   h:=FindWindowEx(h,0,'MDIClient',nil);
   h:=FindWindowEx(h,0,'mdiClass',nil);
   h:=FindWindowEx(h,0,'paneClassDC',nil);
  id:=GetWindowThreadProcessId(h,nil);
  hook := SetWindowsHookEx(WH_CALLWNDPROC, @HookProc, HInstance,id );
  Result := hook <> 0;
end;

video999 2017-02-16
  • 打赏
  • 举报
回复
对hook不太懂, 我对着万一的博客中的例子 做全局鼠标钩子 或者键盘钩子 都能拦截, 但是 拦截指定窗体 , 只能拦截本程序, 不能拦截到 ppt的窗体 hook:=setWindowsHookEx(WH_cat,proc,HInstance,0); 或者 hook:=setWindowsHookEx(WH_cat,proc,HInstance,PPPTPid); 都这样,
video999 2017-02-16
  • 打赏
  • 举报
回复
不懂.... 如果您方便的化, 能不能写个简单的demo , 万分感谢
ynquan 2017-02-16
  • 打赏
  • 举报
回复
做全局鼠标钩子 或者键盘钩子才行。应为进程在不同内存空间不能互相访问。 必须注入动态链接库时自己的程序和别的程序共享一个内存块才能从别个程序中获取信息。
武稀松 2017-02-15
  • 打赏
  • 举报
回复
取得窗口句柄所在线程的ID,因为SetWindowsHOOK要的参数是线程ID

1,184

社区成员

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

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