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

Вниз

Вопрос по глобальному 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 вся ветка

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

Наверх





Память: 0.46 MB
Время: 0.006 c
4-12569
devil_dk
2003-12-16 01:46
2004.03.05
Создать виртуальный рабочий стол


14-12520
juicenman
2004-02-12 11:36
2004.03.05
распознавание тескта


1-12336
OlimPer
2004-02-21 14:36
2004.03.05
Опять ShellLIstView


1-12427
VID
2004-02-23 15:02
2004.03.05
Как узнать букву дисковода ?


3-12255
Санек
2004-02-09 13:10
2004.03.05
Доступные MS SQL сервера в сети





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