Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Вниз

Какой нужен код в процедуре обработке 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
11-13106
GROL
2002-09-14 00:09
2003.06.05
Размер Еxe увеличился


14-13420
Vlad Oshin
2003-05-19 12:28
2003.06.05
оцените навскидку ноутбук, чтоб мне отвязаться :), пожалуст


14-13405
Nikos
2003-05-16 13:42
2003.06.05
как создать дистрибутив


1-13317
Nikos
2003-05-25 11:50
2003.06.05
Вопрос о TPrinter


6-13363
push
2003-04-04 16:24
2003.06.05
прокси на HTTP, SOCKS4, POP3, SMTP





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