Delphi 怎么 Hook 指定句柄窗体的消息 目前做个小程序, 需要监控 PPT的播放翻页情况, 也就是 ppt翻页后 通知主程序, 我用spy++ 看了下,ppt 翻页的时候 有消息, 请问下,如何拦截这个消息? (我目前用的方法 是用线程读取内存数据, 但是 powerpoint是32位的还好,地址都找到了, 如果是64位的 地址还没抓到, 并且不稳定, 所有想从拦截 消息方面入手,) 学习了几个 hook的例子, 都不成功 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 取得窗口句柄所在线程的ID,因为SetWindowsHOOK要的参数是线程ID 对hook不太懂, 我对着万一的博客中的例子 做全局鼠标钩子 或者键盘钩子 都能拦截, 但是 拦截指定窗体 , 只能拦截本程序, 不能拦截到 ppt的窗体 hook:=setWindowsHookEx(WH_cat,proc,HInstance,0); 或者 hook:=setWindowsHookEx(WH_cat,proc,HInstance,PPPTPid); 都这样, 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; 用 spy++ 抓取的 消息是 不懂.... 如果您方便的化, 能不能写个简单的demo , 万分感谢 Hook窗口过程,WH_CALLWNDPROC这个钩子会勾掉所有消息的处理过程你也可以直接替换掉窗口过程,拿到处理权限,然后SetWindowLong替换掉窗口过程 如果只是监控翻页情况的话,我觉得你可以换个思路,使用OLE编程,直接调用PowerPoint的相应API不就可以了吗,只搞过EXCEL的,对于Powerpoint的操作没搞过 或者你在Powerpoint里编写一段VB代码,直接把消息传出来也可以的吧 PPT翻页,窗口不变更,仅更换内容(页面)。 因为是用户环境不同, ppt版本和文件不用, 无法再ppt中插入vba脚本, http://download.csdn.net/download/sololie/6271981 C#截取WM_PAINT消息进行图片绘制问题。望不吝赐教... 我公司的表格控件,感觉不错,我很喜欢,看看是什么表格控件 如何判断winsock的客户端已经异常中断 已知X,y坐标和里面的圆弧曲线怎么求曲线的方程式 Delphi5使用ADO总是遇到这个错误,怎么解决? 数据库中的多个ole对象怎么再输出到同一个word中? 十万火急!!!哪位高人知道如何用API将其它内存中的某些字符串读取出来。假设我已经偏移量地址。和ID for语句每次递增2个,怎么办??? 这是什么错误 帮忙指点一下? 问一个C++调用delphi编写的dll的问题。麻烦有空的看看。 找出满足指定条件的任一序列
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;
你也可以直接替换掉窗口过程,拿到处理权限,然后SetWindowLong替换掉窗口过程
因为是用户环境不同, ppt版本和文件不用, 无法再ppt中插入vba脚本,