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

Вниз

Проблема с HOOK N2.Как перехватить?   Найти похожие ветки 

 
sucer   (2003-04-22 10:09) [0]

нужно чтобы:
"Нажимаю на форме минимизировать HOOK пишет "Нажато минимизировать" и форма не минимизируется"
Когда нажмимаю на форме(в моем примере "SPO") крестик(закрыть),минимизировать,изменить размер и также
когда форма становится активной нужно чтобы HOOK ловил эти сообщения и не давал отправить их программе.

Я уже написал HOOK который ловит эти сообщения.HOOK ставлю на конкретнкю программу "SPO".Но как сделать чтобы
он их недал передать в программу?
И как сделать чтобы ловил "Минимизировать"?
Вот код моего HOOK:
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;
var a:CWPSTRUCT;
begin
{if CWPSTRUCT(Pointer(lParam)^).message=WM_ACTIVATE then
begin
MessageBox(0, "ACTIVATE", "Message", 0);
end;}
if CWPSTRUCT(Pointer(lParam)^).message = WM_CLOSE then
MessageBox(0, "CLOSE", "Message", 0);
if CWPSTRUCT(Pointer(lParam)^).message= WM_SIZE then
MessageBox(0, "SIZE", "Message", 0);
if CWPSTRUCT(Pointer(lParam)^).message= WM_SYSCOMmAND then
BEGIN
if CWPSTRUCT(Pointer(lParam)^).wparam=SC_MINIMIZE then
MessageBox(0, "Minimized", "Message", 0);
end;

{-------------------------------------}
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.


 
Cobalt   (2003-04-22 14:28) [1]

Изменяй WParam и LParam. Вот так, кажись, точно не уверен, глянь в справке.


 
Nikolai   (2003-04-22 16:12) [2]

Случай с WH_CALLWNDPROC вообще тебе не подходит (там только мониторинг разрешен, все изменения игнорируются), а через WH_GETMESSAGE ты не все отловишь
Для твоего случая надо, на мой взгляд, использовать WH_CBT. Соответствующие изменения:

GlobalData^.SysHook := SetWindowsHookEx(WH_CBT, @SysCBTProc, HInstance, dwProcessId);

function SysCBTProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code in [HCBT_MOVESIZE, HCBT_ACTIVATE, HCBT_MINMAX] then Result := 1
else Result := 0;
end;



 
sucer   (2003-04-23 08:31) [3]

Спасибо!Работает!



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

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

Наверх




Память: 0.46 MB
Время: 0.027 c
14-84562
Dmit
2003-06-07 04:35
2003.06.26
хостинг


1-84321
AndrewR
2003-06-16 06:28
2003.06.26
Как можно вызвать FindDialog, что бы в Memo текст искал. Может ке


1-84154
Солер
2003-06-11 11:35
2003.06.26
Как расчитать дату


1-84088
Пит
2003-06-10 13:16
2003.06.26
Функция cos() в Delphi.


9-83837
Vin
2003-01-12 15:04
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский