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

Вниз

Вопрос по глобальному hook.   Найти похожие ветки 

 
_BladeR   (2003-12-30 04:12) [0]

Доброго времени суток. У меня следующий вопрос, я ставлю из глобальный хук на создание окна, класс которого я знаю, но при исполнении callback функции система не может корректно создать ни одного окна, посмотрите пожалуйста.

Callback function:

function CBTProc(nCode:integer; WParam: word; LParam: LPARAM): longint; stdcall;
type
pCBT_CMD = ^CBT_CREATEWND;
var
pCMDStruct: pCBT_CMD;
begin
if nCode < 0 then
begin
Result:= CallNextHookEx(GlobalData^.mHOOK, nCode, wParam, lParam);
Exit;
end;
if nCode=HCBT_CREATEWND then
begin
New(pCMDStruct);
pCMDStruct := pCBT_CMD(lParam);
if pCMDStruct = nil then begin
MessageBox(0,"Nil pointer","Hook.dll",0);
Result := 0;
Exit;
end;
if pCMDStruct.lpcs^.lpszClass = "Winamp v1.x" then MessageBeep(0);
CallNextHookEx(GlobalData^.mHOOK, nCode, wParam, lParam);
//Release(pCMDStruct);
end;
Result := 0;
end;


Вызов из исполняемого файла:

procedure TfmWctrl.FormShow(Sender: TObject);
var
ver: string;
SetHook: procedure;
hwndWinamp: function : hwnd;
begin
@SetHook := nil;
@hwndWinamp := nil;
hDLL := LoadLibrary(PChar("hook.dll"));
if hDLL > HINSTANCE_ERROR then
begin
@SetHook:=GetProcAddress(Hdll, "SetHook");
@hwndWinamp:=GetProcAddress(Hdll, "hwndWinamp");
hWinamp := hwndWinamp;
SetHook;
end
else
begin
ShowMessage("Unable to load hook.dll");
Exit;
end;
if hWinamp <> 0 then begin
fmWctrl.sbStatus.SimpleText := "Winamp ver." + ver + " is running";
ver := InttoStr(SendMessage(hWinamp,WM_USER,0,0));
else fmWctrl.sbStatus.SimpleText := "Winamp is not running";
end;


Полный листинг DLL:
library hook;

uses
Windows,
Messages,
Sysutils;

{$R *.RES}
const
MMFName: PChar = "CBT_MMF";

type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
mHOOK: HWND;
end;

var
GlobalData: PGlobalDLLData;
MFHandle: THandle;

function hwndWinamp: hwnd;
begin
Result := FindWindow("Winamp v1.x", nil);
end;

function CBTProc(nCode:integer; WParam: word; LParam: LPARAM): longint; stdcall;
type
pCBT_CMD = ^CBT_CREATEWND;
var
pCMDStruct: pCBT_CMD;
begin
if nCode < 0 then
begin
Result:= CallNextHookEx(GlobalData^.mHOOK, nCode, wParam, lParam);
Exit;
end;
if nCode=HCBT_CREATEWND then
begin
New(pCMDStruct);
pCMDStruct := pCBT_CMD(lParam);
if pCMDStruct = nil then begin
MessageBox(0,"Nil pointer","Hook.dll",0);
Result := 0;
Exit;
end;
if pCMDStruct.lpcs^.lpszClass = "Winamp v1.x" then MessageBeep(0);
CallNextHookEx(GlobalData^.mHOOK, nCode, wParam, lParam);
//Release(pCMDStruct);
end;
Result := 0;
end;

procedure SetHook; export;
begin
GlobalData^.mHOOK := SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
end;

procedure UnsetHook; export;
begin
UnhookWindowsHookEx( GlobalData^.mHOOK );
end;

procedure OpenGlobalData();
begin
MFHandle := CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MFHandle = 0 then raiseLastWin32Error;
GlobalData := MapViewOfFile(MFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MFHandle);
raiseLastWin32Error;
end;

end;

procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;

exports
hwndWinamp, CBTProc, SetHook, UnsetHook;
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
jonni ©   (2003-12-30 08:23) [1]

function CBTProc(nCode:integer; WParam: word; LParam: LPARAM): longint; stdcall;
type
------
end;
Result := 0;
end;

a ne dolzhno li bit":

Result:= CallNextHookEx(GlobalData^.mHOOK, nCode, wParam, lParam); ????!!!!!!!!!!!!!!
??????


 
_BladeR   (2003-12-30 19:40) [2]

Я пробовал и такой вариант, тот же результат.
И тем более в SDK сказано:

If the hook procedure returns zero, the window is created normally.

Меня честно говоря смущает вот этот момент:
if pCMDStruct.lpcs^.lpszClass = "Winamp v1.x" ...
Потому, что если его убрать - то все: ок окна создаются, но программа то не реагирует, потому как условия реагирования то нет...
и еще pCMDStruct.lpcs^.lpszClass - это PAnsiChar и каким образом привести его к PChar я не знаю.


 
Digitman ©   (2003-12-31 15:31) [3]

if stricomp(pCMDStruct.lpcs^.lpszClass, "Winamp v1.x") = 0 then
...
else
...



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

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

Наверх




Память: 0.48 MB
Время: 0.014 c
6-12471
Novenkij
2003-11-24 13:52
2004.03.05
Как узнать работает ли машина ?


3-12281
Мыш
2004-02-06 20:41
2004.03.05
удаление? записей из запроса


3-12243
Splinter
2004-02-09 15:50
2004.03.05
Объединение полей в Базе Данных


1-12440
MVova
2004-02-23 11:27
2004.03.05
Работа c UNICODE (получить польский символ)


1-12344
Mox Fulder
2004-02-22 13:14
2004.03.05
Help-file