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

Вниз

Не получается скомпилировать 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 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.488 c
2-1145508928
Nataly
2006-04-20 08:55
2006.05.07
SQL


15-1145248069
~ dancer ~
2006-04-17 08:27
2006.05.07
PhotoShop глубина цвета


8-1134157478
Kot
2005-12-09 22:44
2006.05.07
Работа с gif


11-1125762294
Wiz@rd
2005-09-03 19:44
2006.05.07
Transparent


3-1141557640
maximsms
2006-03-05 14:20
2006.05.07
Firebird 1.5. error -901, "feature is not supported"





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