2016-02-18 83 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