首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >钩子WH_GETMESSAGE和过滤器WM_SETTEXT

钩子WH_GETMESSAGE和过滤器WM_SETTEXT
EN

Stack Overflow用户
提问于 2016-02-18 16:35:15
回答 1查看 1.5K关注 0票数 3

使用Microsoft Spy++,我看到当您打开/创建一个新文档时,Notepad++会收到一条WM_SETTEXT消息。我需要在Windows上挂载标题更改,所以我尝试做WH_GETMESSAGE钩子,并且只过滤WM_SETTEXT。但到目前为止我还没成功。这是我的DLL:

代码语言:javascript
运行
复制
uses
  System.SysUtils,
  Windows,
  Messages,
  System.Classes;

var
  CurrentHook: HHOOK;

{$R *.res}

function GetMessageHookProc(Code: Integer; iWParam: WPARAM; iLParam: LPARAM): LRESULT; stdcall;
begin
  Result:= CallNextHookEx(CurrentHook, Code, iWParam, iLParam);
  if (Code = HC_ACTION) and (PMSG(iLParam).message = wm_settext) then
  begin
    MessageBox(0, 'WM_SETTEXT', 'WM_SETTEXT', MB_OK);

    //this code below is just a prototype to what I will try when this works:
    if IntToStr(PMSG(iLParam).lParam) = 'new - Notepad++' then
      MessageBox(0, 'Notepad++', 'Notepad++', MB_OK);

  end;
end;

procedure SetHook; stdcall;
begin
  CurrentHook:= SetWindowsHookEx(WH_GETMESSAGE, @GetMessageHookProc, HInstance, 0);
  if CurrentHook <> 0 then
    MessageBox(0, 'HOOKED', 'HOOKED', MB_OK);
end;

procedure UnsetHook; stdcall;
begin
  UnhookWindowsHookEx(CurrentHook);
end;

exports
  SetHook,
  UnsetHook;

begin

end.

我得到了“钩子”消息框,表示钩子已经解决了,但是在回调过程的if中,我从来没有得到'WM_SETTEXT‘消息框。如何只过滤这类消息,并检查消息的字符串?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-18 16:40:16

WM_SETTEXT是已发送的消息,而不是已发布的消息。WH_GETMESSAGE钩子只看到发送到目标线程的消息队列的消息,因此它将永远不会看到WM_SETTEXT消息。若要挂起直接发送到窗口而不经过消息队列的消息,您需要使用WH_CALLWNDPROCWH_CALLWNDPROCRET钩子。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35487224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档