Текущий архив: 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
- при инициализации DLLCloseSharedData;
при выгрузке
кусок кодаShellProc
- пример как работать с данными (указатели)
а "основная" либо другая программа должна соответственно записать в MMF-файл данные (например с свою стуктуру-аналог GlobalData )
хотя может лучше создавать и удалять MMF-файл в программе, а в Длл тока данные брать с него ... еще можно какую-нить сихронизацию прикрутить ...
← →
аноним (2006-02-17 16:44) [9]<offtop>
а я рад что kaZaNoVa вернулся. скучал по его постам. наконец-то!
</offtopic>
Страницы: 1 вся ветка
Текущий архив: 2006.05.07;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.018 c