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

Вниз

Не получается скомпилировать dll с хуком   Найти похожие ветки 

 
leonidus ©   (2006-02-16 10:19) [0]

Подскажите пожалуйта в чем может быть трабла. Пишу dll с глобальным хуком на клавиатуру, но при компиляции на строке

HookHandle:=SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);

получаю ошибку: "Left side cannot be assignet to", хотя вроде там типы переменные при присвоении соблюдены

Вот код dll:

library hook;

uses
SysUtils, Classes, Windows, Messages;

const
{пользовательские сообщения}
wm_LeftShow_Event = wm_User + 133;
wm_RightShow_Event = wm_User + 134;
wm_UpShow_Event = wm_User + 135;
wm_DownShow_Event = wm_User + 136;

{handle для ловушки}
HookHandle: hHook = 0;

var
SaveExitProc : Pointer;

{$R *.res}

{собственно ловушка}
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;stdcall; export;
var H: HWND;
begin
{если Code>=0, то ловушка может обработать событие}
if (Code >= 0) and (lParam and $40000000 = 0)
 then begin
 {ищем окно по имени класса и по заголовку
 (Caption формы управляющей программы должен быть равен "XXX" !!!!)}
 H := FindWindow("TForm1", "XXX");

 {это те клавиши?}
 Case wParam of
  VK_Left: SendMessage(H, wm_LeftShow_Event, 0, 0);
  VK_Right: SendMessage(H, wm_RightShow_Event, 0, 0);
  VK_Up: SendMessage(H, wm_UpShow_Event, 0, 0);
  VK_Down: SendMessage(H, wm_DownShow_Event, 0, 0);
 end;
 {если 0, то система должна дальше обработать это событие}
 {если 1 - нет}
 Result:=0;
end

else if Code<0 {если Code<0, то нужно вызвать следующую ловушку}
then Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;

{при выгрузке DLL надо снять ловушку}
procedure LocalExitProc; far;
begin
if HookHandle<>0
then begin
UnhookWindowsHookEx(HookHandle);
ExitProc := SaveExitProc;
end;
end;

exports Key_Hook;

begin
HookHandle:=SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);
if HookHandle = 0
then MessageBox(0, "Unable to set hook!", "Error", mb_Ok)
else
begin
 SaveExitProc := ExitProc;
 ExitProc := @LocalExitProc;
end;
end.


 
kaZaNoVa ©   (2006-02-16 10:30) [1]

HookHandle - должна быть переменной

ошибка:

>{handle для ловушки}
> HookHandle: hHook = 0;


 
leonidus ©   (2006-02-16 10:32) [2]

Все разобрался, глюканул с

HookHandle: hHook = 0;

Вместо секции var поместил это объявление в const


 
leonidus ©   (2006-02-16 10:38) [3]

А вот тогда вопрос в догонку, как бы мне из программы в dll`ку передать список кнопок на которые хук должен реагировать, что-то не соображу...


 
kaZaNoVa ©   (2006-02-16 10:46) [4]

leonidus ©   (16.02.06 10:38) [3]
я бы через MMF сделал бы ..


 
leonidus ©   (2006-02-16 10:52) [5]

А можно простой пример как мою dll-ку переделать?


 
kaZaNoVa ©   (2006-02-16 11:04) [6]



const
cMMFileName = "test_hook_dkjtfddsds";

type
PGlobalData = ^TGlobalData;
TGlobalData = packed record
  HookProcessId: DWORD;
  HookHandle: HHOOK;
  WindowHandle: THandle;
  idMsg: LongWord;
end;

var
GlobalData: PGlobalData ;
MapHandle: THandle;

procedure OpenSharedData;
var
Size: integer;
begin
Size := SizeOf(TGlobalData);
MapHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE,
    0, Size, cMMFileName);
if MapHandle = 0 then exit;
GlobalData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size);
end;

procedure CloseSharedData;
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MapHandle);
end;

//****

function ShellProc(nCode: integer; wParam: LongWord;
  lParam: LongWord): integer; stdcall;
begin
Result := 0;
if GlobalData <> nil then
  with GlobalData^ do
  begin
    if IsWindow(WindowHandle) then
      SendMessage(WindowHandle, idMsg, wParam, nCode)
    else
      DeleteHook(False);
    CallNextHookEx(HookHandle, nCode, wParam, lParam);
  end;
end;



 
leonidus ©   (2006-02-16 12:39) [7]

kaZaNoVa спасибо за пример, но простите за тупость никак не пойму как его прикрутить к моему коду?


 
kaZaNoVa ©   (2006-02-16 14:10) [8]

leonidus ©   (16.02.06 12:39) [7]
OpenSharedData - при инициализации DLL
CloseSharedData; при выгрузке

кусок кода ShellProc - пример как работать с данными (указатели)

а "основная" либо другая программа должна соответственно записать в MMF-файл данные (например с свою стуктуру-аналог GlobalData )

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


 
аноним   (2006-02-17 16:44) [9]

<offtop>
а я рад что kaZaNoVa вернулся. скучал по его постам. наконец-то!
</offtopic>



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

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

Наверх




Память: 0.49 MB
Время: 0.032 c
2-1145360784
DesperadO666
2006-04-18 15:46
2006.05.07
Помогите с CreateProcess


2-1145374069
Lk
2006-04-18 19:27
2006.05.07
Работа с файлами


1-1143728730
kyn66
2006-03-30 18:25
2006.05.07
Добавить информацию в EXE-шник


2-1145481079
Golik
2006-04-20 01:11
2006.05.07
Транзакции!


3-1142492165
thvfrjd
2006-03-16 09:56
2006.05.07
значение null поля