Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.5 MB
Время: 0.033 c
14-84550
Omar2002
2003-06-06 17:16
2003.06.26
Мастер кривых враз


14-84514
Leonid
2003-06-03 13:19
2003.06.26
Надо решить пару задач на Delphi - 10$


7-84808
new comer and co
2003-04-16 16:27
2003.06.26
эмуляция нажатия клавиш


7-84776
Andy
2003-04-16 11:47
2003.06.26
Сменить Volume ID


7-84771
Anonimus
2003-04-17 10:45
2003.06.26
Перезагрузка......





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