![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WindowHook WH_CALLWNDPROCRET
zensan © (2008-10-06 14:57:00)Добрый день!
У меня небольшой конфуз...
Написал хук 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 16:19:00) [1]Спасибо. Всё работает. Просто необходимо регистрировать сообщение.
Сам хук:
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.
Сергей М. (2008-10-06 16:14:00) [2]
> И оно не "sent"...?
Оно sent, но неby the SendMessage function.
> почему не срабатывает WM_USER + 1600 (к примеру), посланное
> окну Notepad. Но в хуке такого сообщения как небыло
Значит, на самом деле оно либо не было послано, либо послано не с пом. SendMessage, либо послано вовсе не туда куда ожидалось.
ZENsan (2008-10-06 16:05:00) [3]Меня на самом деле абсолютно не интересует WM_KEYDOWN и другие подобные сообшения. Меня интересует почему не срабатывает WM_USER + 1600 (к примеру), посланное окну Notepad. Но в хуке такого сообщения как небыло.. Или мне там надо какой-то RegisterMessage делать. Что мне для этого надо?
ZENsan (2008-10-06 16:03:00) [4]Поясните...
Я запускаю нотепад, пишу там текст..
И оно не "sent"...?
Сергей М. (2008-10-06 15:48:00) [5]
> WM_KEYDOWN чего-то нету
Потому что оно не"sent to window procedures by the SendMessage function".
ZENsan (2008-10-06 15:14:00) [6]На самом деле там есть сообшения WM_ACTIVATE, WM_ACTIVATEAPP. No WM_KEYDOWN чего-то нету..
Мне нужен хюк, который бы проверял мой код сообщения (WM_USER + XXX).
И если это происходит, то он производил определённые операции с окном, которому посылается сообщение. Но WM_USER + xxx никогда не срабатывает в хуке...