挂钩WH_GETMESSAGE并仅过滤WM_SETTEXT

时间:2016-02-18 16:35:15

标签: delphi setwindowshookex

使用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'消息框。如何只过滤此类消息,并检查消息的字符串?

谢谢!

1 个答案:

答案 0 :(得分:4)

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