Форум: "WinAPI";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Внизи опять хук.... Найти похожие ветки
← →
shiva1 (2001-11-15 18:10) [0]Коллеги, я понимаю, что тема несколько навязла в зубах, однако я плотненько засел.
Задача у меня простая, приложение должно полностью перехватывать на себя весь ввод с клавиатуры, даже если оно скрыто под другими окнами. Естественно, первым моим телодвижением было воспользоваться примером из FAQ. Увы, при попытке запуска приложения - сообщения об ошибке. Тогда я взял пример работающей связки DLL+приложение, которая появлялась в данном форуме, и попробовал переработать. Ошибок нет, все запускается (правда, несколько медленно), но не работает. Код предоставляю...
DLL
library sendkey;
uses
WinTypes,
WinProcs,
Messages;
const
{пользовательские сообщения}
MapID="HOOK";
wm_NextShow_Event = wm_User + 133;
wm_PrevShow_Event = wm_User + 134;
{handle для ловушки}
HookHandle: hHook = 0;
type
PData = ^TData;
TData= record
AppWND : HWND;
OldHook:HHOOK
end;
var
HMap:THandle=0;
Data:Pdata = nil;
//SaveExitProc : Pointer;
procedure DLLEntryPoint(dwReason:DWORD); stdcall;
Begin
case dwReason of
DLL_PROCESS_ATTACH:
Begin
HMap:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TData), "HOOK");
Data:=MapViewOfFile(HMap, FILE_MAP_ALL_ACCESS,0,0,sizeof(TDATA))
End;
DLL_PROCESS_DETACH:
Begin
UnMapViewOfFile(Data);
CloseHandle(HMap);
End;
end
End;
{собственно ловушка}
function Key_Hook(Code: integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT; stdcall;
var
H: HWND;
begin
{если Code>=0, то ловушка может обработать событие}
if (Code in [HSHELL_WINDOWCREATED, HSHELL_WINDOWDESTROYED, HSHELL_REDRAW]) then
begin
{это те клавиши?}
if ((ParamW = VK_ADD) or (ParamW = VK_SUBTRACT)) and (ParamL and $40000000 = 0)
then
begin
{ищем окно по имени класса и по заголовку}
H := FindWindow("TForm1", "XXX");
{посылаем сообщение}
if ParamW = VK_ADD then
SendMessage(H, wm_NextShow_Event, 0, 0)
else
SendMessage(H, wm_PrevShow_Event, 0, 0);
end;
{если 0, то система должна дальше обработать это событие}
{если 1 - нет}
end;
{если Code<0, то нужно вызвать следующую ловушку}
Result := CallNextHookEx(Data^.OldHook, Code, ParamW, ParamL);
end;
{при выгрузке DLL надо снять ловушку}
//procedure LocalExitProc; far;
//begin
// if HookHandle<>0 then
// begin
// UnhookWindowsHookEx(HookHandle);
// ExitProc := SaveExitProc;
// end;
// end;
function SetShellHook(Wnd:HWND): BOOL; stdcall;
begin
if DATA<>nil Then
begin
Data^.AppWnd:=Wnd;
Data^.OldHook:=SetWindowsHookEx(WH_SHELL, @Key_Hook, HInstance, 0);
Result:=Data^.OldHook <> 0
end
else Result:=False;
end;
function RemoveShellHook: BOOL; stdcall;
begin
Result:=UnhookWindowsHookEx(Data^.OldHook);
end;
exports
SetShellHook,
RemoveShellHook;
{инициализация DLL при загрузке ее в память}
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;}
if DLLProc=nil Then
DllProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c