【问题标题】:Hook WH_GETMESSAGE and filter WM_SETTEXT only仅挂钩 WH_GETMESSAGE 并过滤 WM_SETTEXT
【发布时间】:2016-02-18 16:35:15
【问题描述】:

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

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.

我收到“HOOKED”消息框,表明挂钩已解决,但我从未在回调过程的 if 中收到“WM_SETTEXT”消息框。如何只过滤这种消息,并检查消息的字符串?

谢谢!

【问题讨论】:

    标签: delphi setwindowshookex


    【解决方案1】:

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

    【讨论】:

    • 认真的吗?感谢上帝,我做了这个问题,因为我永远不会弄清楚发生了什么......奇怪的是,我在互联网上找到了一些显示 WM_SETTEXT 与 WH_GETMESSAGE 挂钩的示例。我不知道为什么,因为分析你的假设,它们都没有意义......哈哈!我应该接受这个答案还是你想使用 CALLWNDPROC 钩子来制定和举例?
    • Spy++ 向您显示记录的消息何时发布与发送。注意它的输出。至于钩子本身,WH_CALLWNDPROC/RET 钩子在编码方面与WH_GETMESSAGE 钩子没有太大区别。将PMSG 替换为PCWPSTRUCT/PCWPRETSTRUCT 并根据需要使用其与消息相关的字段。阅读文档
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2021-02-09
    相关资源
    最近更新 更多