-
Добрый день! У меня небольшой конфуз... Написал хук 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 Я не силён в этих хитростях всех. Может я что-то не так делаю?
-
На самом деле там есть сообшения WM_ACTIVATE, WM_ACTIVATEAPP. No WM_KEYDOWN чего-то нету..
Мне нужен хюк, который бы проверял мой код сообщения (WM_USER + XXX). И если это происходит, то он производил определённые операции с окном, которому посылается сообщение. Но WM_USER + xxx никогда не срабатывает в хуке...
-
> WM_KEYDOWN чего-то нету
Потому что оно не "sent to window procedures by the SendMessage function".
-
Поясните...
Я запускаю нотепад, пишу там текст.. И оно не "sent"...?
-
Меня на самом деле абсолютно не интересует WM_KEYDOWN и другие подобные сообшения. Меня интересует почему не срабатывает WM_USER + 1600 (к примеру), посланное окну Notepad. Но в хуке такого сообщения как небыло.. Или мне там надо какой-то RegisterMessage делать. Что мне для этого надо?
-
> И оно не "sent"...?
Оно sent, но не by the SendMessage function.
> почему не срабатывает WM_USER + 1600 (к примеру), посланное > окну Notepad. Но в хуке такого сообщения как небыло
Значит, на самом деле оно либо не было послано, либо послано не с пом. SendMessage, либо послано вовсе не туда куда ожидалось.
-
Спасибо. Всё работает. Просто необходимо регистрировать сообщение. Сам хук:
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.
|