Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.05;
Скачать: CL | DM;

Вниз

Какой нужен код в процедуре обработке HOOK для отлова MAXIMIZE   Найти похожие ветки 

 
sucer   (2003-04-02 17:58) [0]


Какой нужен код в процедуре обработке HOOK(утановленой на
другую кокретную программу), для того чтобы поимать сообщение получения фокуса,MAXIMINZE,MINIMIZE.

только не через WM_MAXIMIZE-эту константу DELPHI не знает.


 
Юрий Зотов ©   (2003-04-03 01:32) [1]

> WM_MAXIMIZE-эту константу DELPHI не знает.
Ее вообще никто не знает. Потому что ее не существует.

WH_CALLWNDPROC(RET).

WM_SETFOCUS
WM_SYSCOMMAND: SC_MAXIMIZE/MINIMIZE
(вариант - WM_SIZE: SIZE_MAXIMIZED/MINIMIZED).


 
sucer   (2003-04-03 04:36) [2]

НАПОМИНАЮ,МНЕ НУЖНО РЕШИТЬ ЗАДАЧУ:МНЕ НУЖНО ЧТОБЫ HOOK ловил сообщения когда окно
некоторой програмы пытается максимизироваться,Cвернуться,Получить фокус и не давал их отправить в процедуру обработки в программе.

hook стоит на WH_GETMESSAGE.
код HOOK у меня такой:
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
BEGIN
if code<0 then
begin
result:=CallNextHookEx(SysHook, Code, wParam, lParam);
exit;
end
else if(code=0)then
begin
Result:=0;
case TMsg(Pointer(lParam)^).message of
WM_SETFOCUS :
begin
MessageBox(0, "HOOK1 working !", "Message", 0);
end;
WM_SIZE:
begin
MessageBox(0, "HOOK2 working !", "Message", 0);
end;
WM_SYSCOMMAND:
begin
MessageBox(0, "SYSTEM COMMAND!", "Message", 0);
end;
end;{Case}
end;
------------------
Попробывал WM_SYSCOMAND.
Установил HOOK.Написал другую программу и послал той программе на
которой установлен Hook[SendMessage(hh,WM_SYSCOMMAND,0,0)
->WM_SYSCOMMAND несработал.И когда я нажал значек свернуть
она тоже не сработала.А вот когда я шелкнул на панели задач то HOOK поймал сообщение.WM_SIZE-тоже не работает.
Как сделать чтобы она ловила,
И как сделать чтобы она ловила сообщение и в
зависимости какое-собщение пришло решала отправлять
его в программу или нет?


 
Юрий Зотов ©   (2003-04-03 22:25) [3]

1. > НАПОМИНАЮ, МНЕ НУЖНО РЕШИТЬ ЗАДАЧУ:МНЕ НУЖНО ЧТОБЫ...
А как насчет быть повежливее? Вам тут никто ничего не обязан. Раз ВАМ нужно - вот ВЫ и решайте.


2. > и не давал их отправить в процедуру обработки в программе.
Перечитайте свой же вопрос и найдите то место, где Вы говорили о БЛОКИРОВКЕ сообщений. Только ищите внимательнее, а то не найдете.


3. > hook стоит на WH_GETMESSAGE
> послал ... SendMessage(hh,WM_SYSCOMMAND,0,0)

А если внимательно почитать хелп, то можно с удивлением обнаружить, что хуки типа WH_GETMESSAGE срабатывают на выборку сообщений из ОЧЕРЕДИ, в то время как SendMessage туда их не помещает.


 
sucer   (2003-04-04 06:59) [4]

Sorry Юрий Зотов.
Да я сначала неправильно сформулировал вопрос.
----------------
Поставил Hook на WH_CALLWNDPROC серавно не работает.
Что нужно сделать чобы блокировка работала?



 
Юрий Зотов ©   (2003-04-04 13:37) [5]

Приведите код установки ловушки и полный код DLL.


 
sucer   (2003-04-04 15:34) [6]

КОД У МЕНЯ ТАКОЙ:

library hook_dll1;

uses
Windows,
Messages,
Forms;

var
SysHook : HHook = 0;
Wnd : Hwnd = 0;

{-процедура обработки HOOK-}
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
{-эти условия для надежности.Хотя их по идее надобыло ставить если сode=0-}
if TMsg(Pointer(lParam)^).message = WM_CLOSE then
MessageBox(0, "SYSCMMAND", "Message from Exampel2/Process2", 0);
if TMsg(Pointer(lParam)^).message = WM_SYSCOMMAND then
MessageBox(0, "SYSCMMAND", "Message from Exampel2/Process2", 0);
if TMsg(Pointer(lParam)^).message = WM_COMMAND then
MessageBox(0, "COMMAND", "Message from Exampel2/Process2", 0);
if TMsg(Pointer(lParam)^).message = WM_SIZE then
MessageBox(0, "SIZE", "Message from Exampel2/Process2", 0);
if code<0 then
begin
result:=CallNextHookEx(SysHook, Code, wParam, lParam);
exit;
end
else if(code=0)then
begin
Result:=0;
case TMsg(Pointer(lParam)^).message of
WM_SETFOCUS :
begin
MessageBox(0, "HOOK1 working !", "Message from Exampel1/Process1", 0);
end;
WM_SIZE:
begin
MessageBox(0, "HOOK2 working !", "Message from Exampel1/Process1", 0);
end;
WM_SYSCOMMAND:
begin
MessageBox(0, "SYSTEM COMMAND!", "Message from Exampel1/Process1", 0);
end;
end;{Case}
end;
end;
{------------------------------------------------}
{утстановка HOOK}
procedure hook(switch : Boolean) export; stdcall;
var hh:LongInt;
dwProcessId : dword;
s:string;
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);
SysHook := SetWindowsHookEx(WH_CALLWNDPROC{WH_GETMESSAGE}, @SysMsgProc, HInstance,dwProcessId);
//if SysHook=0 then RaiseLastWin32Error;
if SysHook <> 0 then
MessageBox(0, "HOOK1 install!", "Message from Exampel1/Process1", 0)
else
MessageBox(0, "HOOK1 can"t install", "Message from Exampel1/Process1", 0);

end
else
begin
if UnhookWindowsHookEx(SysHook) then
MessageBox(0, "HOOK1 disable !", "Message from Exampel1/Process1", 0)
else
MessageBox(0, "HOOK1 can"t disable !", "Message from Exampel1/Process1", 0);
SysHook := 0;
end;
exports hook;

begin
{_}
end.
соответсвено код установки HOOK(в программе):
@hook:= nil;
Hdll:= LoadLibrary(PChar("hook_dll1.dll")); { ???????? DLL }
if Hdll > HINSTANCE_ERROR then
begin
@hook:=GetProcAddress(Hdll, "hook");
Button2.Enabled:=True;
Button1.Enabled:=False;
hook(true);
end
else
ShowMessage("Error loading DLL !");

Как делать саму блокировку не знаю(подскажите),поэтому я только для начала пытался отловить сообщения.


 
Юрий Зотов ©   (2003-04-05 07:56) [7]

Дружище, хотелось бы все же видеть ДЕЙСТВИТЕЛЬНЫЙ код (иначе нет смысла тратить время на разбор неизвестно чего). Потому что суррогат, который Вы привели, работать точно не будет и даже вряд ли скомпилируется (хотя бы из-за синтаксических ошибок с апострофами внутри строк). А уж потом есть смысл говорить о блокировках и прочем.


 
sucer   (2003-04-05 10:05) [8]


Помогите кто может!!!!!!!
Все исходники(программа на которую дожен ставится HOOK,DLL HOOK-a и программа-установшик HOOK) на:
SFXархив:
http://www.hookproblem2.narod.ru/hookproblem2.exe(окола 220KB)
или просто архив запакованый WINRAR 3.0:
http://www.hookproblem2.narod.ru/hookproblem2.rar(около 180KB)


 
sucer   (2003-04-07 09:22) [9]

Помогите подправить исходники!!


 
Юрий Зотов ©   (2003-04-07 10:30) [10]

Начните вот с чего.

Код DLL (см. выше) неверен принципиально. Переменные SysHook и Wnd получат правильные значения ТОЛЬКО в контексте процесса, вызывающего процедуру Hook, а в контексте процесса с окном "SPO" они останутся нулями. Поэтому в его контексте ловушка и сама работать не сможет, и вызвать CallNextHookEx тоже.

На этом сайте в разделе "Статьи" есть статья Алексея Павлова о работе с хуками. Начните с нее.


 
sucer   (2003-04-07 18:06) [11]

Да,я сейчас прочитал статью и справил баг.Но!!! этот баг влият только на передачу дальнейших сообщений от Hook.HOOK по прежнему не ловит то что нужно.Он вообще как-ой то сранный
когда ставлю WH_GETMESSAGE - он хотябы ловит WM_SYSCOMMAND(при рпзаорачивание с таск бара),а на WH_CALLWNDPROC(а мне на это и нужно) он вообще нечего не ловит!
Да и причем сдесь Wnd - его вообще хранить не надо?

SFXархив:
http://www.hookproblem2.narod.ru/hookproblem2v2.exe



Страницы: 1 вся ветка

Текущий архив: 2003.06.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
3-13058
noteens
2003-05-15 19:40
2003.06.05
TDBGrid


3-13038
bobr12
2003-05-16 15:29
2003.06.05
Как проверить, правильная ли введена дата?


3-13060
BackStabber
2003-05-16 16:32
2003.06.05
Восстановление базы InterBase


3-13091
Grey_g
2003-05-15 09:48
2003.06.05
Активная запись


14-13375
Колян
2003-05-21 09:10
2003.06.05
Использование SetTimer