Форум: "WinAPI";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизПроблема с HOOK Найти похожие ветки
← →
sucer (2003-04-17 17:12) [0]Я уже несколько недель мучуюсь с проблемой:
Пытаюсь поставить HOOK на окно отдельной програмы.Написал устанвщик HOOK,DLL HOOK и программу на которую пытаюсь поставить HOOK.
Так вот необходимо чтобы HOOK ловил сообщения ,когда окно прораммы пытается максимизироваться,Cвернуться,Стать активным(Получить фокус) и не давал их отправить в процедуру обработки в программе(Не давал свернуться,Стать активным и.т.п).
Есть примеры клавиатурных HOOK-oв.Я пытался с помощью них постороить свой,но польностью
рабочего кода не получилось(ОН КОМПИЛИРУЕТСЯ НО НЕ ЛОВИТ СООБЩЕНИЯ).Я учел замечания в "Статьи" Алексея Павлова о работе с хуками и устранил баги в свой проге.
ВООБЩЕМ ВСЕ ВРОДЕ ПО ТЕОРИИ ДОЛЖНО РАБОТАТЬ НО почему то неработает:)
По этому адресу
http://www.hookproblem2.narod.ru/hookproblem2v2.exe
(около 120 KB)
расположены все исходники мой проблемы.
------------------------------
ЛЮДИ ПОМОГИТЕ ИСПРАВИТЬ КОД!!
------------------------------
ПОМОГИТЕ КТО МОЖЕТ!!!!!!!!!
------------------------------
Овет можете отравить на e-mail:hookproblem2@yandex.ru или на форум.
КОД DLL(он есть в архиве):
library hook_dll1;
uses
Windows,
Messages,
Forms;
const
MMFName: PChar = "MyMMF";
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND;
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if TMsg(Pointer(lParam)^).message = WM_CLOSE then
MessageBox(0, "CLOSE", "Message", 0);
if TMsg(Pointer(lParam)^).message = WM_SYSCOMMAND then
MessageBox(0, "SYSCMMAND", "Message", 0);
if TMsg(Pointer(lParam)^).message = WM_COMMAND then
MessageBox(0, "COMMAND", "Message", 0);
if TMsg(Pointer(lParam)^).message = WM_SIZE then
MessageBox(0, "SIZE", "Message", 0);
if code = HC_ACTION then
begin
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
MessageBox(0, "HOOK1 working !", "Message from Exampel2/Process1", 0);
end;
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end;
procedure hook(switch : Boolean) export; stdcall;
var hh:hWnd;
dwProcessId:LongInt;
begin
if switch=true then
begin
hh:=FindWindow("TFrmMain","SPO");
if hh=0 then
begin
MessageBox(0, "No Window", "Error:", 0);
Exit;
end;
dwProcessId:=GetWindowThreadProcessId(hh, nil);
GlobalData^.SysHook := SetWindowsHookEx(WH_CALLWNDPROC{WH_GETMESSAGE}, @SysMsgProc, HInstance,dwProcessId);
if GlobalData^.SysHook <> 0 then
MessageBox(0, "HOOK1 install !", "Message", 0)
else
MessageBox(0, "HOOK1 cannot install !", "Message", 0);
end
else
begin
if UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, "HOOK1 disable!", "Message from Exampel2/Process1", 0)
else
MessageBox(0, "HOOK1 cannot disable!", "Message from Exampel2/Process1", 0);
end;
end;
procedure OpenGlobalData();
begin
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0 then
MessageBox(0, "Can""t create FileMapping", "Message from Exampel2/Process1", 0);
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
MessageBox(0, "Can""t make MapViewOfFile", "Message from Exampel2/Process1", 0);
end;
end;
procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;
procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports hook;
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
← →
sucer (2003-04-17 17:26) [1]Пардон,
www.hookproblem2.narod.ru/hookproblem2v2.exe
http -неработает
← →
sucer (2003-04-17 17:26) [2]Пардон,
www.hookproblem2.narod.ru/hookproblem2v2.exe
http -не работает
← →
neodiX (2003-04-17 17:34) [3]Как я понял тебе не надо передавать dwProcessId в SetWindowsHookEx, попробуй вставить 0. Я вставил у меня сразу сработал хук на WM_SIZE, но потом хук отрубился. Ну вообщем смотри дальше сам, тебе виднее.
← →
Nikolai (2003-04-18 10:47) [4]1. Зачем для хранения SysHook используешь общую область памяти: она же будет заменять содержимое при каждой новой установке ловушки.
2. Почему так:
SetWindowsHookEx(WH_CALLWNDPROC{WH_GETMESSAGE}, @SysMsgProc, HInstance,dwProcessId);
2 последних параметра очевидно что-то не то:
hMod
Identifies the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
dwThreadId
Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads.
На ск-ко я понял тебе надо ловушку только на текущий процесс установить, поэтому напиши как советовали ранее (dwThreadId=0).
← →
sucer (2003-04-18 17:09) [5]"...на текущий процесс установить.." в смыле на текущий?
Мне надо установить на окно запущеной программы "SPO" програмой установщиком.
А если dwThreadId=0 то HOOK ставится на все процессы!!!???
а мне на конкретный.
← →
Diamond Cat (2003-04-18 22:47) [6]ну вопервых
А зачем для перехвата этих сообщений пользоваться ловушкой, если можно обрабатывать все эти сообщения непосредственно в прогамме,
во вторых
Если я не ошибаюсь то к примеру сообщение wm_*button* и не должны обрабатываться хуком на WH_CALLWNDPROC
в третьих в setwindowshookex не надо ставить указатель (@) на функцию обработки, непосредственно имя функции
← →
sucer (2003-04-19 07:49) [7]"А зачем для перехвата этих сообщений пользоваться ловушкой, если можно обрабатывать все эти сообщения непосредственно в прогамме, "
Я учусь на этой программе,потом я поставлю на exe-ник,a у меня нет его исходников.
← →
Cobalt (2003-04-19 09:24) [8]2 sucer
Нифига, хук у тебя устанавливается, и ты узнал бы об этом, написав
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
MessageBox(0,"Work","",0);
← →
sucer (2003-04-19 17:48) [9]HOOK устанваливаетя я так сначало и делал для проверки но не
ловит то что нужно!
← →
Diamond Cat (2003-04-19 20:51) [10]
не ловит то что нужно!
может всетаки почитать хелп по хукам, и выбрать другой тип хука
← →
sucer (2003-04-20 08:59) [11]Я выбирал WH_CALLWNDPROC/WH_GETMESSAGE а другие вообще в этом
роде нечего неловят
← →
Eug201 (2003-04-20 09:52) [12]Ку-ку. Не могу скачать твои исходники.
← →
sucer (2003-04-20 17:57) [13]Eug201:Я тлько что сам скачал.Незнаю в чем у тебя проблема
Скинь на мыло hookproblem2@yandex.ru свое мыло я тебе их вышлю(около 120KB)
← →
sucer (2003-04-20 18:05) [14]Ух.еее.ный этот Яндекс удалил мое мыло и сраницу из-за того что
каких-то ссылок на вашей странице нет на этот адресс
---------------------------------------
Вот рабочее мыло скидывайте сюда hookproblem2a@yandex.ru
-----------------------------------------
← →
Cobalt (2003-04-21 11:19) [15]Записывай значения того, что у тебя передается в хук (думаю, надо отлаживать хук, приаттачив к "SPO", а не к программе установки хука)
← →
Nikolai (2003-04-21 12:17) [16]>А если dwThreadId=0 то HOOK ставится на все процессы!!!???
Согласен, извиняюсь.
Странно!
Взял твой код с форума, у меня для WH_GETMESSAGE все заработало (я только к другому exe ловушку приделываю, т.е. все кроме FindWindow то же самое, ну и проектируемый в память файл убрал)...
попробую WH_CALLWNDPROC...
← →
Nikolai (2003-04-21 12:57) [17]попробовал WH_CALLWNDPROC: ловит.
странно...
> не ловит то что нужно
для WH_CALLWNDPROC использовал:
CWPSTRUCT(Pointer(lParam)^).message?
← →
sucer (2003-04-22 10:06) [18]NIkolai спасибо!Заработало!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.026 c