Форум: "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.004 c