Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
1-1226584393
CodeMaster
2008-11-13 16:53
2009.11.29
ListBox


15-1254375904
VladOfMonster
2009-10-01 09:45
2009.11.29
Где найти значки для панели инструментов


15-1249471484
pasha_golub
2009-08-05 15:24
2009.11.29
Игрушки


15-1254429012
Юрий
2009-10-02 00:30
2009.11.29
С днем рождения ! 2 октября 2009 пятница


3-1213982498
312kbps
2008-06-20 21:21
2009.11.29
ADOCommand.Parameters.CreateParameter





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский