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