Конференция "WinAPI" » WindowHook WH_CALLWNDPROCRET
 
  • zensan © (06.10.08 14:57) [0]
    Добрый день!

    У меня небольшой конфуз...
    Написал хук WH_CALLWNDPROCRET.
    Вызывающая программа (Console):

    H := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'xxx.dll'));
     Writeln(H);
     HookProc := GetProcAddress(H, 'HookProc');
     Hook := SetWindowsHookEx(WH_CALLWNDPROCRET, HookProc, H, 0);
     Writeln(Hook);
     Readln;

     UnhookWindowsHookEx(Hook);
     FreeLibrary(H);


    Сам хук длл:

    function HookProc(nCode, wParam, lParam: Integer): Integer; stdcall;
    var
     F: TextFile;
     H: THandle;
     Info: TCWPRetStruct;
    begin
     if nCode < 0 then
       begin
         Result := CallNextHookEx(0, nCode, wParam, lParam);
         Exit;
       end;

     H := CreateMutex(nil, False, StrMutex);
     if H <> 0 then
       begin
         WaitForSingleObject(H, INFINITE);

         Info :=  PCWPRetStruct(lParam)^;

         with Info do
           try
             AssignFile(F, Path);
             if FileExists(Path) then
               Append(F)
             else
               Rewrite(F);
             Writeln(F, Format('%s', [MessageToStr(message)]));
             CloseFile(f);
           except
           end;

         ReleaseMutex(H);
         CloseHandle(H);
       end;

     Result := CallNextHookEx(0, nCode, wParam, lParam);
    end;



    MessageToStr - это моя функция, которая переводит код сообшения в текст его константы (по messages.pas).

    Так вот я думал там будут все сообщения системы. А оказалось только такие:
    WM_NCCREATE
    WM_NCCALCSIZE
    ACN_START
    BN_DBLCLK
    BN_UNHILITE
    TB_BUTTONCOUNT
    EM_HIDESELECTION
    HKM_SETRULES
    PBM_GETRANGE

    А в MSDN читал...
    "The system calls this function after the SendMessage function is called. The hook procedure can examine the message; it cannot modify it."
    http://msdn.microsoft.com/en-us/library/ms644976(VS.85).aspx

    Я не силён в этих хитростях всех. Может я что-то не так делаю?
  • ZENsan © (06.10.08 15:14) [1]
    На самом деле там есть сообшения WM_ACTIVATE, WM_ACTIVATEAPP. No WM_KEYDOWN чего-то нету..

    Мне нужен хюк, который бы проверял мой код сообщения (WM_USER + XXX).
    И если это происходит, то он производил определённые операции с окном, которому посылается сообщение. Но WM_USER + xxx никогда не срабатывает в хуке...
  • Сергей М. © (06.10.08 15:48) [2]

    > WM_KEYDOWN чего-то нету


    Потому что оно не "sent to window procedures by the SendMessage function".
  • ZENsan © (06.10.08 16:03) [3]
    Поясните...

    Я запускаю нотепад, пишу там текст..
    И оно не "sent"...?
  • ZENsan © (06.10.08 16:05) [4]
    Меня на самом деле абсолютно не интересует WM_KEYDOWN и другие подобные сообшения. Меня интересует почему не срабатывает WM_USER + 1600 (к примеру), посланное окну Notepad. Но в хуке такого сообщения как небыло.. Или мне там надо какой-то RegisterMessage делать. Что мне для этого надо?
  • Сергей М. © (06.10.08 16:14) [5]

    > И оно не "sent"...?


    Оно sent, но не by the SendMessage function.


    > почему не срабатывает WM_USER + 1600 (к примеру), посланное
    > окну Notepad. Но в хуке такого сообщения как небыло


    Значит, на самом деле оно либо не было послано, либо послано не с пом. SendMessage, либо послано вовсе не туда куда ожидалось.
  • ZENsan © (06.10.08 16:19) [6]
    Спасибо. Всё работает. Просто необходимо регистрировать сообщение.

    Сам хук:

     if nCode < 0 then
       begin
         Result := CallNextHookEx(0, nCode, wParam, lParam);
         Exit;
       end;

     H := CreateMutex(nil, False, StrMutex);
     if H <> 0 then
       begin
         WaitForSingleObject(H, INFINITE);

         Info :=  PCWPRetStruct(lParam)^;

         with Info do
         if Info.message = RegisterWindowMessage('SomeMsgName') then
           try
             AssignFile(F, Path);
             if FileExists(Path) then
               Append(F)
             else
               Rewrite(F);
             Text := '';
             GetWindowText(hwnd, Text, 255);
             Writeln(F, Format('%s - %d (%s)', [MessageToStr(message), hwnd, Text]));
             CloseFile(f);
           except
           end;

         ReleaseMutex(H);
         CloseHandle(H);
       end;

     Result := CallNextHookEx(0, nCode, wParam, lParam);



    И прога, которой нужно послать задачу - должна юзать тот-же синтаксис:
    RegisterWindowMessage('SomeMsgName')


       SendNotifyMessage(GetForegroundWindow, RegisterWindowMessage('SomeMsgName'), 1024, 10);



    И тогда всё пашет. Ещё раз спасибо. Прошу прошенье, что автоответил на свой же вопрос.. Просто только сеичас допер до того RegisterWindowMessage.
 
Конференция "WinAPI" » WindowHook WH_CALLWNDPROCRET
Есть новые Нет новых   [134435   +33][b:0][p:0.002]