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

video999 2017-02-15 04:54:13
目前做个小程序, 需要监控 PPT的播放翻页情况, 也就是 ppt翻页后 通知主程序, 我用spy++ 看了下,ppt 翻页的时候 有消息, 请问下,如何拦截这个消息? (我目前用的方法 是用线程读取内存数据, 但是 powerpoint是32位的还好,地址都找到了, 如果是64位的 地址还没抓到, 并且不稳定, 所有想从拦截 消息方面入手,) 学习了几个 hook的例子, 都不成功
...全文
2111 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
MsgInfo V1.00(一)、说明一个用来察看当前进程中消息的控件,D6环境编译。(二)、属性1、ShowType: MSGHex: 是否显示消息ID(16进制) MSGDec: 是否显示消息ID(10进制) MSGStr: 是否显示消息ID(字符串) MsgClassName:是否显示窗体类名 MsgHwnd: 是否显示窗体句柄 MsgWParam: 是否显示消息WParam值 MsgLParam: 是否显示消息LParam值2、DefineClassName: 允许(禁止)显示消息窗体类名,如TForm13、DefineMsg: 允许(禁止)显示的消息ID,如$0005、wm_paint4、DefineState: EnableMsg: DefineMsg不为空串时,False禁止显示加入DefineMsg的消息,True只显示加入DefineMsg的消息 EnableClassName: DefinClassName不为空串时,False禁止显示加入DefineClassName的消息,True只显示加入DefineMsg的消息 EnableHwnd: 设置了AddDefineHwnd后,False禁止显示ADDDefineHwnd加入的窗体句柄消息,True则只显示加入的窗体句柄消息 EnableClassName和EnableHwnd设置不一致时,以EnableClassName为准5、DisableFrequent:是否过滤掉WM_NCHITTEST、WM_SETCURSOR、WM_ENTERIDLE、WM_NOTIFY出现频繁的消息6、HookType: 设置钩子类型7、Activate: 是否激活钩子(三)、方法1、AddDefineHwnd(): 加入的句柄为允许(禁止)显示消息窗体句柄(可加入多个)2、Clear: 清空消息信息(四)、事件HookMethod: 可以在此事件中自行处理钩子,钩子返回值Result默认为0 注意在处理CBT钩子的HCBT_CreateWnd时,设计期拖放到窗体的控件还未创建,使用这些控件的属性和方法会出现异常。 (五)、文件MsgInfo.txt是参考文件,必须放入执行程序当前目录。此文件可自定义或扩充,无需排序格式:第一行表示消息ID的十六进制字符串,如$0005,必须$开头 第二行表示消息ID的字符串常量,如WM_Size 第三行表示该消息的说明(可省略)MsgResult.txt显示结果(六)、制作双元软件工作室http://shuangyuan.wx-e.com/

1,183

社区成员

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

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