2016-02-18 52 views
3

使用Microsoft Spy ++我看到Notepad ++收到WM_SETTEXT消息,当您打开/创建一个新文档。我需要在Windows上挂钩标题更改,因此我正在尝试执行WH_GETMESSAGE挂钩,并且仅筛选WM_SETTEXT。但到目前为止我没有成功。这里是我的DLL:钩WH_GETMESSAGE和筛选WM_SETTEXT只有

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. 

我得到“上钩”的消息框,表明钩被安定了,但如果回调过程中我从来没有得到内部的“WM_SETTEXT”消息框。我怎样才能过滤这种消息,并检查消息的字符串?

谢谢!

回答

4

WM_SETTEXT发送消息,而不是一个消息。 A WH_GETMESSAGE挂钩只能看到消息已发送到目标线程的消息队列,因此它永远不会看到WM_SETTEXT消息。要挂接的邮件直接发送到一个窗口而不通过邮件队列,则需要使用WH_CALLWNDPROCWH_CALLWNDPROCRET钩子。

+0

认真吗?感谢上帝我做了这个问题,因为我永远不会知道发生了什么......奇怪的是,我在Internet上找到了一些用WH_GETMESSAGE钩子显示WM_SETTEXT的例子。我不知道为什么,因为分析你的假设,没有一个是合理的......大声笑!我应该接受这个答案,还是想用CALLWNDPROC钩子来制定和举例? – LessStress

+1

Spy ++显示记录的消息发送与发送的时间。注意它的输出。至于钩子本身,在编码方面,WH_CALLWNDPROC/RET钩子与WH_GETMESSAGE钩子没有什么不同。用['PCWPSTRUCT']替换'PMSG'(https://msdn.microsoft.com/en-us/library/windows/desktop/ms644964.aspx)/ ['PCWPRETSTRUCT'](https://msdn.microsoft。 com/en-us/library/windows/desktop/ms644963.aspx)并根据需要使用其消息相关字段。阅读文档 –

+0

是的男人,我已经得到它的工作!谢谢!最好的祝愿。 – LessStress