Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.29;
Скачать: CL | DM;

Вниз

WindowHook WH_CALLWNDPROCRET   Найти похожие ветки 

 
zensan ©   (2008-10-06 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 ©   (2008-10-06 15:14) [1]

На самом деле там есть сообшения WM_ACTIVATE, WM_ACTIVATEAPP. No WM_KEYDOWN чего-то нету..

Мне нужен хюк, который бы проверял мой код сообщения (WM_USER + XXX).
И если это происходит, то он производил определённые операции с окном, которому посылается сообщение. Но WM_USER + xxx никогда не срабатывает в хуке...


 
Сергей М. ©   (2008-10-06 15:48) [2]


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


Потому что оно не "sent to window procedures by the SendMessage function".


 
ZENsan ©   (2008-10-06 16:03) [3]

Поясните...

Я запускаю нотепад, пишу там текст..
И оно не "sent"...?


 
ZENsan ©   (2008-10-06 16:05) [4]

Меня на самом деле абсолютно не интересует WM_KEYDOWN и другие подобные сообшения. Меня интересует почему не срабатывает WM_USER + 1600 (к примеру), посланное окну Notepad. Но в хуке такого сообщения как небыло.. Или мне там надо какой-то RegisterMessage делать. Что мне для этого надо?


 
Сергей М. ©   (2008-10-06 16:14) [5]


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


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


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


Значит, на самом деле оно либо не было послано, либо послано не с пом. SendMessage, либо послано вовсе не туда куда ожидалось.


 
ZENsan ©   (2008-10-06 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.



Страницы: 1 вся ветка

Текущий архив: 2009.11.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
15-1254148562
xayam
2009-09-28 18:36
2009.11.29
Напомните как называется фильм


4-1223137103
Tirael
2008-10-04 20:18
2009.11.29
CreateProcess и параметры с пробелом


2-1255353949
Vitaly38
2009-10-12 17:25
2009.11.29
Сортировка массива


2-1255524766
MonoLife
2009-10-14 16:52
2009.11.29
"Чужое" окно.


1-1226654376
anonim
2008-11-14 12:19
2009.11.29
FormStyle