2016-02-18 10 views
3

Использование Microsoft Spy ++ Я вижу, что Notepad ++ получает сообщение WM_SETTEXT при открытии/создании нового документа. Мне нужно связать изменения заголовка в Windows, поэтому я пытаюсь сделать крюк WH_GETMESSAGE и фильтровать только WM_SETTEXT. Но пока я не увенчался успехом. Вот моя DLL:Hook 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 hook видит только сообщения в очередь сообщений целевой очереди, поэтому он никогда не увидит WM_SETTEXT сообщений. Чтобы перехватить сообщения, которые отправили прямо в окно, не пройдя очередь сообщений, вам нужно вместо этого использовать крюк или WH_CALLWNDPROCRET.

+0

Серьезно? Слава богу, я задал этот вопрос, потому что я никогда не понял бы, что происходит ... И странно, я нашел несколько примеров в Интернете, которые показывают WM_SETTEXT с крюком WH_GETMESSAGE. Я не знаю, почему, потому что, анализируя ваши предположения, ни один из них не имеет смысла ... lol! Должен ли я принять этот ответ, или вы хотите сформулировать и пример, используя крючок CALLWNDPROC? – LessStress

+1

Spy ++ показывает вам, когда отправлено зарегистрированное сообщение vs sent. Обратите внимание на его выход. Что касается самого крючка, крюк WH_CALLWNDPROC/RET не сильно отличается от крюка WH_GETMESSAGE в терминах кодирования. Замените 'PMSG' на [' PCWPSTRUCT'] (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