Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-42451
avr555
2001-12-23 18:05
2002.01.14
Вопрос про линии


14-42550
wHammer
2001-11-16 15:29
2002.01.14
Nostalgia


1-42427
Катерина
2001-12-24 08:15
2002.01.14
помогите с отчетом


1-42425
Kevin
2001-12-26 15:38
2002.01.14
Очень срочно надо


7-42589
McSimm
2001-09-28 17:27
2002.01.14
Автоматическое определение настроек LAN для IE





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