![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в Hook ? [D7, WinXP]
Nikon © (2005-07-13 22:06:00)Здравствуйте, у меня следующий вопрос: в результате выполнения нижепредставленного кода при попытке нажать любую кнопку в любом приложении, за исключением приложения, которое этот хук собственно устанавливает, приложение закрывается, и появляется ошибка "Неправильный дескриптор окна". Подскажите пожалуйста где у меня ошибка и как её можно исправить?
unit Unit2;
interface
uses Windows, SysUtils;
const KF_UP_MY = $40000000;
var CurrentHook: HHook;
hstr: string;
CurFile:text;
Layout: array[0.. KL_NAMELENGTH] of char;
function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:
integer): longword; stdcall;
procedure SetupGlobalKeyBoardHook;
procedure unhook;
implementation
function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:integer): longword; stdcall;
var
i:integer;
begin
if code< 0 then
begin
result:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
if ( (lParam and KF_UP_MY ) = 0) and (wParam>=65) and (wParam<=90) then
begin
hstr:=hstr+char(wparam);
if length(hstr)=3 then
begin
if (uppercase(hstr)='WWW')and(GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil))=68748313) then
begin
LoadKeyboardLayout(StrCopy(Layout,'00000409'),KLF_ACTIVATE);
keybd_event(vk_Back, 0, 0, 0);
keybd_event(vk_Back, 0, KEYEVENTF_KEYUP, 0);
keybd_event(vk_Back, 0, 0, 0);
keybd_event(vk_Back, 0, KEYEVENTF_KEYUP, 0);
keybd_event(vk_Back, 0, 0, 0);
keybd_event(vk_Back, 0, KEYEVENTF_KEYUP, 0);
end;
hstr:=copy(hstr,2,2);
end;
end;
CallNextHookEx(CurrentHook,code,wParam,lparam);
result:=0;
end;
procedure SetupGlobalKeyBoardHook;
begin
hstr:='';
CurrentHook:=SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyBoardHook,HInstance, 0);
end;
procedure unhook;
begin
UnhookWindowshookEx(CurrentHook);
end;
end.
Eraser (2005-07-14 00:58:00) [21]Во-первых переменная var CurrentHook: HHook; не допустима в данном случае, т.к. она будет разной для каждого приложения. Советую использовать трюк с "расшареной" памятью (MMF) в нете полно примеров.