Главная страница
    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.47 MB
Время: 0.005 c
1-1225831632
lemur
2008-11-04 23:47
2009.11.29
Поиск слова в RichEdit


15-1253465872
Кто б сомневался
2009-09-20 20:57
2009.11.29
Помогите перевести


2-1255402700
Lucia
2009-10-13 06:58
2009.11.29
Подскажите компонент для отчета с возможностью редактирования гот


3-1230124390
interbase
2008-12-24 16:13
2009.11.29
без sp_executeSQL не обойтись?


15-1254078510
DillerXX
2009-09-27 23:08
2009.11.29
подскажите как сделать avi из картинки + mp3





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский